@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/.jsii +54846 -26661
  2. package/API.md +72091 -23784
  3. package/lib/azure-actiongroup/index.d.ts +0 -10
  4. package/lib/azure-actiongroup/index.js +1 -11
  5. package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
  6. package/lib/azure-actiongroup/lib/action-group.js +6 -32
  7. package/lib/azure-actiongroup/lib/index.d.ts +1 -4
  8. package/lib/azure-actiongroup/lib/index.js +2 -5
  9. package/lib/azure-activitylogalert/index.d.ts +0 -10
  10. package/lib/azure-activitylogalert/index.js +1 -11
  11. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
  12. package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
  13. package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
  14. package/lib/azure-activitylogalert/lib/index.js +2 -5
  15. package/lib/azure-aks/index.d.ts +0 -8
  16. package/lib/azure-aks/index.js +1 -11
  17. package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
  18. package/lib/azure-aks/lib/aks-cluster.js +13 -36
  19. package/lib/azure-aks/lib/index.d.ts +1 -10
  20. package/lib/azure-aks/lib/index.js +2 -21
  21. package/lib/azure-diagnosticsettings/index.d.ts +0 -6
  22. package/lib/azure-diagnosticsettings/index.js +1 -7
  23. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
  24. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
  25. package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
  26. package/lib/azure-diagnosticsettings/lib/index.js +2 -8
  27. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  28. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  29. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  30. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  31. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  32. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  33. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  34. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  35. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  36. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  37. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  38. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  39. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  40. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  41. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  42. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  43. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  44. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  45. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  46. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  47. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  48. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  49. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  50. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  51. package/lib/azure-dnsresolver/index.d.ts +1 -0
  52. package/lib/azure-dnsresolver/index.js +18 -0
  53. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  54. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  55. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  56. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  57. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  58. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  59. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  60. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  61. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  62. package/lib/azure-dnsresolver/lib/index.js +23 -0
  63. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  64. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  65. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  66. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  67. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  68. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  69. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  70. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  71. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  72. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  73. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  74. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  75. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  76. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  77. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  78. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  79. package/lib/azure-dnszone/index.d.ts +1 -0
  80. package/lib/azure-dnszone/index.js +18 -0
  81. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  82. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  83. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  84. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  85. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  86. package/lib/azure-dnszone/lib/index.js +19 -0
  87. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  88. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  89. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  90. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  91. package/lib/azure-metricalert/index.d.ts +0 -10
  92. package/lib/azure-metricalert/index.js +1 -11
  93. package/lib/azure-metricalert/lib/index.d.ts +1 -4
  94. package/lib/azure-metricalert/lib/index.js +2 -5
  95. package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
  96. package/lib/azure-metricalert/lib/metric-alert.js +6 -32
  97. package/lib/azure-networkinterface/index.d.ts +0 -3
  98. package/lib/azure-networkinterface/index.js +1 -4
  99. package/lib/azure-networkinterface/lib/index.d.ts +1 -5
  100. package/lib/azure-networkinterface/lib/index.js +2 -5
  101. package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
  102. package/lib/azure-networkinterface/lib/network-interface.js +14 -29
  103. package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
  104. package/lib/azure-networksecuritygroup/index.d.ts +0 -5
  105. package/lib/azure-networksecuritygroup/index.js +1 -6
  106. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
  107. package/lib/azure-networksecuritygroup/lib/index.js +17 -14
  108. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
  109. package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
  110. package/lib/azure-policyassignment/index.d.ts +1 -0
  111. package/lib/azure-policyassignment/index.js +18 -0
  112. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  113. package/lib/azure-policyassignment/lib/index.js +19 -0
  114. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  115. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  116. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
  117. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
  118. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  119. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  120. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  121. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  122. package/lib/azure-policydefinition/index.d.ts +1 -0
  123. package/lib/azure-policydefinition/index.js +18 -0
  124. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  125. package/lib/azure-policydefinition/lib/index.js +19 -0
  126. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  127. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  128. package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
  129. package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
  130. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  131. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  132. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  133. package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
  134. package/lib/azure-privatednszone/index.d.ts +1 -0
  135. package/lib/azure-privatednszone/index.js +18 -0
  136. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  137. package/lib/azure-privatednszone/lib/index.js +19 -0
  138. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  139. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  140. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  141. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  142. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  143. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  144. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  145. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  146. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  147. package/lib/azure-privatednszonelink/index.js +18 -0
  148. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  149. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  150. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  151. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  152. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  153. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  154. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  155. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  156. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  157. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  158. package/lib/azure-publicipaddress/index.d.ts +0 -5
  159. package/lib/azure-publicipaddress/index.js +1 -6
  160. package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
  161. package/lib/azure-publicipaddress/lib/index.js +17 -17
  162. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
  163. package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
  164. package/lib/azure-resourcegroup/index.d.ts +0 -37
  165. package/lib/azure-resourcegroup/index.js +1 -39
  166. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  167. package/lib/azure-resourcegroup/lib/index.js +2 -43
  168. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  169. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  170. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  171. package/lib/azure-roleassignment/index.d.ts +1 -0
  172. package/lib/azure-roleassignment/index.js +18 -0
  173. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  174. package/lib/azure-roleassignment/lib/index.js +19 -0
  175. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  176. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  177. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  178. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  179. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  180. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  181. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  182. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  183. package/lib/azure-roledefinition/index.d.ts +1 -0
  184. package/lib/azure-roledefinition/index.js +18 -0
  185. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  186. package/lib/azure-roledefinition/lib/index.js +19 -0
  187. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  188. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  189. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  190. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  191. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  192. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  193. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  194. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  195. package/lib/azure-storageaccount/index.d.ts +0 -19
  196. package/lib/azure-storageaccount/index.js +1 -20
  197. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  198. package/lib/azure-storageaccount/lib/index.js +2 -8
  199. package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
  200. package/lib/azure-storageaccount/lib/storage-account.js +15 -29
  201. package/lib/azure-subnet/index.d.ts +0 -3
  202. package/lib/azure-subnet/index.js +1 -4
  203. package/lib/azure-subnet/lib/index.d.ts +1 -4
  204. package/lib/azure-subnet/lib/index.js +2 -5
  205. package/lib/azure-subnet/lib/subnet.d.ts +3 -14
  206. package/lib/azure-subnet/lib/subnet.js +28 -47
  207. package/lib/azure-subnet/test/subnet.integ.js +19 -7
  208. package/lib/azure-subnet/test/subnet.spec.js +1 -2
  209. package/lib/azure-virtualmachine/index.d.ts +0 -6
  210. package/lib/azure-virtualmachine/index.js +1 -7
  211. package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
  212. package/lib/azure-virtualmachine/lib/index.js +2 -21
  213. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
  214. package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
  215. package/lib/azure-virtualnetwork/index.d.ts +0 -9
  216. package/lib/azure-virtualnetwork/index.js +1 -11
  217. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
  218. package/lib/azure-virtualnetwork/lib/index.js +17 -20
  219. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
  220. package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
  221. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  222. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  223. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  224. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  225. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  226. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  227. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  228. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  229. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  230. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  231. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  232. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  233. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  234. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  235. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  236. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  237. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  238. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  239. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  240. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  241. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  242. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  243. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  244. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  245. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  246. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  247. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  248. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  249. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  250. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  251. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  252. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  253. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  254. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  255. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  256. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  257. package/lib/azure-vmss/index.d.ts +0 -5
  258. package/lib/azure-vmss/index.js +1 -6
  259. package/lib/azure-vmss/lib/index.d.ts +0 -7
  260. package/lib/azure-vmss/lib/index.js +1 -21
  261. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
  262. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
  263. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  264. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  265. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +178 -26
  266. package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
  267. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  268. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  269. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  270. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +5 -3
  271. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  272. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  273. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  274. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  275. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  276. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  277. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  278. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
  279. package/lib/core-azure/lib/index.d.ts +2 -2
  280. package/lib/core-azure/lib/index.js +5 -5
  281. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  282. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  283. package/lib/index.d.ts +19 -0
  284. package/lib/index.js +21 -2
  285. package/lib/testing/index.js +2 -2
  286. package/lib/testing/lib/cleanup.d.ts +1 -0
  287. package/lib/testing/lib/cleanup.js +19 -12
  288. package/lib/testing/lib/metadata.js +19 -16
  289. package/package.json +1 -1
  290. package/scripts/cleanup-test-resources.ts +22 -4
  291. package/scripts/generate-index.js +25 -8
@@ -27,9 +27,9 @@ const cdktf = require("cdktf");
27
27
  const constructs_1 = require("constructs");
28
28
  const data_azapi_client_config_1 = require("./providers-azapi/data-azapi-client-config");
29
29
  const resource_1 = require("./providers-azapi/resource");
30
- const schema_mapper_1 = require("./schema-mapper/schema-mapper");
30
+ const resource_schema_validator_1 = require("./resource-schema-validator");
31
+ const resource_version_manager_1 = require("./resource-version-manager");
31
32
  const api_version_manager_1 = require("../version-manager/api-version-manager");
32
- const version_interfaces_1 = require("../version-manager/interfaces/version-interfaces");
33
33
  /**
34
34
  * Abstract base class for version-aware Azure resource management
35
35
  *
@@ -77,6 +77,37 @@ const version_interfaces_1 = require("../version-manager/interfaces/version-inte
77
77
  * @stability stable
78
78
  */
79
79
  class AzapiResource extends constructs_1.Construct {
80
+ /**
81
+ * Static helper for child classes to register their schemas in static initializers
82
+ *
83
+ * This method should be called in a static initializer block of each child class
84
+ * to register all supported API versions and their schemas with the ApiVersionManager.
85
+ * The static block runs once when the class is first loaded, ensuring schemas are
86
+ * registered before any instances are created.
87
+ *
88
+ * @param resourceType - The Azure resource type (e.g., "Microsoft.Network/virtualNetworks")
89
+ * @param versions - Array of version configurations containing schemas
90
+ *
91
+ * @example
92
+ * static {
93
+ * AzapiResource.registerSchemas(
94
+ * "Microsoft.Network/virtualNetworks",
95
+ * ALL_VIRTUAL_NETWORK_VERSIONS
96
+ * );
97
+ * }
98
+ */
99
+ static registerSchemas(resourceType, versions) {
100
+ api_version_manager_1.ApiVersionManager.instance().registerResourceType(resourceType, versions);
101
+ }
102
+ /**
103
+ * The Azure resource ID
104
+ *
105
+ * This property is automatically derived from the underlying Terraform resource.
106
+ * Child classes no longer need to implement this property.
107
+ */
108
+ get id() {
109
+ return `\${${this.terraformResource.fqn}.id}`;
110
+ }
80
111
  /**
81
112
  * Creates a new AzapiResource instance
82
113
  *
@@ -95,50 +126,141 @@ class AzapiResource extends constructs_1.Construct {
95
126
  this.monitoringActionGroups = [];
96
127
  this.monitoringMetricAlerts = [];
97
128
  this.monitoringActivityLogAlerts = [];
98
- // Initialize basic properties
99
- this.name = props.name || this.node.id;
100
- this.location = props.location || "eastus";
129
+ // Initialize basic properties that don't require abstract methods
130
+ // Use props.name if provided, otherwise fall back to construct ID
131
+ // This supports both explicit naming and automatic ID-based naming
132
+ this.name = this.resolveName(props);
133
+ this.location = this.resolveLocation(props);
101
134
  // Initialize the API version manager
102
135
  this._apiVersionManager = api_version_manager_1.ApiVersionManager.instance();
103
- // Step 1: Resolve the API version to use
104
- this.resolvedApiVersion = this._resolveApiVersion(props.apiVersion);
105
- // Step 2: Set required abstract properties for AzapiResource
136
+ // Initialize tags storage with empty object (will be populated in initialize())
137
+ this._tags = {};
138
+ // Note: We cannot initialize version manager here because it requires
139
+ // calling abstract methods (resourceType() and defaultVersion())
140
+ // which are not yet available in the base constructor.
141
+ // Version resolution is deferred to initialize() method.
142
+ // Step 1: Resolve the API version to use (doesn't call abstract methods yet)
143
+ // This is a placeholder that will be properly set in initialize()
144
+ this.resolvedApiVersion = props.apiVersion || "";
145
+ this.apiVersion = this.resolvedApiVersion;
146
+ // Step 2: Call initialize() to complete initialization after child class is ready
147
+ this.initialize(props);
148
+ }
149
+ /**
150
+ * Protected initialization method called after the constructor completes
151
+ *
152
+ * This method is called at the end of the constructor to perform initialization
153
+ * that requires calling abstract methods. Child classes can override this method
154
+ * if they need to extend initialization logic, but they MUST call super.initialize(props).
155
+ *
156
+ * @param props - Configuration properties for the resource
157
+ */
158
+ initialize(props) {
159
+ // Step 2: Set required abstract properties (now safe to call abstract methods)
106
160
  this._resourceType = this.resourceType();
161
+ // Step 3: Initialize the version manager and resolve the API version
162
+ this._versionManager = new resource_version_manager_1.ResourceVersionManager(this._resourceType, this.defaultVersion());
163
+ this.resolvedApiVersion = this._versionManager.resolveApiVersion(props.apiVersion);
107
164
  this.apiVersion = this.resolvedApiVersion;
108
- // Step 3: Load the schema and version configuration
109
- this.schema = this.apiSchema();
110
- const versionConfig = this._apiVersionManager.versionConfig(this._resourceType, this.resolvedApiVersion);
165
+ // Step 3.5: Initialize tags from props
166
+ // This creates a mutable copy separate from the readonly props
167
+ this._tags = { ...(props.tags || {}) };
168
+ // Step 4: Load the schema and version configuration using the version manager
169
+ this.schema = this._versionManager.schemaForVersion(this.resolvedApiVersion);
170
+ const versionConfig = this._versionManager.versionConfig(this.resolvedApiVersion);
111
171
  if (!versionConfig) {
112
172
  throw new Error(`Version configuration not found for ${this.resourceType()}@${this.resolvedApiVersion}. ` +
113
173
  `Please ensure the version is registered with the ApiVersionManager.`);
114
174
  }
115
175
  this.versionConfig = versionConfig;
116
- // Step 4: Initialize the schema mapper
117
- this._schemaMapper = schema_mapper_1.SchemaMapper.create(this.schema);
118
- // Step 5: Process properties through the framework pipeline
176
+ // Step 5: Initialize the schema validator
177
+ this._schemaValidator = new resource_schema_validator_1.ResourceSchemaValidator(this.schema);
178
+ // Step 6: Process properties through the framework pipeline
119
179
  const processedProps = this._processProperties(props);
120
- // Step 6: Perform validation if enabled
180
+ // Step 7: Perform validation if enabled
121
181
  if (props.enableValidation !== false) {
122
- this.validationResult = this._validateProperties(processedProps);
182
+ this.validationResult =
183
+ this._schemaValidator.validateProps(processedProps);
123
184
  if (!this.validationResult.valid) {
124
- throw new Error(`Property validation failed for ${this.resourceType}:\n` +
125
- this.validationResult.errors.join("\n"));
185
+ throw new Error(`Property validation failed for ${this.resourceType()}:\n` +
186
+ this._schemaValidator
187
+ .formatValidationErrors(this.validationResult)
188
+ .join("\n"));
126
189
  }
127
190
  }
128
- // Step 7: Perform migration analysis if enabled
191
+ // Step 8: Perform migration analysis if enabled
129
192
  if (props.enableMigrationAnalysis !== false) {
130
193
  this.migrationAnalysis = this._performMigrationAnalysis();
131
194
  }
132
- // Step 8: Create the Azure resource
195
+ // Step 9: Create the Azure resource
133
196
  this._createAzureResource(processedProps);
134
- // Step 9: Create monitoring resources if configured
197
+ // Step 10: Create monitoring resources if configured
135
198
  // Note: Monitoring resources are created lazily to avoid circular dependencies
136
199
  if (props.monitoring) {
137
200
  void this.createMonitoringResources(props.monitoring);
138
201
  }
139
- // Step 10: Log warnings and migration guidance
202
+ // Step 11: Log warnings and migration guidance
140
203
  this._logFrameworkMessages();
141
204
  }
205
+ /**
206
+ * Override in child classes to provide default location
207
+ * @returns Default location or undefined
208
+ */
209
+ defaultLocation() {
210
+ return undefined;
211
+ }
212
+ /**
213
+ * Override in child classes to indicate if location is required
214
+ * @returns true if location is mandatory for this resource type
215
+ */
216
+ requiresLocation() {
217
+ return false;
218
+ }
219
+ /**
220
+ * Override in child classes to specify parent resource for location inheritance
221
+ * @returns Parent resource or undefined
222
+ */
223
+ parentResourceForLocation() {
224
+ return undefined;
225
+ }
226
+ /**
227
+ * Resolves location using template method pattern
228
+ * Priority: props.location > parent location > default location > validation
229
+ */
230
+ resolveLocation(props) {
231
+ // 1. Explicit location in props
232
+ if (props.location) {
233
+ return props.location;
234
+ }
235
+ // 2. Inherit from parent resource
236
+ const parent = this.parentResourceForLocation();
237
+ if (parent && parent.location) {
238
+ return parent.location;
239
+ }
240
+ // 3. Use child class default
241
+ const defaultLoc = this.defaultLocation();
242
+ if (defaultLoc) {
243
+ return defaultLoc;
244
+ }
245
+ // 4. Validate if required
246
+ if (this.requiresLocation()) {
247
+ throw new Error(`Location is required for ${this.resourceType()} but was not provided ` +
248
+ `and could not be inherited from parent resource.`);
249
+ }
250
+ return undefined;
251
+ }
252
+ /**
253
+ * Resolves the name for this resource
254
+ *
255
+ * This method centralizes name resolution logic. By default, it uses the
256
+ * provided name or falls back to the construct ID.
257
+ *
258
+ * @param props - The resource properties
259
+ * @returns The resolved resource name
260
+ */
261
+ resolveName(props) {
262
+ return props.name || this.node.id;
263
+ }
142
264
  /**
143
265
  * Helper method for standard schema resolution
144
266
  *
@@ -166,7 +288,9 @@ class AzapiResource extends constructs_1.Construct {
166
288
  * @returns The latest available version, or undefined if none found
167
289
  */
168
290
  latestVersion() {
169
- return this._apiVersionManager.latestVersion(this.resourceType());
291
+ return this._versionManager
292
+ ? this._versionManager.latestVersion()
293
+ : this._apiVersionManager.latestVersion(this.resourceType());
170
294
  }
171
295
  /**
172
296
  * Gets all supported versions for this resource type
@@ -177,7 +301,9 @@ class AzapiResource extends constructs_1.Construct {
177
301
  * @returns Array of supported version strings, sorted by release date
178
302
  */
179
303
  supportedVersions() {
180
- return this._apiVersionManager.supportedVersions(this.resourceType());
304
+ return this._versionManager
305
+ ? this._versionManager.supportedVersions()
306
+ : this._apiVersionManager.supportedVersions(this.resourceType());
181
307
  }
182
308
  /**
183
309
  * Analyzes migration from current version to a target version
@@ -194,39 +320,18 @@ class AzapiResource extends constructs_1.Construct {
194
320
  // =============================================================================
195
321
  // PRIVATE IMPLEMENTATION METHODS
196
322
  // =============================================================================
197
- /**
198
- * Resolves the API version to use for this resource instance
199
- */
200
- _resolveApiVersion(explicitVersion) {
201
- if (explicitVersion) {
202
- // Validate that the explicit version is supported
203
- if (!this._apiVersionManager.validateVersionSupport(this.resourceType(), explicitVersion)) {
204
- const supportedVersions = this._apiVersionManager.supportedVersions(this.resourceType());
205
- throw new Error(`Unsupported API version '${explicitVersion}' for resource type '${this.resourceType()}'. ` +
206
- `Supported versions: ${supportedVersions.join(", ")}`);
207
- }
208
- return explicitVersion;
209
- }
210
- // Try to get the latest version from the manager
211
- const latestVersion = this._apiVersionManager.latestVersion(this.resourceType());
212
- if (latestVersion) {
213
- return latestVersion;
214
- }
215
- // Fall back to the default version
216
- const defaultVersion = this.defaultVersion();
217
- // Warn that we're using the default version
218
- console.warn(`No versions registered for ${this.resourceType()}. ` +
219
- `Using default version: ${defaultVersion}. ` +
220
- `Consider registering versions with ApiVersionManager for better version management.`);
221
- return defaultVersion;
222
- }
223
323
  /**
224
324
  * Processes properties through the framework pipeline
225
325
  */
226
326
  _processProperties(props) {
227
327
  let processedProps = { ...props };
228
- // Apply default values from the schema
229
- processedProps = this._schemaMapper.applyDefaults(processedProps);
328
+ // Ensure name is set before processing
329
+ // This is critical for validation to work correctly
330
+ if (!processedProps.name) {
331
+ processedProps.name = this.resolveName(props);
332
+ }
333
+ // Apply default values from the schema using the validator
334
+ processedProps = this._schemaValidator.applyDefaults(processedProps);
230
335
  // Apply property transformations if enabled
231
336
  if (props.enableTransformation !== false) {
232
337
  // For transformation, we would need a source schema, but since we're not
@@ -235,20 +340,13 @@ class AzapiResource extends constructs_1.Construct {
235
340
  }
236
341
  return processedProps;
237
342
  }
238
- /**
239
- * Validates properties against the schema
240
- */
241
- _validateProperties(props) {
242
- return this._schemaMapper.validateProperties(props);
243
- }
244
343
  /**
245
344
  * Performs migration analysis for the current version
246
345
  */
247
346
  _performMigrationAnalysis() {
248
- // Check if the current version is deprecated
249
- if (this.versionConfig.supportLevel === version_interfaces_1.VersionSupportLevel.DEPRECATED ||
250
- this.versionConfig.supportLevel === version_interfaces_1.VersionSupportLevel.SUNSET) {
251
- const latestVersion = this.latestVersion();
347
+ // Check if the current version is deprecated using the version manager
348
+ if (this._versionManager.isDeprecated(this.resolvedApiVersion)) {
349
+ const latestVersion = this._versionManager.latestVersion();
252
350
  if (latestVersion && latestVersion !== this.resolvedApiVersion) {
253
351
  return this._apiVersionManager.analyzeMigration(this.resourceType(), this.resolvedApiVersion, latestVersion);
254
352
  }
@@ -259,12 +357,74 @@ class AzapiResource extends constructs_1.Construct {
259
357
  * Creates the underlying Azure resource
260
358
  */
261
359
  _createAzureResource(props) {
360
+ // Ensure name is set in props for validation
361
+ const propsWithName = {
362
+ ...props,
363
+ name: props.name || this.resolveName(props),
364
+ };
262
365
  // Create the resource body using the subclass implementation
263
- const resourceBody = this.createResourceBody(props);
366
+ const resourceBody = this.createResourceBody(propsWithName);
264
367
  // Determine the parent ID using the overrideable method
265
- const parentId = this.resolveParentId(props);
368
+ const parentId = this.resolveParentId(propsWithName);
369
+ // Find parent AzapiResource construct if parent ID references a resource
370
+ const parentResource = this._findParentAzapiResource(parentId);
266
371
  // Create the AZAPI resource using the base class method
267
- this.terraformResource = this.createAzapiResource(resourceBody, parentId, this.name, this.location);
372
+ const resourceName = this.resolveName(props);
373
+ this.terraformResource = this.createAzapiResource(resourceBody, parentId, resourceName, this.location, parentResource, propsWithName.dependsOn, this._tags);
374
+ }
375
+ /**
376
+ * Finds the parent AzapiResource construct if the parentId references a resource
377
+ * Returns undefined if parentId is a static string or parent not found
378
+ * @private
379
+ */
380
+ _findParentAzapiResource(parentId) {
381
+ // Check if the parent is a string interpolation referencing another resource
382
+ // Pattern: ${azapi_resource.resource_name_HASH.id} or ${construct.fqn}.id
383
+ if (!parentId.includes("${")) {
384
+ return undefined; // Parent is a static string ID, not a resource reference
385
+ }
386
+ // Try to find the parent AzapiResource in the construct tree
387
+ // We need to search the entire tree to find the matching parent
388
+ const root = this._findRoot();
389
+ return this._findParentResource(root, parentId);
390
+ }
391
+ /**
392
+ * Finds the root of the construct tree
393
+ * @private
394
+ */
395
+ _findRoot() {
396
+ let current = this;
397
+ while (current.node.scope) {
398
+ current = current.node.scope;
399
+ }
400
+ return current;
401
+ }
402
+ /**
403
+ * Recursively searches for a parent resource by matching parentId patterns
404
+ * Enhanced to better handle Terraform interpolation syntax
405
+ * @private
406
+ */
407
+ _findParentResource(scope, parentId) {
408
+ // Check all children of this scope
409
+ for (const child of scope.node.children) {
410
+ if (child instanceof AzapiResource &&
411
+ child !== this &&
412
+ child.terraformResource) {
413
+ const childFqn = child.terraformResource.fqn;
414
+ // Match if the child's FQN appears anywhere in the parentId string
415
+ // This handles cases like: ${azapi_resource.dns-resolver_resource_F1517BE4.id}
416
+ // where childFqn would be: azapi_resource.dns-resolver_resource_F1517BE4
417
+ if (parentId.includes(childFqn)) {
418
+ return child;
419
+ }
420
+ }
421
+ // Recursively search in child's subtree
422
+ const found = this._findParentResource(child, parentId);
423
+ if (found) {
424
+ return found;
425
+ }
426
+ }
427
+ return undefined;
268
428
  }
269
429
  /**
270
430
  * Resolves the parent resource ID for this resource.
@@ -282,23 +442,19 @@ class AzapiResource extends constructs_1.Construct {
282
442
  /**
283
443
  * Determines the parent ID for the resource (internal implementation)
284
444
  *
285
- * This method provides the default parent ID resolution logic for most resources.
286
- * Child resources should override resolveParentId() instead of this method.
445
+ * This method provides the default parent ID resolution logic.
446
+ * Resource-specific logic should be implemented in the overrideable resolveParentId() method.
447
+ *
448
+ * Default behavior:
449
+ * - If resourceGroupId is provided in props, use it
450
+ * - Otherwise, default to subscription scope
287
451
  */
288
452
  _determineParentId(props) {
289
- // This is a simplified implementation - real implementation would be
290
- // resource-type specific and could be made abstract or configurable
291
- // For resource groups, parent is subscription
292
- if (this.resourceType() === "Microsoft.Resources/resourceGroups") {
293
- // Use AZAPI client config to get subscription ID
294
- const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(this, "client_config", {});
295
- return `/subscriptions/\${${clientConfig.fqn}.subscription_id}`;
296
- }
297
- // For other resources, parent might be resource group
453
+ // If resource group ID is provided, use it as parent
298
454
  if (props.resourceGroupId) {
299
455
  return props.resourceGroupId;
300
456
  }
301
- // Default to subscription
457
+ // Default to subscription scope for resources without explicit parent
302
458
  const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(this, "client_config_default", {});
303
459
  return `/subscriptions/\${${clientConfig.fqn}.subscription_id}`;
304
460
  }
@@ -311,12 +467,13 @@ class AzapiResource extends constructs_1.Construct {
311
467
  const YELLOW = "\x1b[33m";
312
468
  const RESET = "\x1b[0m";
313
469
  const BOLD = "\x1b[1m";
314
- // Log deprecation warnings
315
- if (this.versionConfig.supportLevel === version_interfaces_1.VersionSupportLevel.DEPRECATED) {
470
+ // Log deprecation warnings using the version manager
471
+ if (this._versionManager.isDeprecated(this.resolvedApiVersion) &&
472
+ !this._versionManager.isSunset(this.resolvedApiVersion)) {
316
473
  console.warn(`${YELLOW}⚠️ API version ${this.resolvedApiVersion} for ${this.resourceType()} is deprecated. ` +
317
474
  `Consider upgrading to the latest version: ${this.latestVersion()}${RESET}`);
318
475
  }
319
- if (this.versionConfig.supportLevel === version_interfaces_1.VersionSupportLevel.SUNSET) {
476
+ if (this._versionManager.isSunset(this.resolvedApiVersion)) {
320
477
  console.error(`${RED}${BOLD}🚨 API version ${this.resolvedApiVersion} for ${this.resourceType()} has reached sunset. ` +
321
478
  `Immediate migration to ${this.latestVersion()} is required.${RESET}`);
322
479
  }
@@ -400,23 +557,57 @@ class AzapiResource extends constructs_1.Construct {
400
557
  /**
401
558
  * Creates the underlying AZAPI Terraform resource using the generated provider classes
402
559
  *
403
- * @param properties - The properties object to send to the Azure API
560
+ * @param properties - The properties object to send to the Azure API (should include location if needed)
404
561
  * @param parentId - The parent resource ID (e.g., subscription or resource group)
405
562
  * @param name - The name of the resource
406
- * @param location - The location of the resource (optional, can be in properties)
563
+ * @param location - The location of the resource (optional, only for top-level resources without location in body)
564
+ * @param parentResource - The parent resource for dependency tracking
565
+ * @param dependsOn - Explicit dependencies for this resource
566
+ * @param tags - Tags to apply to the resource (passed separately from body for proper idempotency)
407
567
  * @returns The created AZAPI resource
408
568
  */
409
- createAzapiResource(properties, parentId, name, location) {
569
+ createAzapiResource(properties, parentId, name, location, parentResource, dependsOn, tags) {
570
+ // Determine if this is a child resource by counting path segments
571
+ // Child resources have multiple segments (e.g., "Microsoft.Network/virtualNetworks/subnets")
572
+ // Top-level resources have one segment (e.g., "Microsoft.Network/virtualNetworks")
573
+ const resourceTypeParts = this._resourceType.split("/");
574
+ const isChildResource = resourceTypeParts.length > 2;
575
+ // Remove tags from properties to avoid duplicate specification error
576
+ // The AZAPI provider requires tags at the top level only, not in the body
577
+ // This prevents: "can't specify both the argument 'tags' and 'tags' in the argument 'body'"
578
+ // Tags are now passed as a separate parameter for better clarity and idempotency
579
+ const bodyWithoutTags = { ...properties };
580
+ delete bodyWithoutTags.tags;
410
581
  // Build the configuration object for the generated AZAPI Resource class
582
+ // Add location only if:
583
+ // 1. This is a top-level resource (not a child resource)
584
+ // 2. Location is provided as parameter
585
+ // 3. Location is not already in the body
586
+ // Child resources inherit location from their parent and should not specify it
587
+ // Combine dependsOn arrays: explicit dependencies + parent resource dependency
588
+ const combinedDependsOn = [];
589
+ if (dependsOn && dependsOn.length > 0) {
590
+ combinedDependsOn.push(...dependsOn);
591
+ }
592
+ // CRITICAL: Always add parent dependency when parent_id contains interpolations
593
+ // This ensures proper destroy-time ordering even if parent detection fails
594
+ if (parentResource?.terraformResource) {
595
+ combinedDependsOn.push(parentResource.terraformResource);
596
+ }
411
597
  const config = {
412
598
  type: `${this._resourceType}@${this.apiVersion}`,
413
599
  name: name,
414
600
  parentId: parentId,
415
- body: properties,
416
- // Add location conditionally if provided and not already in properties
417
- ...(location && !properties.location && { location: location }),
601
+ body: bodyWithoutTags,
602
+ ...(!isChildResource && location && !properties.location && { location }),
603
+ // Add tags at the top level if they exist
604
+ // Tags are passed as a separate parameter and added here to ensure they're in the
605
+ // initial Terraform configuration, providing proper idempotency
606
+ ...(tags && Object.keys(tags).length > 0 && { tags }),
607
+ // Add depends_on for explicit dependencies and parent resource
608
+ ...(combinedDependsOn.length > 0 && { dependsOn: combinedDependsOn }),
418
609
  };
419
- // Create and return the AZAPI resource using the generated provider class
610
+ // Create the AZAPI resource using the generated provider class
420
611
  return new resource_1.Resource(this, "resource", config);
421
612
  }
422
613
  /**
@@ -452,6 +643,13 @@ class AzapiResource extends constructs_1.Construct {
452
643
  get resourceId() {
453
644
  return this.terraformResource?.fqn || this.id;
454
645
  }
646
+ /**
647
+ * Gets the underlying Terraform resource for use in dependency declarations
648
+ * This allows explicit dependency management between resources
649
+ */
650
+ get resource() {
651
+ return this.terraformResource;
652
+ }
455
653
  /**
456
654
  * Gets the resource as a Terraform output value
457
655
  */
@@ -475,10 +673,50 @@ class AzapiResource extends constructs_1.Construct {
475
673
  scope: this.resourceId,
476
674
  });
477
675
  }
676
+ /**
677
+ * Adds a tag to this resource. The tag will be included in the Azure resource.
678
+ *
679
+ * This method provides proper immutability by storing tags separately from props.
680
+ * Tags added via this method are combined with tags from props and included in
681
+ * the deployed Azure resource.
682
+ *
683
+ * **Important:** In CDK for Terraform, tags should ideally be set during resource
684
+ * construction via props. While this method allows adding tags after construction,
685
+ * those tags are only included if added before the Terraform configuration is
686
+ * synthesized. For best results, add all tags via props or call addTag() in the
687
+ * same scope where the resource is created.
688
+ *
689
+ * @param key - The tag key
690
+ * @param value - The tag value
691
+ */
692
+ addTag(key, value) {
693
+ this._tags[key] = value;
694
+ }
695
+ /**
696
+ * All tags on this resource (readonly view)
697
+ *
698
+ * This getter provides convenient access to all tags including those from props
699
+ * and those added dynamically via addTag(). Returns a copy to maintain immutability.
700
+ */
701
+ get tags() {
702
+ return { ...this._tags };
703
+ }
704
+ /**
705
+ * Protected method to retrieve all tags for use in createResourceBody implementations
706
+ *
707
+ * Subclasses should use this method when creating resource bodies to ensure
708
+ * all tags (from props and addTag()) are included in the Azure resource.
709
+ * Uses a non-getter name to avoid JSII conflicts with the tags property.
710
+ *
711
+ * @returns Object containing all tags
712
+ */
713
+ allTags() {
714
+ return { ...this._tags };
715
+ }
478
716
  }
479
717
  exports.AzapiResource = AzapiResource;
480
718
  _a = JSII_RTTI_SYMBOL_1;
481
- AzapiResource[_a] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiResource", version: "1.2.0" };
719
+ AzapiResource[_a] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiResource", version: "1.3.0" };
482
720
  /**
483
721
  * AZAPI-based role assignment construct
484
722
  */
@@ -501,5 +739,5 @@ class AzapiRoleAssignment extends constructs_1.Construct {
501
739
  }
502
740
  exports.AzapiRoleAssignment = AzapiRoleAssignment;
503
741
  _b = JSII_RTTI_SYMBOL_1;
504
- AzapiRoleAssignment[_b] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiRoleAssignment", version: "1.2.0" };
505
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS1henVyZS9saWIvYXphcGkvYXphcGktcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILCtCQUErQjtBQUMvQiwyQ0FBdUM7QUFDdkMseUZBQW1GO0FBQ25GLHlEQUFzRTtBQUN0RSxpRUFBNkQ7QUFPN0QsZ0ZBQTJFO0FBQzNFLHlGQU0wRDtBQStKMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILE1BQXNCLGFBQWMsU0FBUSxzQkFBUztJQWtGbkQ7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNEIsRUFBRTtRQUN0RSxnQ0FBZ0M7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQWxCbkIsdURBQXVEO1FBQ3BDLDJCQUFzQixHQUFnQixFQUFFLENBQUM7UUFDekMsMkJBQXNCLEdBQWdCLEVBQUUsQ0FBQztRQUN6QyxnQ0FBMkIsR0FBZ0IsRUFBRSxDQUFDO1FBaUIvRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7UUFFM0MscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyx1Q0FBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2RCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEUsNkRBQTZEO1FBQzdELElBQUks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QUUsSUFBSSxDQUFDLFVBQVU7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2cEJILHNDQXdwQkM7OztBQWVEOztHQUVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUNoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxVQUFVLEdBQUc7WUFDakIsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQzNCLGdCQUFnQixFQUFFLHdGQUF3RixLQUFLLENBQUMsa0JBQWtCLE1BQU07WUFDeEksS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ25CLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBbUI7WUFDN0IsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxJQUFJLEVBQUUsVUFBVTtZQUNoQixRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDckIsSUFBSSxFQUFFLFVBQVU7U0FDakIsQ0FBQztRQUNGLElBQUksbUJBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7QUFqQkgsa0RBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBemFwaVJlc291cmNlIC0gQSB1bmlmaWVkIGZyYW1ld29yayBmb3IgdmVyc2lvbi1hd2FyZSBBenVyZSByZXNvdXJjZSBtYW5hZ2VtZW50XG4gKlxuICogVGhpcyBhYnN0cmFjdCBiYXNlIGNsYXNzIHByb3ZpZGVzIGEgc2VsZi1jb250YWluZWQgdW5pZmllZCBmcmFtZXdvcmsgYXBwcm9hY2hcbiAqIGZvciBBenVyZSByZXNvdXJjZSBtYW5hZ2VtZW50IHdpdGggYXV0b21hdGljIHZlcnNpb24gbWFuYWdlbWVudCwgc2NoZW1hLWRyaXZlblxuICogcHJvcGVydHkgdHJhbnNmb3JtYXRpb24sIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gd2hlbiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICogLSBTdXBwb3J0IGZvciBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIHN0YWJpbGl0eVxuICogLSBTY2hlbWEtZHJpdmVuIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdmVyc2lvbnNcbiAqIC0gTWlncmF0aW9uIGFuYWx5c2lzIGFuZCBkZXByZWNhdGlvbiB3YXJuaW5nc1xuICogLSBCdWlsdC1pbiByb2xlIGFzc2lnbm1lbnQgYW5kIGRpYWdub3N0aWMgc2V0dGluZ3Mgc3VwcG9ydFxuICogLSBKU0lJLWNvbXBsaWFudCBkZXNpZ24gZm9yIG11bHRpLWxhbmd1YWdlIHN1cHBvcnRcbiAqXG4gKiBUaGlzIGNsYXNzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBkdWFsLWNsYXNzIGFwcHJvYWNoIChBemFwaVJlc291cmNlICsgQXphcGlSZXNvdXJjZSlcbiAqIHdpdGggYSBzaW5nbGUsIHNlbGYtY29udGFpbmVkIGltcGxlbWVudGF0aW9uIHRoYXQgaGFuZGxlcyBhbGwgcmVzb3VyY2UgbWFuYWdlbWVudCBuZWVkcy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEYXRhQXphcGlDbGllbnRDb25maWcgfSBmcm9tIFwiLi9wcm92aWRlcnMtYXphcGkvZGF0YS1hemFwaS1jbGllbnQtY29uZmlnXCI7XG5pbXBvcnQgeyBSZXNvdXJjZSwgUmVzb3VyY2VDb25maWcgfSBmcm9tIFwiLi9wcm92aWRlcnMtYXphcGkvcmVzb3VyY2VcIjtcbmltcG9ydCB7IFNjaGVtYU1hcHBlciB9IGZyb20gXCIuL3NjaGVtYS1tYXBwZXIvc2NoZW1hLW1hcHBlclwiO1xuXG4vLyBUeXBlLW9ubHkgaW1wb3J0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbmltcG9ydCB0eXBlIHsgQWN0aW9uR3JvdXBQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1hY3Rpdml0eWxvZ2FsZXJ0L2xpYi9hY3Rpdml0eS1sb2ctYWxlcnRcIjtcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpY1NldHRpbmdzUHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY0FsZXJ0UHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtbWV0cmljYWxlcnQvbGliL21ldHJpYy1hbGVydFwiO1xuaW1wb3J0IHsgQXBpVmVyc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi4vdmVyc2lvbi1tYW5hZ2VyL2FwaS12ZXJzaW9uLW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFwaVNjaGVtYSxcbiAgVmVyc2lvbkNvbmZpZyxcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgTWlncmF0aW9uQW5hbHlzaXMsXG4gIFZlcnNpb25TdXBwb3J0TGV2ZWwsXG59IGZyb20gXCIuLi92ZXJzaW9uLW1hbmFnZXIvaW50ZXJmYWNlcy92ZXJzaW9uLWludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBSZXRlbnRpb24gcG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRlbnRpb25Qb2xpY3lDb25maWcge1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSBkYXlzOiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9nIGNvbmZpZ3VyYXRpb24gZm9yIGRpYWdub3N0aWMgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljTG9nQ29uZmlnIHtcbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5R3JvdXA/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldGVudGlvblBvbGljeT86IFJldGVudGlvblBvbGljeUNvbmZpZztcbn1cblxuLyoqXG4gKiBNZXRyaWMgY29uZmlndXJhdGlvbiBmb3IgZGlhZ25vc3RpYyBzZXR0aW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERpYWdub3N0aWNNZXRyaWNDb25maWcge1xuICAvKiogTWV0cmljIGNhdGVnb3J5IG5hbWUgKHVzZWQgaW4gbmV3ZXIgQVBJIHZlcnNpb25zKSAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRpbWUgZ3JhaW4gZm9yIG1ldHJpY3MgaW4gSVNPIDg2MDEgZHVyYXRpb24gZm9ybWF0ICh1c2VkIGluIEFQSSB2ZXJzaW9uIDIwMTYtMDktMDEsIGUuZy4sIFwiUFQxTVwiKSAqL1xuICByZWFkb25seSB0aW1lR3JhaW4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldGVudGlvblBvbGljeT86IFJldGVudGlvblBvbGljeUNvbmZpZztcbn1cblxuLyoqXG4gKiBNb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZm9yIEF6dXJlIHJlc291cmNlc1xuICpcbiAqIFByb3ZpZGVzIGludGVncmF0ZWQgbW9uaXRvcmluZyBjYXBhYmlsaXRpZXMgaW5jbHVkaW5nIGRpYWdub3N0aWMgc2V0dGluZ3MsXG4gKiBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cy4gQWxsIG1vbml0b3JpbmcgaXMgb3B0aW9uYWwgYW5kXG4gKiBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciBtb25pdG9yaW5nIGlzIGVuYWJsZWRcbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlhZ25vc3RpYyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAqIFVzZXMgdGhlIGZ1bGwgRGlhZ25vc3RpY1NldHRpbmdzIGNvbnN0cnVjdCBmb3IgY29uc2lzdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNTZXR0aW5ncz86IERpYWdub3N0aWNTZXR0aW5nc1Byb3BzO1xuXG4gIC8qKlxuICAgKiBBY3Rpb24gZ3JvdXBzIHRvIGNyZWF0ZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKiBDcmVhdGVzIG5ldyBBY3Rpb25Hcm91cCBpbnN0YW5jZXMgYXMgY2hpbGQgY29uc3RydWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uR3JvdXBzPzogQWN0aW9uR3JvdXBQcm9wc1tdO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgYWxlcnRzIGNvbmZpZ3VyYXRpb25cbiAgICogQ3JlYXRlcyBNZXRyaWNBbGVydCBpbnN0YW5jZXMgc2NvcGVkIHRvIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY0FsZXJ0cz86IE1ldHJpY0FsZXJ0UHJvcHNbXTtcblxuICAvKipcbiAgICogQWN0aXZpdHkgbG9nIGFsZXJ0cyBjb25maWd1cmF0aW9uXG4gICAqIENyZWF0ZXMgQWN0aXZpdHlMb2dBbGVydCBpbnN0YW5jZXMgZm9yIHRoaXMgcmVzb3VyY2UncyBvcGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBhY3Rpdml0eUxvZ0FsZXJ0cz86IEFjdGl2aXR5TG9nQWxlcnRQcm9wc1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHZlcnNpb25lZCBBenVyZSByZXNvdXJjZXNcbiAqXG4gKiBDb21iaW5lcyBiYXNlIHJlc291cmNlIHByb3BlcnRpZXMgd2l0aCB2ZXJzaW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzXG4gKiBhbmQgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdW5pZmllZCBmcmFtZXdvcmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gYXBwbHkgdG8gdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIEV4cGxpY2l0IEFQSSB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgbGF0ZXN0IGFjdGl2ZSB2ZXJzaW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXNvbHZlZC5cbiAgICogVXNlIHRoaXMgZm9yIHZlcnNpb24gcGlubmluZyB3aGVuIHN0YWJpbGl0eSBpcyByZXF1aXJlZCBvdmVyIGxhdGVzdCBmZWF0dXJlcy5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIyMDI0LTExLTAxXCJcbiAgICogQGRlZmF1bHRWYWx1ZSBMYXRlc3QgYWN0aXZlIHZlcnNpb24gZnJvbSBBcGlWZXJzaW9uTWFuYWdlclxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgbWlncmF0aW9uIGFuYWx5c2lzIHdhcm5pbmdzXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGZyYW1ld29yayB3aWxsIGFuYWx5emUgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZGVwcmVjYXRpb25cbiAgICogc3RhdHVzIGFuZCBwcm92aWRlIG1pZ3JhdGlvbiByZWNvbW1lbmRhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU1pZ3JhdGlvbkFuYWx5c2lzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSBwcm9wZXJ0aWVzIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKlxuICAgKiBXaGVuIHRydWUsIGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIEFQSSBzY2hlbWEgYmVmb3JlXG4gICAqIHJlc291cmNlIGNyZWF0aW9uLiBWYWxpZGF0aW9uIGVycm9ycyB3aWxsIGNhdXNlIGRlcGxveW1lbnQgZmFpbHVyZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlVmFsaWRhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXBwbHkgcHJvcGVydHkgdHJhbnNmb3JtYXRpb25zIGF1dG9tYXRpY2FsbHlcbiAgICpcbiAgICogV2hlbiB0cnVlLCBwcm9wZXJ0aWVzIHdpbGwgYmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlXG4gICAqIHRhcmdldCBzY2hlbWEncyB0cmFuc2Zvcm1hdGlvbiBydWxlcy4gVGhpcyBlbmFibGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlVHJhbnNmb3JtYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogRW5hYmxlcyBpbnRlZ3JhdGVkIG1vbml0b3Jpbmcgd2l0aCBkaWFnbm9zdGljIHNldHRpbmdzLCBtZXRyaWMgYWxlcnRzLFxuICAgKiBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cy4gQWxsIG1vbml0b3JpbmcgaXMgb3B0aW9uYWwgYW5kIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG1vbml0b3Jpbmc6IHtcbiAgICogICBlbmFibGVkOiB0cnVlLFxuICAgKiAgIGRpYWdub3N0aWNTZXR0aW5nczoge1xuICAgKiAgICAgd29ya3NwYWNlSWQ6IGxvZ0FuYWx5dGljcy5pZCxcbiAgICogICAgIG1ldHJpY3M6IFsnQWxsTWV0cmljcyddLFxuICAgKiAgICAgbG9nczogWydBdWRpdExvZ3MnXVxuICAgKiAgIH0sXG4gICAqICAgbWV0cmljQWxlcnRzOiBbe1xuICAgKiAgICAgbmFtZTogJ2hpZ2gtY3B1LWFsZXJ0JyxcbiAgICogICAgIHNldmVyaXR5OiAyLFxuICAgKiAgICAgc2NvcGVzOiBbXSwgLy8gQXV0b21hdGljYWxseSBzZXQgdG8gdGhpcyByZXNvdXJjZVxuICAgKiAgICAgY3JpdGVyaWE6IHsgLi4uIH0sXG4gICAqICAgICBhY3Rpb25zOiBbeyBhY3Rpb25Hcm91cElkOiBhY3Rpb25Hcm91cC5pZCB9XVxuICAgKiAgIH1dXG4gICAqIH1cbiAgICovXG4gIHJlYWRvbmx5IG1vbml0b3Jpbmc/OiBNb25pdG9yaW5nQ29uZmlnO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZlcnNpb24tYXdhcmUgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudFxuICpcbiAqIEF6YXBpUmVzb3VyY2UgcHJvdmlkZXMgYSB1bmlmaWVkIGZyYW1ld29yayBmb3IgY3JlYXRpbmcgQXp1cmUgcmVzb3VyY2VzXG4gKiB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYSB2YWxpZGF0aW9uLCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbixcbiAqIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMuIEl0IGV4dGVuZHMgdGhlIGV4aXN0aW5nIEF6YXBpUmVzb3VyY2UgY2xhc3Mgd2hpbGVcbiAqIG1haW50YWluaW5nIGZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNvcmUgZnJhbWV3b3JrIHRoYXQgZW5hYmxlczpcbiAqIC0gQXV0b21hdGljIHJlc29sdXRpb24gb2YgdGhlIGxhdGVzdCBBUEkgdmVyc2lvbiB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3IgZW52aXJvbm1lbnRzIHJlcXVpcmluZyBzdGFiaWxpdHlcbiAqIC0gU2NoZW1hLWRyaXZlbiBwcm9wZXJ0eSB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvblxuICogLSBNaWdyYXRpb24gYW5hbHlzaXMgd2l0aCBicmVha2luZyBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiAtIERlcHJlY2F0aW9uIHdhcm5pbmdzIGFuZCB1cGdyYWRlIHJlY29tbWVuZGF0aW9uc1xuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZHMgdG8gcHJvdmlkZSByZXNvdXJjZS1zcGVjaWZpY1xuICogY29uZmlndXJhdGlvbiB3aGlsZSB0aGUgZnJhbWV3b3JrIGhhbmRsZXMgYWxsIHZlcnNpb24gbWFuYWdlbWVudCBjb21wbGV4aXR5LlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHZlcnNpb24gcmVzb2x1dGlvbjpcbiAqIGNsYXNzIE15UmVzb3VyY2UgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAqICAgcHJvdGVjdGVkIGdldERlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIFwiMjAyNC0xMS0wMVwiOyAvLyBmYWxsYmFjayBpZiBubyB2ZXJzaW9ucyByZWdpc3RlcmVkXG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBnZXRSZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3Jlc291cmNlR3JvdXBzXCI7XG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBnZXRBcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAqICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gKiAgIH1cbiAqXG4gKiAgIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gKiAgICAgcmV0dXJuIHsgbG9jYXRpb246IHByb3BzLmxvY2F0aW9uLCB0YWdzOiBwcm9wcy50YWdzIHx8IHt9IH07XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZSB3aXRoIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZzpcbiAqIG5ldyBNeVJlc291cmNlKHRoaXMsIFwicmVzb3VyY2VcIiwge1xuICogICBuYW1lOiBcIm15LXJlc291cmNlXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICBhcGlWZXJzaW9uOiBcIjIwMjQtMDEtMDFcIiAvLyBQaW4gdG8gc3BlY2lmaWMgdmVyc2lvblxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF6YXBpUmVzb3VyY2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUEkgdmVyc2lvbiB0byB1c2UgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIEFaQVBJIFRlcnJhZm9ybSByZXNvdXJjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlITogY2RrdGYuVGVycmFmb3JtUmVzb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvY2F0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBJRCAoYWJzdHJhY3QgLSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uIGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBBenVyZSBBUEkgY2FsbCxcbiAgICogZWl0aGVyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHByb3BzIG9yIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQgdG9cbiAgICogdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvbHZlZEFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIHRoZSBjb21wbGV0ZSBzY2hlbWEgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcHJvcGVydGllcywgdmFsaWRhdGlvblxuICAgKiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzIGZvciB0aGUgcmVzb2x2ZWQgQVBJIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hOiBBcGlTY2hlbWE7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIGxpZmVjeWNsZSBpbmZvcm1hdGlvbiwgYnJlYWtpbmcgY2hhbmdlcywgYW5kIG1pZ3JhdGlvbiBtZXRhZGF0YVxuICAgKiBmb3IgdGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb25Db25maWc6IFZlcnNpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcmVzdWx0cyBmb3IgdGhlIHJlc291cmNlIHByb3BlcnRpZXNcbiAgICpcbiAgICogQXZhaWxhYmxlIGFmdGVyIGNvbnN0cnVjdGlvbiBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuIENvbnRhaW5zIGRldGFpbGVkXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IGFueSB2YWxpZGF0aW9uIGVycm9ycyBvciB3YXJuaW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2YWxpZGF0aW9uUmVzdWx0PzogVmFsaWRhdGlvblJlc3VsdDtcblxuICAvKipcbiAgICogTWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICpcbiAgICogQXZhaWxhYmxlIGFmdGVyIGNvbnN0cnVjdGlvbiBpZiBtaWdyYXRpb24gYW5hbHlzaXMgaXMgZW5hYmxlZCBhbmQgYVxuICAgKiBwcmV2aW91cyB2ZXJzaW9uIGNhbiBiZSBkZXRlcm1pbmVkIGZvciBjb21wYXJpc29uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pZ3JhdGlvbkFuYWx5c2lzPzogTWlncmF0aW9uQW5hbHlzaXM7XG5cbiAgLy8gRnJhbWV3b3JrIGNvbXBvbmVudHNcbiAgcHJpdmF0ZSByZWFkb25seSBfYXBpVmVyc2lvbk1hbmFnZXI6IEFwaVZlcnNpb25NYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zY2hlbWFNYXBwZXI6IFNjaGVtYU1hcHBlcjtcblxuICAvLyBNb25pdG9yaW5nIHJlc291cmNlcyAocHJvdGVjdGVkIGZvciBzdWJjbGFzcyBhY2Nlc3MpXG4gIHByb3RlY3RlZCByZWFkb25seSBtb25pdG9yaW5nQWN0aW9uR3JvdXBzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcmluZ01ldHJpY0FsZXJ0czogQ29uc3RydWN0W10gPSBbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbml0b3JpbmdBY3Rpdml0eUxvZ0FsZXJ0czogQ29uc3RydWN0W10gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBemFwaVJlc291cmNlIGluc3RhbmNlXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBoYW5kbGVzIGFsbCBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb24gaW5jbHVkaW5nIHZlcnNpb24gcmVzb2x1dGlvbixcbiAgICogc2NoZW1hIGxvYWRpbmcsIHByb3BlcnR5IHZhbGlkYXRpb24sIHRyYW5zZm9ybWF0aW9uLCBhbmQgbWlncmF0aW9uIGFuYWx5c2lzLlxuICAgKiBJdCBtYWludGFpbnMgZnVsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEF6YXBpUmVzb3VyY2UgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIHJlc291cmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXphcGlSZXNvdXJjZVByb3BzID0ge30pIHtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBiYXNlIENvbnN0cnVjdFxuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGJhc2ljIHByb3BlcnRpZXNcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lIHx8IHRoaXMubm9kZS5pZDtcbiAgICB0aGlzLmxvY2F0aW9uID0gcHJvcHMubG9jYXRpb24gfHwgXCJlYXN0dXNcIjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIEFQSSB2ZXJzaW9uIG1hbmFnZXJcbiAgICB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlciA9IEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCk7XG5cbiAgICAvLyBTdGVwIDE6IFJlc29sdmUgdGhlIEFQSSB2ZXJzaW9uIHRvIHVzZVxuICAgIHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uID0gdGhpcy5fcmVzb2x2ZUFwaVZlcnNpb24ocHJvcHMuYXBpVmVyc2lvbik7XG5cbiAgICAvLyBTdGVwIDI6IFNldCByZXF1aXJlZCBhYnN0cmFjdCBwcm9wZXJ0aWVzIGZvciBBemFwaVJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvdXJjZVR5cGUoKTtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbjtcblxuICAgIC8vIFN0ZXAgMzogTG9hZCB0aGUgc2NoZW1hIGFuZCB2ZXJzaW9uIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnNjaGVtYSA9IHRoaXMuYXBpU2NoZW1hKCk7XG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZyA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLnZlcnNpb25Db25maWcoXG4gICAgICB0aGlzLl9yZXNvdXJjZVR5cGUsXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuXG4gICAgaWYgKCF2ZXJzaW9uQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWZXJzaW9uIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9QCR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259LiBgICtcbiAgICAgICAgICBgUGxlYXNlIGVuc3VyZSB0aGUgdmVyc2lvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIEFwaVZlcnNpb25NYW5hZ2VyLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcnNpb25Db25maWcgPSB2ZXJzaW9uQ29uZmlnO1xuXG4gICAgLy8gU3RlcCA0OiBJbml0aWFsaXplIHRoZSBzY2hlbWEgbWFwcGVyXG4gICAgdGhpcy5fc2NoZW1hTWFwcGVyID0gU2NoZW1hTWFwcGVyLmNyZWF0ZSh0aGlzLnNjaGVtYSk7XG5cbiAgICAvLyBTdGVwIDU6IFByb2Nlc3MgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzKTtcblxuICAgIC8vIFN0ZXAgNjogUGVyZm9ybSB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVmFsaWRhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuX3ZhbGlkYXRlUHJvcGVydGllcyhwcm9jZXNzZWRQcm9wcyk7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFByb3BlcnR5IHZhbGlkYXRpb24gZmFpbGVkIGZvciAke3RoaXMucmVzb3VyY2VUeXBlfTpcXG5gICtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDc6IFBlcmZvcm0gbWlncmF0aW9uIGFuYWx5c2lzIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlTWlncmF0aW9uQW5hbHlzaXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzID0gdGhpcy5fcGVyZm9ybU1pZ3JhdGlvbkFuYWx5c2lzKCk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCA4OiBDcmVhdGUgdGhlIEF6dXJlIHJlc291cmNlXG4gICAgdGhpcy5fY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9jZXNzZWRQcm9wcyk7XG5cbiAgICAvLyBTdGVwIDk6IENyZWF0ZSBtb25pdG9yaW5nIHJlc291cmNlcyBpZiBjb25maWd1cmVkXG4gICAgLy8gTm90ZTogTW9uaXRvcmluZyByZXNvdXJjZXMgYXJlIGNyZWF0ZWQgbGF6aWx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICAgIGlmIChwcm9wcy5tb25pdG9yaW5nKSB7XG4gICAgICB2b2lkIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1Jlc291cmNlcyhwcm9wcy5tb25pdG9yaW5nKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDEwOiBMb2cgd2FybmluZ3MgYW5kIG1pZ3JhdGlvbiBndWlkYW5jZVxuICAgIHRoaXMuX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGVmYXVsdCBBUEkgdmVyc2lvbiB0byB1c2Ugd2hlbiBubyBleHBsaWNpdCB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgc2Vuc2libGUgZGVmYXVsdCB2ZXJzaW9uIHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBmYWxsYmFjayBpZiB0aGUgQXBpVmVyc2lvbk1hbmFnZXIgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9ucyByZWdpc3RlcmVkXG4gICAqIGZvciB0aGlzIHJlc291cmNlIHR5cGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IEFQSSB2ZXJzaW9uIHN0cmluZyAoZS5nLiwgXCIyMDI0LTExLTAxXCIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciB0aGlzIHJlc291cmNlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGZ1bGwgQXp1cmUgcmVzb3VyY2UgdHlwZSBpZGVudGlmaWVyIHRoYXRcbiAgICogd2lsbCBiZSB1c2VkIGZvciBBUEkgY2FsbHMgYW5kIHZlcnNpb24gbWFuYWdlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlc291cmNlVHlwZSgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGNvbXBsZXRlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uLFxuICAgKiBpbmNsdWRpbmcgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgdHJhbnNmb3JtYXRpb25cbiAgICogbWFwcGluZ3MuIFVzZSB0aGUgcmVzb2x2ZVNjaGVtYSgpIGhlbHBlciBtZXRob2QgZm9yIHN0YW5kYXJkIHNjaGVtYSByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByZXNvdXJjZSBib2R5IGZvciB0aGUgQXp1cmUgQVBJIGNhbGxcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHRyYW5zZm9ybSB0aGUgaW5wdXQgcHJvcGVydGllcyBpbnRvIHRoZSBKU09OIGJvZHkgZm9ybWF0XG4gICAqIGV4cGVjdGVkIGJ5IHRoZSBBenVyZSBSRVNUIEFQSSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb24uIFRoZSBmcmFtZXdvcmsgd2lsbFxuICAgKiBoYXZlIGFscmVhZHkgYXBwbGllZCBhbnkgbmVjZXNzYXJ5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBhbmQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIHByb2Nlc3NlZCBhbmQgdmFsaWRhdGVkIHByb3BlcnRpZXMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2UgYm9keSBvYmplY3QgdG8gc2VuZCB0byBBenVyZSBBUElcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueTtcblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3Igc3RhbmRhcmQgc2NoZW1hIHJlc29sdXRpb25cbiAgICpcbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIHJlc29sdmUgdGhlIHNjaGVtYSBmb3IgdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgKiBmcm9tIHRoZSBBcGlWZXJzaW9uTWFuYWdlci4gVGhpcyBwcm92aWRlcyBhIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHRoYXRcbiAgICogbW9zdCByZXNvdXJjZXMgY2FuIHVzZSB3aXRob3V0IGN1c3RvbSBsb2dpYy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWRcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZyA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLnZlcnNpb25Db25maWcoXG4gICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgKTtcblxuICAgIGlmICghdmVyc2lvbkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc29sdmUgc2NoZW1hOiB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvciBgICtcbiAgICAgICAgICBgJHt0aGlzLnJlc291cmNlVHlwZSgpfUAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJzaW9uQ29uZmlnLnNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24gZm9yIHRoaXMgcmVzb3VyY2UgdHlwZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gbG9naWNcbiAgICogZm9yIHVzZSBpbiBzdWJjbGFzc2VzIG9yIGV4dGVybmFsIHRvb2xpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24sIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kXG4gICAqL1xuICBwdWJsaWMgbGF0ZXN0VmVyc2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5sYXRlc3RWZXJzaW9uKHRoaXMucmVzb3VyY2VUeXBlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHN1cHBvcnRlZCB2ZXJzaW9ucyBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdmVyc2lvbiByZWdpc3RyeSBmb3IgdXNlIGluXG4gICAqIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc3VwcG9ydGVkIHZlcnNpb24gc3RyaW5ncywgc29ydGVkIGJ5IHJlbGVhc2UgZGF0ZVxuICAgKi9cbiAgcHVibGljIHN1cHBvcnRlZFZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIuc3VwcG9ydGVkVmVyc2lvbnModGhpcy5yZXNvdXJjZVR5cGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQW5hbHl6ZXMgbWlncmF0aW9uIGZyb20gY3VycmVudCB2ZXJzaW9uIHRvIGEgdGFyZ2V0IHZlcnNpb25cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBleHRlcm5hbCB0b29scyB0byBhbmFseXplIG1pZ3JhdGlvbiByZXF1aXJlbWVudHNcbiAgICogYmV0d2VlbiB2ZXJzaW9ucyBmb3IgcGxhbm5pbmcgYW5kIGF1dG9tYXRpb24gcHVycG9zZXMuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXRWZXJzaW9uIC0gVGhlIHRhcmdldCB2ZXJzaW9uIHRvIGFuYWx5emUgbWlncmF0aW9uIHRvXG4gICAqIEByZXR1cm5zIERldGFpbGVkIG1pZ3JhdGlvbiBhbmFseXNpcyByZXN1bHRzXG4gICAqL1xuICBwdWJsaWMgYW5hbHl6ZU1pZ3JhdGlvblRvKHRhcmdldFZlcnNpb246IHN0cmluZyk6IE1pZ3JhdGlvbkFuYWx5c2lzIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIuYW5hbHl6ZU1pZ3JhdGlvbihcbiAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICAgIHRhcmdldFZlcnNpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgSU1QTEVNRU5UQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgQVBJIHZlcnNpb24gdG8gdXNlIGZvciB0aGlzIHJlc291cmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNvbHZlQXBpVmVyc2lvbihleHBsaWNpdFZlcnNpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChleHBsaWNpdFZlcnNpb24pIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGV4cGxpY2l0IHZlcnNpb24gaXMgc3VwcG9ydGVkXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci52YWxpZGF0ZVZlcnNpb25TdXBwb3J0KFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICAgICAgZXhwbGljaXRWZXJzaW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnMgPSB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5zdXBwb3J0ZWRWZXJzaW9ucyhcbiAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIEFQSSB2ZXJzaW9uICcke2V4cGxpY2l0VmVyc2lvbn0nIGZvciByZXNvdXJjZSB0eXBlICcke3RoaXMucmVzb3VyY2VUeXBlKCl9Jy4gYCArXG4gICAgICAgICAgICBgU3VwcG9ydGVkIHZlcnNpb25zOiAke3N1cHBvcnRlZFZlcnNpb25zLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cGxpY2l0VmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSBtYW5hZ2VyXG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oXG4gICAgICB0aGlzLnJlc291cmNlVHlwZSgpLFxuICAgICk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCB2ZXJzaW9uXG4gICAgY29uc3QgZGVmYXVsdFZlcnNpb24gPSB0aGlzLmRlZmF1bHRWZXJzaW9uKCk7XG5cbiAgICAvLyBXYXJuIHRoYXQgd2UncmUgdXNpbmcgdGhlIGRlZmF1bHQgdmVyc2lvblxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBObyB2ZXJzaW9ucyByZWdpc3RlcmVkIGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9LiBgICtcbiAgICAgICAgYFVzaW5nIGRlZmF1bHQgdmVyc2lvbjogJHtkZWZhdWx0VmVyc2lvbn0uIGAgK1xuICAgICAgICBgQ29uc2lkZXIgcmVnaXN0ZXJpbmcgdmVyc2lvbnMgd2l0aCBBcGlWZXJzaW9uTWFuYWdlciBmb3IgYmV0dGVyIHZlcnNpb24gbWFuYWdlbWVudC5gLFxuICAgICk7XG5cbiAgICByZXR1cm4gZGVmYXVsdFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHByb3BlcnRpZXMgdGhyb3VnaCB0aGUgZnJhbWV3b3JrIHBpcGVsaW5lXG4gICAqL1xuICBwcml2YXRlIF9wcm9jZXNzUHJvcGVydGllcyhwcm9wczogQXphcGlSZXNvdXJjZVByb3BzKTogYW55IHtcbiAgICBsZXQgcHJvY2Vzc2VkUHJvcHMgPSB7IC4uLnByb3BzIH07XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBzY2hlbWFcbiAgICBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3NjaGVtYU1hcHBlci5hcHBseURlZmF1bHRzKHByb2Nlc3NlZFByb3BzKTtcblxuICAgIC8vIEFwcGx5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBpZiBlbmFibGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZVRyYW5zZm9ybWF0aW9uICE9PSBmYWxzZSkge1xuICAgICAgLy8gRm9yIHRyYW5zZm9ybWF0aW9uLCB3ZSB3b3VsZCBuZWVkIGEgc291cmNlIHNjaGVtYSwgYnV0IHNpbmNlIHdlJ3JlIG5vdFxuICAgICAgLy8gbWlncmF0aW5nIGZyb20gYSBkaWZmZXJlbnQgdmVyc2lvbiBpbiB0aGlzIGNvbnRleHQsIHdlJ2xsIHNraXAgdHJhbnNmb3JtYXRpb25cbiAgICAgIC8vIFRoaXMgd291bGQgYmUgdXNlZCB3aGVuIHVwZ3JhZGluZyBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXJcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkUHJvcHM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYWdhaW5zdCB0aGUgc2NoZW1hXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZVByb3BlcnRpZXMocHJvcHM6IGFueSk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFNYXBwZXIudmFsaWRhdGVQcm9wZXJ0aWVzKHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBtaWdyYXRpb24gYW5hbHlzaXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICovXG4gIHByaXZhdGUgX3BlcmZvcm1NaWdyYXRpb25BbmFseXNpcygpOiBNaWdyYXRpb25BbmFseXNpcyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBkZXByZWNhdGVkXG4gICAgaWYgKFxuICAgICAgdGhpcy52ZXJzaW9uQ29uZmlnLnN1cHBvcnRMZXZlbCA9PT0gVmVyc2lvblN1cHBvcnRMZXZlbC5ERVBSRUNBVEVEIHx8XG4gICAgICB0aGlzLnZlcnNpb25Db25maWcuc3VwcG9ydExldmVsID09PSBWZXJzaW9uU3VwcG9ydExldmVsLlNVTlNFVFxuICAgICkge1xuICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMubGF0ZXN0VmVyc2lvbigpO1xuICAgICAgaWYgKGxhdGVzdFZlcnNpb24gJiYgbGF0ZXN0VmVyc2lvbiAhPT0gdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyLmFuYWx5emVNaWdyYXRpb24oXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUoKSxcbiAgICAgICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICAgICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBenVyZSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9wczogYW55KTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSBib2R5IHVzaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IHJlc291cmNlQm9keSA9IHRoaXMuY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGFyZW50IElEIHVzaW5nIHRoZSBvdmVycmlkZWFibGUgbWV0aG9kXG4gICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVQYXJlbnRJZChwcm9wcyk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIEFaQVBJIHJlc291cmNlIHVzaW5nIHRoZSBiYXNlIGNsYXNzIG1ldGhvZFxuICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUF6YXBpUmVzb3VyY2UoXG4gICAgICByZXNvdXJjZUJvZHksXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMubG9jYXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGlzIHJlc291cmNlLlxuICAgKlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBjaGlsZCByZXNvdXJjZSBjbGFzc2VzIChsaWtlIFN1Ym5ldCkgdGhhdCBuZWVkXG4gICAqIGN1c3RvbSBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy4gQnkgZGVmYXVsdCwgdGhpcyBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkIG1ldGhvZCB3aGljaCBoYW5kbGVzIHN0YW5kYXJkIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IHJlc291cmNlIElEXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXRlcm1pbmVQYXJlbnRJZChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcGFyZW50IElEIGZvciB0aGUgcmVzb3VyY2UgKGludGVybmFsIGltcGxlbWVudGF0aW9uKVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgZGVmYXVsdCBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYyBmb3IgbW9zdCByZXNvdXJjZXMuXG4gICAqIENoaWxkIHJlc291cmNlcyBzaG91bGQgb3ZlcnJpZGUgcmVzb2x2ZVBhcmVudElkKCkgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC5cbiAgICovXG4gIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGltcGxlbWVudGF0aW9uIC0gcmVhbCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZVxuICAgIC8vIHJlc291cmNlLXR5cGUgc3BlY2lmaWMgYW5kIGNvdWxkIGJlIG1hZGUgYWJzdHJhY3Qgb3IgY29uZmlndXJhYmxlXG5cbiAgICAvLyBGb3IgcmVzb3VyY2UgZ3JvdXBzLCBwYXJlbnQgaXMgc3Vic2NyaXB0aW9uXG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlKCkgPT09IFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKSB7XG4gICAgICAvLyBVc2UgQVpBUEkgY2xpZW50IGNvbmZpZyB0byBnZXQgc3Vic2NyaXB0aW9uIElEXG4gICAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKHRoaXMsIFwiY2xpZW50X2NvbmZpZ1wiLCB7fSk7XG4gICAgICByZXR1cm4gYC9zdWJzY3JpcHRpb25zL1xcJHske2NsaWVudENvbmZpZy5mcW59LnN1YnNjcmlwdGlvbl9pZH1gO1xuICAgIH1cblxuICAgIC8vIEZvciBvdGhlciByZXNvdXJjZXMsIHBhcmVudCBtaWdodCBiZSByZXNvdXJjZSBncm91cFxuICAgIGlmIChwcm9wcy5yZXNvdXJjZUdyb3VwSWQpIHtcbiAgICAgIHJldHVybiBwcm9wcy5yZXNvdXJjZUdyb3VwSWQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBzdWJzY3JpcHRpb25cbiAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIFwiY2xpZW50X2NvbmZpZ19kZWZhdWx0XCIsXG4gICAgICB7fSxcbiAgICApO1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0uc3Vic2NyaXB0aW9uX2lkfWA7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBmcmFtZXdvcmsgbWVzc2FnZXMgaW5jbHVkaW5nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICovXG4gIHByaXZhdGUgX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8vIEFOU0kgY29sb3IgY29kZXMgZm9yIHRlcm1pbmFsIG91dHB1dFxuICAgIGNvbnN0IFJFRCA9IFwiXFx4MWJbMzFtXCI7XG4gICAgY29uc3QgWUVMTE9XID0gXCJcXHgxYlszM21cIjtcbiAgICBjb25zdCBSRVNFVCA9IFwiXFx4MWJbMG1cIjtcbiAgICBjb25zdCBCT0xEID0gXCJcXHgxYlsxbVwiO1xuXG4gICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdzXG4gICAgaWYgKHRoaXMudmVyc2lvbkNvbmZpZy5zdXBwb3J0TGV2ZWwgPT09IFZlcnNpb25TdXBwb3J0TGV2ZWwuREVQUkVDQVRFRCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtZRUxMT1d94pqg77iPICBBUEkgdmVyc2lvbiAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufSBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfSBpcyBkZXByZWNhdGVkLiBgICtcbiAgICAgICAgICBgQ29uc2lkZXIgdXBncmFkaW5nIHRvIHRoZSBsYXRlc3QgdmVyc2lvbjogJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0ke1JFU0VUfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZlcnNpb25Db25maWcuc3VwcG9ydExldmVsID09PSBWZXJzaW9uU3VwcG9ydExldmVsLlNVTlNFVCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7UkVEfSR7Qk9MRH3wn5qoIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGhhcyByZWFjaGVkIHN1bnNldC4gYCArXG4gICAgICAgICAgYEltbWVkaWF0ZSBtaWdyYXRpb24gdG8gJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0gaXMgcmVxdWlyZWQuJHtSRVNFVH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICBpZiAodGhpcy5taWdyYXRpb25BbmFseXNpcyAmJiAhdGhpcy5taWdyYXRpb25BbmFseXNpcy5jb21wYXRpYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV31NaWdyYXRpb24gZnJvbSAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZnJvbVZlcnNpb259IHRvICR7dGhpcy5taWdyYXRpb25BbmFseXNpcy50b1ZlcnNpb259IGAgK1xuICAgICAgICAgIGBoYXMgJHt0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzLmJyZWFraW5nQ2hhbmdlcy5sZW5ndGh9IGJyZWFraW5nIGNoYW5nZXMuIGAgK1xuICAgICAgICAgIGBFc3RpbWF0ZWQgZWZmb3J0OiAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZXN0aW1hdGVkRWZmb3J0fSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHZhbGlkYXRpb24gd2FybmluZ3NcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uUmVzdWx0Py53YXJuaW5ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtZRUxMT1d9UHJvcGVydHkgdmFsaWRhdGlvbiB3YXJuaW5nOiAke3dhcm5pbmd9JHtSRVNFVH1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTU9OSVRPUklORyBJTlRFR1JBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbW9uaXRvcmluZyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIG1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBkdXJpbmcgY29uc3RydWN0aW9uIGlmIG1vbml0b3JpbmcgaXMgY29uZmlndXJlZC5cbiAgICogSXQgY3JlYXRlcyBhY3Rpb24gZ3JvdXBzLCBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cyBhcyBjaGlsZCBjb25zdHJ1Y3RzLlxuICAgKlxuICAgKiBQcm90ZWN0ZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBvciBleHRlbmQgbW9uaXRvcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBwcm9wc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMoXG4gICAgY29uZmlnOiBNb25pdG9yaW5nQ29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTa2lwIGlmIG1vbml0b3JpbmcgaXMgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgIGlmIChjb25maWcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGlhZ25vc3RpYyBzZXR0aW5ncyB1c2luZyBkeW5hbWljIGltcG9ydCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgaWYgKGNvbmZpZy5kaWFnbm9zdGljU2V0dGluZ3MpIHtcbiAgICAgIGNvbnN0IHsgRGlhZ25vc3RpY1NldHRpbmdzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCJcbiAgICAgICk7XG4gICAgICBuZXcgRGlhZ25vc3RpY1NldHRpbmdzKHRoaXMsIFwibW9uaXRvcmluZy1kaWFnbm9zdGljLXNldHRpbmdzXCIsIHtcbiAgICAgICAgLi4uY29uZmlnLmRpYWdub3N0aWNTZXR0aW5ncyxcbiAgICAgICAgdGFyZ2V0UmVzb3VyY2VJZDogdGhpcy5yZXNvdXJjZUlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFjdGlvbiBncm91cHMgdXNpbmcgZHluYW1pYyBpbXBvcnRcbiAgICBpZiAoY29uZmlnLmFjdGlvbkdyb3VwcyAmJiBjb25maWcuYWN0aW9uR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgQWN0aW9uR3JvdXAgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aW9uR3JvdXBzLmZvckVhY2goKGFjdGlvbkdyb3VwUHJvcHMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkdyb3VwID0gbmV3IEFjdGlvbkdyb3VwKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYG1vbml0b3JpbmctYWN0aW9uLWdyb3VwLSR7aW5kZXh9YCxcbiAgICAgICAgICBhY3Rpb25Hcm91cFByb3BzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1vbml0b3JpbmdBY3Rpb25Hcm91cHMucHVzaChhY3Rpb25Hcm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWV0cmljIGFsZXJ0cyB1c2luZyBkeW5hbWljIGltcG9ydFxuICAgIGlmIChjb25maWcubWV0cmljQWxlcnRzICYmIGNvbmZpZy5tZXRyaWNBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBNZXRyaWNBbGVydCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIlxuICAgICAgKTtcbiAgICAgIGNvbmZpZy5tZXRyaWNBbGVydHMuZm9yRWFjaCgobWV0cmljQWxlcnRQcm9wcywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCBwcm92aWRlZCwgZGVmYXVsdCB0byB0aGlzIHJlc291cmNlXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aFNjb3BlOiBNZXRyaWNBbGVydFByb3BzID0ge1xuICAgICAgICAgIC4uLm1ldHJpY0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBtZXRyaWNBbGVydFByb3BzLnNjb3BlcyB8fCBbdGhpcy5yZXNvdXJjZUlkXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtZXRyaWNBbGVydCA9IG5ldyBNZXRyaWNBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLW1ldHJpYy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ01ldHJpY0FsZXJ0cy5wdXNoKG1ldHJpY0FsZXJ0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhY3Rpdml0eSBsb2cgYWxlcnRzIHVzaW5nIGR5bmFtaWMgaW1wb3J0XG4gICAgaWYgKGNvbmZpZy5hY3Rpdml0eUxvZ0FsZXJ0cyAmJiBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBBY3Rpdml0eUxvZ0FsZXJ0IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMuZm9yRWFjaCgoYWN0aXZpdHlMb2dBbGVydFByb3BzLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBJZiBzY29wZXMgbm90IHByb3ZpZGVkLCBkZWZhdWx0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICAgICAgY29uc3QgcHJvcHNXaXRoU2NvcGU6IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyA9IHtcbiAgICAgICAgICAuLi5hY3Rpdml0eUxvZ0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBhY3Rpdml0eUxvZ0FsZXJ0UHJvcHMuc2NvcGVzIHx8IFt0aGlzLnJlc291cmNlSWRdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5TG9nQWxlcnQgPSBuZXcgQWN0aXZpdHlMb2dBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLWFjdGl2aXR5LWxvZy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzLnB1c2goYWN0aXZpdHlMb2dBbGVydCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNPVVJDRSBNQU5BR0VNRU5UIE1FVEhPRFMgKGZyb20gQXphcGlSZXNvdXJjZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc2VzXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIHNlbmQgdG8gdGhlIEF6dXJlIEFQSVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgcGFyZW50IHJlc291cmNlIElEIChlLmcuLCBzdWJzY3JpcHRpb24gb3IgcmVzb3VyY2UgZ3JvdXApXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsLCBjYW4gYmUgaW4gcHJvcGVydGllcylcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgQVpBUEkgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVBemFwaVJlc291cmNlKFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGFyZW50SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbG9jYXRpb24/OiBzdHJpbmcsXG4gICk6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlIHtcbiAgICAvLyBCdWlsZCB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBnZW5lcmF0ZWQgQVpBUEkgUmVzb3VyY2UgY2xhc3NcbiAgICBjb25zdCBjb25maWc6IFJlc291cmNlQ29uZmlnID0ge1xuICAgICAgdHlwZTogYCR7dGhpcy5fcmVzb3VyY2VUeXBlfUAke3RoaXMuYXBpVmVyc2lvbn1gLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBhcmVudElkOiBwYXJlbnRJZCxcbiAgICAgIGJvZHk6IHByb3BlcnRpZXMsXG4gICAgICAvLyBBZGQgbG9jYXRpb24gY29uZGl0aW9uYWxseSBpZiBwcm92aWRlZCBhbmQgbm90IGFscmVhZHkgaW4gcHJvcGVydGllc1xuICAgICAgLi4uKGxvY2F0aW9uICYmICFwcm9wZXJ0aWVzLmxvY2F0aW9uICYmIHsgbG9jYXRpb246IGxvY2F0aW9uIH0pLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYW5kIHJldHVybiB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc1xuICAgIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgXCJyZXNvdXJjZVwiLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVpBUEkgZGF0YSBzb3VyY2UgZm9yIHJlYWRpbmcgZXhpc3RpbmcgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gVGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgVGVycmFmb3JtIGRhdGEgc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQXphcGlEYXRhU291cmNlKFxuICAgIHJlc291cmNlSWQ6IHN0cmluZyxcbiAgKTogY2RrdGYuVGVycmFmb3JtRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlKHRoaXMsIFwiZGF0YVwiLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiYXphcGlfcmVzb3VyY2VcIixcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogXCJhemFwaVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRhdGFTb3VyY2UuYWRkT3ZlcnJpZGUoXCJ0eXBlXCIsIHRoaXMuX3Jlc291cmNlVHlwZSk7XG4gICAgZGF0YVNvdXJjZS5hZGRPdmVycmlkZShcInJlc291cmNlX2lkXCIsIHJlc291cmNlSWQpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVzb3VyY2Ugd2l0aCBuZXcgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBuZXcgcHJvcGVydGllcyB0byBhcHBseVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUF6YXBpUmVzb3VyY2UocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwiYm9keVwiLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbiB8fCB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlc291cmNlIGFzIGEgVGVycmFmb3JtIG91dHB1dCB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBvdXRwdXQoKTogY2RrdGYuVGVycmFmb3JtT3V0cHV0IHtcbiAgICByZXR1cm4gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm91dHB1dFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy50ZXJyYWZvcm1SZXNvdXJjZT8uZnFuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWNjZXNzIHJvbGUgYXNzaWdubWVudCBmb3IgYSBzcGVjaWZpZWQgQXp1cmUgQUQgb2JqZWN0XG4gICAqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIGNyZWF0ZXMgcm9sZSBhc3NpZ25tZW50cyB1c2luZyBBWkFQSSBpbnN0ZWFkIG9mIEF6dXJlUk0gcHJvdmlkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3RJZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQXp1cmUgQUQgb2JqZWN0XG4gICAqIEBwYXJhbSByb2xlRGVmaW5pdGlvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgQXp1cmUgUkJBQyByb2xlIHRvIGJlIGFzc2lnbmVkXG4gICAqL1xuICBwdWJsaWMgYWRkQWNjZXNzKG9iamVjdElkOiBzdHJpbmcsIHJvbGVEZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEF6YXBpUm9sZUFzc2lnbm1lbnQodGhpcywgYHJiYWMtJHtvYmplY3RJZH0tJHtyb2xlRGVmaW5pdGlvbk5hbWV9YCwge1xuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25OYW1lOiByb2xlRGVmaW5pdGlvbk5hbWUsXG4gICAgICBzY29wZTogdGhpcy5yZXNvdXJjZUlkLFxuICAgIH0pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgQ0xBU1NFUyBBTkQgSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBBWkFQSSByb2xlIGFzc2lnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBemFwaVJvbGVBc3NpZ25tZW50UHJvcHMge1xuICByZWFkb25seSBvYmplY3RJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBWkFQSS1iYXNlZCByb2xlIGFzc2lnbm1lbnQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBemFwaVJvbGVBc3NpZ25tZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF6YXBpUm9sZUFzc2lnbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgcHJpbmNpcGFsSWQ6IHByb3BzLm9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25JZDogYFtzdWJzY3JpcHRpb25SZXNvdXJjZUlkKCdNaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMnLCByb2xlRGVmaW5pdGlvbklkKCcke3Byb3BzLnJvbGVEZWZpbml0aW9uTmFtZX0nKSldYCxcbiAgICAgIHNjb3BlOiBwcm9wcy5zY29wZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnOiBSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZUFzc2lnbm1lbnRzXCIsXG4gICAgICBuYW1lOiBcIltndWlkKCldXCIsXG4gICAgICBwYXJlbnRJZDogcHJvcHMuc2NvcGUsXG4gICAgICBib2R5OiBwcm9wZXJ0aWVzLFxuICAgIH07XG4gICAgbmV3IFJlc291cmNlKHRoaXMsIFwicm9sZS1hc3NpZ25tZW50XCIsIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
742
+ AzapiRoleAssignment[_b] = { fqn: "@microsoft/terraform-cdk-constructs.AzapiRoleAssignment", version: "1.3.0" };
743
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS1henVyZS9saWIvYXphcGkvYXphcGktcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILCtCQUErQjtBQUMvQiwyQ0FBdUM7QUFDdkMseUZBQW1GO0FBQ25GLHlEQUFzRTtBQUN0RSwyRUFBc0U7QUFDdEUseUVBQW9FO0FBT3BFLGdGQUEyRTtBQTRMM0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILE1BQXNCLGFBQWMsU0FBUSxzQkFBUztJQUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ08sTUFBTSxDQUFDLGVBQWUsQ0FDOUIsWUFBb0IsRUFDcEIsUUFBeUI7UUFFekIsdUNBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUE2QkQ7Ozs7O09BS0c7SUFDSCxJQUFXLEVBQUU7UUFDWCxPQUFPLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2hELENBQUM7SUEyREQ7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNEIsRUFBRTtRQUN0RSxnQ0FBZ0M7UUFDaEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQWxCbkIsdURBQXVEO1FBQ3BDLDJCQUFzQixHQUFnQixFQUFFLENBQUM7UUFDekMsMkJBQXNCLEdBQWdCLEVBQUUsQ0FBQztRQUN6QyxnQ0FBMkIsR0FBZ0IsRUFBRSxDQUFDO1FBaUIvRCxrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFX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QUFlRDs7R0FFRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMzQixnQkFBZ0IsRUFBRSx3RkFBd0YsS0FBSyxDQUFDLGtCQUFrQixNQUFNO1lBQ3hJLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztTQUNuQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQW1CO1lBQzdCLElBQUksRUFBRSx5Q0FBeUM7WUFDL0MsSUFBSSxFQUFFLFVBQVU7WUFDaEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ3JCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUM7UUFDRixJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7O0FBakJILGtEQWtCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXphcGlSZXNvdXJjZSAtIEEgdW5pZmllZCBmcmFtZXdvcmsgZm9yIHZlcnNpb24tYXdhcmUgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudFxuICpcbiAqIFRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyBwcm92aWRlcyBhIHNlbGYtY29udGFpbmVkIHVuaWZpZWQgZnJhbWV3b3JrIGFwcHJvYWNoXG4gKiBmb3IgQXp1cmUgcmVzb3VyY2UgbWFuYWdlbWVudCB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYS1kcml2ZW5cbiAqIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uLCBhbmQgbWlncmF0aW9uIGFuYWx5c2lzIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uIHdoZW4gbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAqIC0gU3VwcG9ydCBmb3IgZXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nIGZvciBzdGFiaWxpdHlcbiAqIC0gU2NoZW1hLWRyaXZlbiBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIHZlcnNpb25zXG4gKiAtIE1pZ3JhdGlvbiBhbmFseXNpcyBhbmQgZGVwcmVjYXRpb24gd2FybmluZ3NcbiAqIC0gQnVpbHQtaW4gcm9sZSBhc3NpZ25tZW50IGFuZCBkaWFnbm9zdGljIHNldHRpbmdzIHN1cHBvcnRcbiAqIC0gSlNJSS1jb21wbGlhbnQgZGVzaWduIGZvciBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0XG4gKlxuICogVGhpcyBjbGFzcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgZHVhbC1jbGFzcyBhcHByb2FjaCAoQXphcGlSZXNvdXJjZSArIEF6YXBpUmVzb3VyY2UpXG4gKiB3aXRoIGEgc2luZ2xlLCBzZWxmLWNvbnRhaW5lZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgYWxsIHJlc291cmNlIG1hbmFnZW1lbnQgbmVlZHMuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRGF0YUF6YXBpQ2xpZW50Q29uZmlnIH0gZnJvbSBcIi4vcHJvdmlkZXJzLWF6YXBpL2RhdGEtYXphcGktY2xpZW50LWNvbmZpZ1wiO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFJlc291cmNlQ29uZmlnIH0gZnJvbSBcIi4vcHJvdmlkZXJzLWF6YXBpL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVNjaGVtYVZhbGlkYXRvciB9IGZyb20gXCIuL3Jlc291cmNlLXNjaGVtYS12YWxpZGF0b3JcIjtcbmltcG9ydCB7IFJlc291cmNlVmVyc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi9yZXNvdXJjZS12ZXJzaW9uLW1hbmFnZXJcIjtcblxuLy8gVHlwZS1vbmx5IGltcG9ydHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkdyb3VwUHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtYWN0aW9uZ3JvdXAvbGliL2FjdGlvbi1ncm91cFwiO1xuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eUxvZ0FsZXJ0UHJvcHMgfSBmcm9tIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCI7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWNTZXR0aW5nc1Byb3BzIH0gZnJvbSBcIi4uLy4uLy4uL2F6dXJlLWRpYWdub3N0aWNzZXR0aW5ncy9saWIvZGlhZ25vc3RpYy1zZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNBbGVydFByb3BzIH0gZnJvbSBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIjtcbmltcG9ydCB7IEFwaVZlcnNpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL3ZlcnNpb24tbWFuYWdlci9hcGktdmVyc2lvbi1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBcGlTY2hlbWEsXG4gIFZlcnNpb25Db25maWcsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG4gIE1pZ3JhdGlvbkFuYWx5c2lzLFxufSBmcm9tIFwiLi4vdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogUmV0ZW50aW9uIHBvbGljeSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0ZW50aW9uUG9saWN5Q29uZmlnIHtcbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGF5czogbnVtYmVyO1xufVxuXG4vKipcbiAqIExvZyBjb25maWd1cmF0aW9uIGZvciBkaWFnbm9zdGljIHNldHRpbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlhZ25vc3RpY0xvZ0NvbmZpZyB7XG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xuICByZWFkb25seSBjYXRlZ29yeUdyb3VwPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSByZXRlbnRpb25Qb2xpY3k/OiBSZXRlbnRpb25Qb2xpY3lDb25maWc7XG59XG5cbi8qKlxuICogTWV0cmljIGNvbmZpZ3VyYXRpb24gZm9yIGRpYWdub3N0aWMgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljTWV0cmljQ29uZmlnIHtcbiAgLyoqIE1ldHJpYyBjYXRlZ29yeSBuYW1lICh1c2VkIGluIG5ld2VyIEFQSSB2ZXJzaW9ucykgKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKiBUaW1lIGdyYWluIGZvciBtZXRyaWNzIGluIElTTyA4NjAxIGR1cmF0aW9uIGZvcm1hdCAodXNlZCBpbiBBUEkgdmVyc2lvbiAyMDE2LTA5LTAxLCBlLmcuLCBcIlBUMU1cIikgKi9cbiAgcmVhZG9ubHkgdGltZUdyYWluPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVkOiBib29sZWFuO1xuICByZWFkb25seSByZXRlbnRpb25Qb2xpY3k/OiBSZXRlbnRpb25Qb2xpY3lDb25maWc7XG59XG5cbi8qKlxuICogTW9uaXRvcmluZyBjb25maWd1cmF0aW9uIGZvciBBenVyZSByZXNvdXJjZXNcbiAqXG4gKiBQcm92aWRlcyBpbnRlZ3JhdGVkIG1vbml0b3JpbmcgY2FwYWJpbGl0aWVzIGluY2x1ZGluZyBkaWFnbm9zdGljIHNldHRpbmdzLFxuICogbWV0cmljIGFsZXJ0cywgYW5kIGFjdGl2aXR5IGxvZyBhbGVydHMuIEFsbCBtb25pdG9yaW5nIGlzIG9wdGlvbmFsIGFuZFxuICogZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbW9uaXRvcmluZyBpcyBlbmFibGVkXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpYWdub3N0aWMgc2V0dGluZ3MgY29uZmlndXJhdGlvblxuICAgKiBVc2VzIHRoZSBmdWxsIERpYWdub3N0aWNTZXR0aW5ncyBjb25zdHJ1Y3QgZm9yIGNvbnNpc3RlbmN5XG4gICAqL1xuICByZWFkb25seSBkaWFnbm9zdGljU2V0dGluZ3M/OiBEaWFnbm9zdGljU2V0dGluZ3NQcm9wcztcblxuICAvKipcbiAgICogQWN0aW9uIGdyb3VwcyB0byBjcmVhdGUgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICogQ3JlYXRlcyBuZXcgQWN0aW9uR3JvdXAgaW5zdGFuY2VzIGFzIGNoaWxkIGNvbnN0cnVjdHNcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbkdyb3Vwcz86IEFjdGlvbkdyb3VwUHJvcHNbXTtcblxuICAvKipcbiAgICogTWV0cmljIGFsZXJ0cyBjb25maWd1cmF0aW9uXG4gICAqIENyZWF0ZXMgTWV0cmljQWxlcnQgaW5zdGFuY2VzIHNjb3BlZCB0byB0aGlzIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNBbGVydHM/OiBNZXRyaWNBbGVydFByb3BzW107XG5cbiAgLyoqXG4gICAqIEFjdGl2aXR5IGxvZyBhbGVydHMgY29uZmlndXJhdGlvblxuICAgKiBDcmVhdGVzIEFjdGl2aXR5TG9nQWxlcnQgaW5zdGFuY2VzIGZvciB0aGlzIHJlc291cmNlJ3Mgb3BlcmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZpdHlMb2dBbGVydHM/OiBBY3Rpdml0eUxvZ0FsZXJ0UHJvcHNbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB2ZXJzaW9uZWQgQXp1cmUgcmVzb3VyY2VzXG4gKlxuICogQ29tYmluZXMgYmFzZSByZXNvdXJjZSBwcm9wZXJ0aWVzIHdpdGggdmVyc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllc1xuICogYW5kIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHVuaWZpZWQgZnJhbWV3b3JrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF6YXBpUmVzb3VyY2VQcm9wcyBleHRlbmRzIGNka3RmLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc291cmNlIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIExvY2F0aW9uIGhhbmRsaW5nIHZhcmllcyBieSByZXNvdXJjZSB0eXBlOlxuICAgKiAtICoqVG9wLWxldmVsIHJlc291cmNlcyoqOiBNb3N0IHJlcXVpcmUgYW4gZXhwbGljaXQgbG9jYXRpb24gKGUuZy4sIFwiZWFzdHVzXCIsIFwid2VzdHVzXCIpXG4gICAqIC0gKipHbG9iYWwgcmVzb3VyY2VzKio6IFNvbWUgdXNlIFwiZ2xvYmFsXCIgYXMgbG9jYXRpb24gKGUuZy4sIFByaXZhdGUgRE5TIFpvbmVzKVxuICAgKiAtICoqQ2hpbGQgcmVzb3VyY2VzKio6IEluaGVyaXQgbG9jYXRpb24gZnJvbSBwYXJlbnQgYW5kIHNob3VsZCBOT1Qgc2V0IHRoaXMgcHJvcGVydHlcbiAgICpcbiAgICogRWFjaCByZXNvdXJjZSB0eXBlIG1heSBwcm92aWRlIGl0cyBvd24gZGVmYXVsdCB0aHJvdWdoIHRoZSBgcmVzb2x2ZUxvY2F0aW9uKClgIG1ldGhvZC5cbiAgICogSWYgbm8gbG9jYXRpb24gaXMgc3BlY2lmaWVkIGFuZCBubyBkZWZhdWx0IGV4aXN0cywgcmVzb3VyY2UgY3JlYXRpb24gbWF5IGZhaWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEV4cGxpY2l0IGxvY2F0aW9uIGZvciBtb3N0IHJlc291cmNlc1xuICAgKiBsb2NhdGlvbjogXCJlYXN0dXNcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBHbG9iYWwgcmVzb3VyY2UgKFByaXZhdGUgRE5TIFpvbmUpXG4gICAqIGxvY2F0aW9uOiBcImdsb2JhbFwiXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENoaWxkIHJlc291cmNlIChTdWJuZXQpIC0gZG8gbm90IHNldCBsb2NhdGlvblxuICAgKiAvLyBsb2NhdGlvbjogdW5kZWZpbmVkIChpbmhlcml0ZWQgZnJvbSBwYXJlbnQgVmlydHVhbCBOZXR3b3JrKVxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIFZhcmllcyBieSByZXNvdXJjZSB0eXBlIC0gc2VlIHNwZWNpZmljIHJlc291cmNlIGRvY3VtZW50YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIGFwcGx5IHRvIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBBUEkgdmVyc2lvbiB0byB1c2UgZm9yIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQuXG4gICAqIFVzZSB0aGlzIGZvciB2ZXJzaW9uIHBpbm5pbmcgd2hlbiBzdGFiaWxpdHkgaXMgcmVxdWlyZWQgb3ZlciBsYXRlc3QgZmVhdHVyZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiMjAyNC0xMS0wMVwiXG4gICAqIEBkZWZhdWx0VmFsdWUgTGF0ZXN0IGFjdGl2ZSB2ZXJzaW9uIGZyb20gQXBpVmVyc2lvbk1hbmFnZXJcbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIG1pZ3JhdGlvbiBhbmFseXNpcyB3YXJuaW5nc1xuICAgKlxuICAgKiBXaGVuIHRydWUsIHRoZSBmcmFtZXdvcmsgd2lsbCBhbmFseXplIHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGRlcHJlY2F0aW9uXG4gICAqIHN0YXR1cyBhbmQgcHJvdmlkZSBtaWdyYXRpb24gcmVjb21tZW5kYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVNaWdyYXRpb25BbmFseXNpcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBhZ2FpbnN0IHRoZSBzY2hlbWFcbiAgICpcbiAgICogV2hlbiB0cnVlLCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBBUEkgc2NoZW1hIGJlZm9yZVxuICAgKiByZXNvdXJjZSBjcmVhdGlvbi4gVmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBjYXVzZSBkZXBsb3ltZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVZhbGlkYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFwcGx5IHByb3BlcnR5IHRyYW5zZm9ybWF0aW9ucyBhdXRvbWF0aWNhbGx5XG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgcHJvcGVydGllcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZVxuICAgKiB0YXJnZXQgc2NoZW1hJ3MgdHJhbnNmb3JtYXRpb24gcnVsZXMuIFRoaXMgZW5hYmxlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVRyYW5zZm9ybWF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTW9uaXRvcmluZyBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlc291cmNlXG4gICAqXG4gICAqIEVuYWJsZXMgaW50ZWdyYXRlZCBtb25pdG9yaW5nIHdpdGggZGlhZ25vc3RpYyBzZXR0aW5ncywgbWV0cmljIGFsZXJ0cyxcbiAgICogYW5kIGFjdGl2aXR5IGxvZyBhbGVydHMuIEFsbCBtb25pdG9yaW5nIGlzIG9wdGlvbmFsIGFuZCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBtb25pdG9yaW5nOiB7XG4gICAqICAgZW5hYmxlZDogdHJ1ZSxcbiAgICogICBkaWFnbm9zdGljU2V0dGluZ3M6IHtcbiAgICogICAgIHdvcmtzcGFjZUlkOiBsb2dBbmFseXRpY3MuaWQsXG4gICAqICAgICBtZXRyaWNzOiBbJ0FsbE1ldHJpY3MnXSxcbiAgICogICAgIGxvZ3M6IFsnQXVkaXRMb2dzJ11cbiAgICogICB9LFxuICAgKiAgIG1ldHJpY0FsZXJ0czogW3tcbiAgICogICAgIG5hbWU6ICdoaWdoLWNwdS1hbGVydCcsXG4gICAqICAgICBzZXZlcml0eTogMixcbiAgICogICAgIHNjb3BlczogW10sIC8vIEF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICogICAgIGNyaXRlcmlhOiB7IC4uLiB9LFxuICAgKiAgICAgYWN0aW9uczogW3sgYWN0aW9uR3JvdXBJZDogYWN0aW9uR3JvdXAuaWQgfV1cbiAgICogICB9XVxuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogTW9uaXRvcmluZ0NvbmZpZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2ZXJzaW9uLWF3YXJlIEF6dXJlIHJlc291cmNlIG1hbmFnZW1lbnRcbiAqXG4gKiBBemFwaVJlc291cmNlIHByb3ZpZGVzIGEgdW5pZmllZCBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIEF6dXJlIHJlc291cmNlc1xuICogd2l0aCBhdXRvbWF0aWMgdmVyc2lvbiBtYW5hZ2VtZW50LCBzY2hlbWEgdmFsaWRhdGlvbiwgcHJvcGVydHkgdHJhbnNmb3JtYXRpb24sXG4gKiBhbmQgbWlncmF0aW9uIGFuYWx5c2lzLiBJdCBleHRlbmRzIHRoZSBleGlzdGluZyBBemFwaVJlc291cmNlIGNsYXNzIHdoaWxlXG4gKiBtYWludGFpbmluZyBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb3JlIGZyYW1ld29yayB0aGF0IGVuYWJsZXM6XG4gKiAtIEF1dG9tYXRpYyByZXNvbHV0aW9uIG9mIHRoZSBsYXRlc3QgQVBJIHZlcnNpb24gd2hlbiBub25lIGlzIHNwZWNpZmllZFxuICogLSBFeHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIGVudmlyb25tZW50cyByZXF1aXJpbmcgc3RhYmlsaXR5XG4gKiAtIFNjaGVtYS1kcml2ZW4gcHJvcGVydHkgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb25cbiAqIC0gTWlncmF0aW9uIGFuYWx5c2lzIHdpdGggYnJlYWtpbmcgY2hhbmdlIGRldGVjdGlvblxuICogLSBEZXByZWNhdGlvbiB3YXJuaW5ncyBhbmQgdXBncmFkZSByZWNvbW1lbmRhdGlvbnNcbiAqXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2RzIHRvIHByb3ZpZGUgcmVzb3VyY2Utc3BlY2lmaWNcbiAqIGNvbmZpZ3VyYXRpb24gd2hpbGUgdGhlIGZyYW1ld29yayBoYW5kbGVzIGFsbCB2ZXJzaW9uIG1hbmFnZW1lbnQgY29tcGxleGl0eS5cbiAqXG4gKiBAZXhhbXBsZSBCYXNpYyB1c2FnZSB3aXRoIGF1dG9tYXRpYyB2ZXJzaW9uIHJlc29sdXRpb246XG4gKiBjbGFzcyBNeVJlc291cmNlIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gKiAgIHByb3RlY3RlZCBnZXREZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBcIjIwMjQtMTEtMDFcIjsgLy8gZmFsbGJhY2sgaWYgbm8gdmVyc2lvbnMgcmVnaXN0ZXJlZFxuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgZ2V0UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiO1xuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgZ2V0QXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gKiAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICogICB9XG4gKlxuICogICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICogICAgIHJldHVybiB7IGxvY2F0aW9uOiBwcm9wcy5sb2NhdGlvbiwgdGFnczogcHJvcHMudGFncyB8fCB7fSB9O1xuICogICB9XG4gKiB9XG4gKlxuICogQGV4YW1wbGUgVXNhZ2Ugd2l0aCBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmc6XG4gKiBuZXcgTXlSZXNvdXJjZSh0aGlzLCBcInJlc291cmNlXCIsIHtcbiAqICAgbmFtZTogXCJteS1yZXNvdXJjZVwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgYXBpVmVyc2lvbjogXCIyMDI0LTAxLTAxXCIgLy8gUGluIHRvIHNwZWNpZmljIHZlcnNpb25cbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBemFwaVJlc291cmNlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFN0YXRpYyBoZWxwZXIgZm9yIGNoaWxkIGNsYXNzZXMgdG8gcmVnaXN0ZXIgdGhlaXIgc2NoZW1hcyBpbiBzdGF0aWMgaW5pdGlhbGl6ZXJzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gYSBzdGF0aWMgaW5pdGlhbGl6ZXIgYmxvY2sgb2YgZWFjaCBjaGlsZCBjbGFzc1xuICAgKiB0byByZWdpc3RlciBhbGwgc3VwcG9ydGVkIEFQSSB2ZXJzaW9ucyBhbmQgdGhlaXIgc2NoZW1hcyB3aXRoIHRoZSBBcGlWZXJzaW9uTWFuYWdlci5cbiAgICogVGhlIHN0YXRpYyBibG9jayBydW5zIG9uY2Ugd2hlbiB0aGUgY2xhc3MgaXMgZmlyc3QgbG9hZGVkLCBlbnN1cmluZyBzY2hlbWFzIGFyZVxuICAgKiByZWdpc3RlcmVkIGJlZm9yZSBhbnkgaW5zdGFuY2VzIGFyZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIC0gVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0Lk5ldHdvcmsvdmlydHVhbE5ldHdvcmtzXCIpXG4gICAqIEBwYXJhbSB2ZXJzaW9ucyAtIEFycmF5IG9mIHZlcnNpb24gY29uZmlndXJhdGlvbnMgY29udGFpbmluZyBzY2hlbWFzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHN0YXRpYyB7XG4gICAqICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAqICAgICBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrc1wiLFxuICAgKiAgICAgQUxMX1ZJUlRVQUxfTkVUV09SS19WRVJTSU9OU1xuICAgKiAgICk7XG4gICAqIH1cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcmVnaXN0ZXJTY2hlbWFzKFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIHZlcnNpb25zOiBWZXJzaW9uQ29uZmlnW10sXG4gICk6IHZvaWQge1xuICAgIEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCkucmVnaXN0ZXJSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlLCB2ZXJzaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIHR5cGUgKGUuZy4sIFwiTWljcm9zb2Z0LlJlc291cmNlcy9yZXNvdXJjZUdyb3Vwc1wiKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJIHZlcnNpb24gdG8gdXNlIGZvciB0aGlzIHJlc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZSE6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsIC0gbm90IGFsbCByZXNvdXJjZXMgaGF2ZSBhIGxvY2F0aW9uKVxuICAgKiBDaGlsZCByZXNvdXJjZXMgdHlwaWNhbGx5IGluaGVyaXQgbG9jYXRpb24gZnJvbSB0aGVpciBwYXJlbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2NhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEF6dXJlIHJlc291cmNlIElEXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBkZXJpdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtIHJlc291cmNlLlxuICAgKiBDaGlsZCBjbGFzc2VzIG5vIGxvbmdlciBuZWVkIHRvIGltcGxlbWVudCB0aGlzIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59LmlkfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIEFQSSB2ZXJzaW9uIGJlaW5nIHVzZWQgZm9yIHRoaXMgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhpcyBpcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBBenVyZSBBUEkgY2FsbCxcbiAgICogZWl0aGVyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHByb3BzIG9yIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQgdG9cbiAgICogdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlZEFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqXG4gICAqIENvbnRhaW5zIHRoZSBjb21wbGV0ZSBzY2hlbWEgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcHJvcGVydGllcywgdmFsaWRhdGlvblxuICAgKiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzIGZvciB0aGUgcmVzb2x2ZWQgQVBJIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgc2NoZW1hITogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKlxuICAgKiBDb250YWlucyBsaWZlY3ljbGUgaW5mb3JtYXRpb24sIGJyZWFraW5nIGNoYW5nZXMsIGFuZCBtaWdyYXRpb24gbWV0YWRhdGFcbiAgICogZm9yIHRoZSByZXNvbHZlZCBBUEkgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyB2ZXJzaW9uQ29uZmlnITogVmVyc2lvbkNvbmZpZztcblxuICAvKipcbiAgICogVmFsaWRhdGlvbiByZXN1bHRzIGZvciB0aGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKlxuICAgKiBBdmFpbGFibGUgYWZ0ZXIgY29uc3RydWN0aW9uIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4gQ29udGFpbnMgZGV0YWlsZWRcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgYW55IHZhbGlkYXRpb24gZXJyb3JzIG9yIHdhcm5pbmdzLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRpb25SZXN1bHQ/OiBWYWxpZGF0aW9uUmVzdWx0O1xuXG4gIC8qKlxuICAgKiBNaWdyYXRpb24gYW5hbHlzaXMgcmVzdWx0c1xuICAgKlxuICAgKiBBdmFpbGFibGUgYWZ0ZXIgY29uc3RydWN0aW9uIGlmIG1pZ3JhdGlvbiBhbmFseXNpcyBpcyBlbmFibGVkIGFuZCBhXG4gICAqIHByZXZpb3VzIHZlcnNpb24gY2FuIGJlIGRldGVybWluZWQgZm9yIGNvbXBhcmlzb24uXG4gICAqL1xuICBwdWJsaWMgbWlncmF0aW9uQW5hbHlzaXM/OiBNaWdyYXRpb25BbmFseXNpcztcblxuICAvLyBGcmFtZXdvcmsgY29tcG9uZW50c1xuICBwcml2YXRlIHJlYWRvbmx5IF9hcGlWZXJzaW9uTWFuYWdlcjogQXBpVmVyc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgX3ZlcnNpb25NYW5hZ2VyITogUmVzb3VyY2VWZXJzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBfc2NoZW1hVmFsaWRhdG9yITogUmVzb3VyY2VTY2hlbWFWYWxpZGF0b3I7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG11dGFibGUgdGFncyBzdG9yYWdlIHNlcGFyYXRlIGZyb20gaW5wdXQgcHJvcHNcbiAgICogQ29tYmluZXMgcHJvcHMudGFncyB3aXRoIGR5bmFtaWNhbGx5IGFkZGVkIHRhZ3MgdmlhIGFkZFRhZygpXG4gICAqL1xuICBwcml2YXRlIF90YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8vIE1vbml0b3JpbmcgcmVzb3VyY2VzIChwcm90ZWN0ZWQgZm9yIHN1YmNsYXNzIGFjY2VzcylcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbml0b3JpbmdBY3Rpb25Hcm91cHM6IENvbnN0cnVjdFtdID0gW107XG4gIHByb3RlY3RlZCByZWFkb25seSBtb25pdG9yaW5nTWV0cmljQWxlcnRzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzOiBDb25zdHJ1Y3RbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF6YXBpUmVzb3VyY2UgaW5zdGFuY2VcbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIGhhbmRsZXMgYWxsIGZyYW1ld29yayBpbml0aWFsaXphdGlvbiBpbmNsdWRpbmcgdmVyc2lvbiByZXNvbHV0aW9uLFxuICAgKiBzY2hlbWEgbG9hZGluZywgcHJvcGVydHkgdmFsaWRhdGlvbiwgdHJhbnNmb3JtYXRpb24sIGFuZCBtaWdyYXRpb24gYW5hbHlzaXMuXG4gICAqIEl0IG1haW50YWlucyBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQXphcGlSZXNvdXJjZSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFuY2VcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMgPSB7fSkge1xuICAgIC8vIEluaXRpYWxpemUgdGhlIGJhc2UgQ29uc3RydWN0XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEluaXRpYWxpemUgYmFzaWMgcHJvcGVydGllcyB0aGF0IGRvbid0IHJlcXVpcmUgYWJzdHJhY3QgbWV0aG9kc1xuICAgIC8vIFVzZSBwcm9wcy5uYW1lIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGNvbnN0cnVjdCBJRFxuICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBleHBsaWNpdCBuYW1pbmcgYW5kIGF1dG9tYXRpYyBJRC1iYXNlZCBuYW1pbmdcbiAgICB0aGlzLm5hbWUgPSB0aGlzLnJlc29sdmVOYW1lKHByb3BzKTtcbiAgICB0aGlzLmxvY2F0aW9uID0gdGhpcy5yZXNvbHZlTG9jYXRpb24ocHJvcHMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgQVBJIHZlcnNpb24gbWFuYWdlclxuICAgIHRoaXMuX2FwaVZlcnNpb25NYW5hZ2VyID0gQXBpVmVyc2lvbk1hbmFnZXIuaW5zdGFuY2UoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGFncyBzdG9yYWdlIHdpdGggZW1wdHkgb2JqZWN0ICh3aWxsIGJlIHBvcHVsYXRlZCBpbiBpbml0aWFsaXplKCkpXG4gICAgdGhpcy5fdGFncyA9IHt9O1xuXG4gICAgLy8gTm90ZTogV2UgY2Fubm90IGluaXRpYWxpemUgdmVyc2lvbiBtYW5hZ2VyIGhlcmUgYmVjYXVzZSBpdCByZXF1aXJlc1xuICAgIC8vIGNhbGxpbmcgYWJzdHJhY3QgbWV0aG9kcyAocmVzb3VyY2VUeXBlKCkgYW5kIGRlZmF1bHRWZXJzaW9uKCkpXG4gICAgLy8gd2hpY2ggYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIGluIHRoZSBiYXNlIGNvbnN0cnVjdG9yLlxuICAgIC8vIFZlcnNpb24gcmVzb2x1dGlvbiBpcyBkZWZlcnJlZCB0byBpbml0aWFsaXplKCkgbWV0aG9kLlxuXG4gICAgLy8gU3RlcCAxOiBSZXNvbHZlIHRoZSBBUEkgdmVyc2lvbiB0byB1c2UgKGRvZXNuJ3QgY2FsbCBhYnN0cmFjdCBtZXRob2RzIHlldClcbiAgICAvLyBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGJlIHByb3Blcmx5IHNldCBpbiBpbml0aWFsaXplKClcbiAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbiA9IHByb3BzLmFwaVZlcnNpb24gfHwgXCJcIjtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbjtcblxuICAgIC8vIFN0ZXAgMjogQ2FsbCBpbml0aWFsaXplKCkgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgY2hpbGQgY2xhc3MgaXMgcmVhZHlcbiAgICB0aGlzLmluaXRpYWxpemUocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBpbml0aWFsaXphdGlvbiBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBjb21wbGV0ZXNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnN0cnVjdG9yIHRvIHBlcmZvcm0gaW5pdGlhbGl6YXRpb25cbiAgICogdGhhdCByZXF1aXJlcyBjYWxsaW5nIGFic3RyYWN0IG1ldGhvZHMuIENoaWxkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kXG4gICAqIGlmIHRoZXkgbmVlZCB0byBleHRlbmQgaW5pdGlhbGl6YXRpb24gbG9naWMsIGJ1dCB0aGV5IE1VU1QgY2FsbCBzdXBlci5pbml0aWFsaXplKHByb3BzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiB2b2lkIHtcbiAgICAvLyBTdGVwIDI6IFNldCByZXF1aXJlZCBhYnN0cmFjdCBwcm9wZXJ0aWVzIChub3cgc2FmZSB0byBjYWxsIGFic3RyYWN0IG1ldGhvZHMpXG4gICAgdGhpcy5fcmVzb3VyY2VUeXBlID0gdGhpcy5yZXNvdXJjZVR5cGUoKTtcblxuICAgIC8vIFN0ZXAgMzogSW5pdGlhbGl6ZSB0aGUgdmVyc2lvbiBtYW5hZ2VyIGFuZCByZXNvbHZlIHRoZSBBUEkgdmVyc2lvblxuICAgIHRoaXMuX3ZlcnNpb25NYW5hZ2VyID0gbmV3IFJlc291cmNlVmVyc2lvbk1hbmFnZXIoXG4gICAgICB0aGlzLl9yZXNvdXJjZVR5cGUsXG4gICAgICB0aGlzLmRlZmF1bHRWZXJzaW9uKCksXG4gICAgKTtcbiAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLnJlc29sdmVBcGlWZXJzaW9uKFxuICAgICAgcHJvcHMuYXBpVmVyc2lvbixcbiAgICApO1xuICAgIHRoaXMuYXBpVmVyc2lvbiA9IHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uO1xuXG4gICAgLy8gU3RlcCAzLjU6IEluaXRpYWxpemUgdGFncyBmcm9tIHByb3BzXG4gICAgLy8gVGhpcyBjcmVhdGVzIGEgbXV0YWJsZSBjb3B5IHNlcGFyYXRlIGZyb20gdGhlIHJlYWRvbmx5IHByb3BzXG4gICAgdGhpcy5fdGFncyA9IHsgLi4uKHByb3BzLnRhZ3MgfHwge30pIH07XG5cbiAgICAvLyBTdGVwIDQ6IExvYWQgdGhlIHNjaGVtYSBhbmQgdmVyc2lvbiBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICB0aGlzLnNjaGVtYSA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLnNjaGVtYUZvclZlcnNpb24oXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb25Db25maWcgPSB0aGlzLl92ZXJzaW9uTWFuYWdlci52ZXJzaW9uQ29uZmlnKFxuICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgKTtcblxuICAgIGlmICghdmVyc2lvbkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmVyc2lvbiBjb25maWd1cmF0aW9uIG5vdCBmb3VuZCBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfUAke3RoaXMucmVzb2x2ZWRBcGlWZXJzaW9ufS4gYCArXG4gICAgICAgICAgYFBsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBBcGlWZXJzaW9uTWFuYWdlci5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52ZXJzaW9uQ29uZmlnID0gdmVyc2lvbkNvbmZpZztcblxuICAgIC8vIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc2NoZW1hIHZhbGlkYXRvclxuICAgIHRoaXMuX3NjaGVtYVZhbGlkYXRvciA9IG5ldyBSZXNvdXJjZVNjaGVtYVZhbGlkYXRvcih0aGlzLnNjaGVtYSk7XG5cbiAgICAvLyBTdGVwIDY6IFByb2Nlc3MgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHRoaXMuX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzKTtcblxuICAgIC8vIFN0ZXAgNzogUGVyZm9ybSB2YWxpZGF0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVmFsaWRhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9XG4gICAgICAgIHRoaXMuX3NjaGVtYVZhbGlkYXRvci52YWxpZGF0ZVByb3BzKHByb2Nlc3NlZFByb3BzKTtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUHJvcGVydHkgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7dGhpcy5yZXNvdXJjZVR5cGUoKX06XFxuYCArXG4gICAgICAgICAgICB0aGlzLl9zY2hlbWFWYWxpZGF0b3JcbiAgICAgICAgICAgICAgLmZvcm1hdFZhbGlkYXRpb25FcnJvcnModGhpcy52YWxpZGF0aW9uUmVzdWx0KVxuICAgICAgICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDg6IFBlcmZvcm0gbWlncmF0aW9uIGFuYWx5c2lzIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlTWlncmF0aW9uQW5hbHlzaXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzID0gdGhpcy5fcGVyZm9ybU1pZ3JhdGlvbkFuYWx5c2lzKCk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCA5OiBDcmVhdGUgdGhlIEF6dXJlIHJlc291cmNlXG4gICAgdGhpcy5fY3JlYXRlQXp1cmVSZXNvdXJjZShwcm9jZXNzZWRQcm9wcyk7XG5cbiAgICAvLyBTdGVwIDEwOiBDcmVhdGUgbW9uaXRvcmluZyByZXNvdXJjZXMgaWYgY29uZmlndXJlZFxuICAgIC8vIE5vdGU6IE1vbml0b3JpbmcgcmVzb3VyY2VzIGFyZSBjcmVhdGVkIGxhemlseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAgICBpZiAocHJvcHMubW9uaXRvcmluZykge1xuICAgICAgdm9pZCB0aGlzLmNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMocHJvcHMubW9uaXRvcmluZyk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAxMTogTG9nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICB0aGlzLl9sb2dGcmFtZXdvcmtNZXNzYWdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIHNlbnNpYmxlIGRlZmF1bHQgdmVyc2lvbiB0aGF0IGNhbiBiZSB1c2VkXG4gICAqIGFzIGEgZmFsbGJhY2sgaWYgdGhlIEFwaVZlcnNpb25NYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBhbnkgdmVyc2lvbnMgcmVnaXN0ZXJlZFxuICAgKiBmb3IgdGhpcyByZXNvdXJjZSB0eXBlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBBUEkgdmVyc2lvbiBzdHJpbmcgKGUuZy4sIFwiMjAyNC0xMS0wMVwiKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZztcblxuICAvKipcbiAgICogR2V0cyB0aGUgQXp1cmUgcmVzb3VyY2UgdHlwZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBmdWxsIEF6dXJlIHJlc291cmNlIHR5cGUgaWRlbnRpZmllciB0aGF0XG4gICAqIHdpbGwgYmUgdXNlZCBmb3IgQVBJIGNhbGxzIGFuZCB2ZXJzaW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBBenVyZSByZXNvdXJjZSB0eXBlIChlLmcuLCBcIk1pY3Jvc29mdC5SZXNvdXJjZXMvcmVzb3VyY2VHcm91cHNcIilcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZXNvdXJjZVR5cGUoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBjb21wbGV0ZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvbixcbiAgICogaW5jbHVkaW5nIGFsbCBwcm9wZXJ0eSBkZWZpbml0aW9ucywgdmFsaWRhdGlvbiBydWxlcywgYW5kIHRyYW5zZm9ybWF0aW9uXG4gICAqIG1hcHBpbmdzLiBVc2UgdGhlIHJlc29sdmVTY2hlbWEoKSBoZWxwZXIgbWV0aG9kIGZvciBzdGFuZGFyZCBzY2hlbWEgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBzY2hlbWEgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYTtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCB0cmFuc2Zvcm0gdGhlIGlucHV0IHByb3BlcnRpZXMgaW50byB0aGUgSlNPTiBib2R5IGZvcm1hdFxuICAgKiBleHBlY3RlZCBieSB0aGUgQXp1cmUgUkVTVCBBUEkgZm9yIHRoZSByZXNvbHZlZCB2ZXJzaW9uLiBUaGUgZnJhbWV3b3JrIHdpbGxcbiAgICogaGF2ZSBhbHJlYWR5IGFwcGxpZWQgYW55IG5lY2Vzc2FyeSBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbnMgYW5kIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBwcm9jZXNzZWQgYW5kIHZhbGlkYXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgcmVzb3VyY2VcbiAgICogQHJldHVybnMgVGhlIHJlc291cmNlIGJvZHkgb2JqZWN0IHRvIHNlbmQgdG8gQXp1cmUgQVBJXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnk7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIGNoaWxkIGNsYXNzZXMgdG8gcHJvdmlkZSBkZWZhdWx0IGxvY2F0aW9uXG4gICAqIEByZXR1cm5zIERlZmF1bHQgbG9jYXRpb24gb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVmYXVsdExvY2F0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBjaGlsZCBjbGFzc2VzIHRvIGluZGljYXRlIGlmIGxvY2F0aW9uIGlzIHJlcXVpcmVkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbG9jYXRpb24gaXMgbWFuZGF0b3J5IGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBjaGlsZCBjbGFzc2VzIHRvIHNwZWNpZnkgcGFyZW50IHJlc291cmNlIGZvciBsb2NhdGlvbiBpbmhlcml0YW5jZVxuICAgKiBAcmV0dXJucyBQYXJlbnQgcmVzb3VyY2Ugb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyZW50UmVzb3VyY2VGb3JMb2NhdGlvbigpOiBBemFwaVJlc291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGxvY2F0aW9uIHVzaW5nIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuXG4gICAqIFByaW9yaXR5OiBwcm9wcy5sb2NhdGlvbiA+IHBhcmVudCBsb2NhdGlvbiA+IGRlZmF1bHQgbG9jYXRpb24gPiB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUxvY2F0aW9uKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIDEuIEV4cGxpY2l0IGxvY2F0aW9uIGluIHByb3BzXG4gICAgaWYgKHByb3BzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gcHJvcHMubG9jYXRpb247XG4gICAgfVxuXG4gICAgLy8gMi4gSW5oZXJpdCBmcm9tIHBhcmVudCByZXNvdXJjZVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50UmVzb3VyY2VGb3JMb2NhdGlvbigpO1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gcGFyZW50LmxvY2F0aW9uO1xuICAgIH1cblxuICAgIC8vIDMuIFVzZSBjaGlsZCBjbGFzcyBkZWZhdWx0XG4gICAgY29uc3QgZGVmYXVsdExvYyA9IHRoaXMuZGVmYXVsdExvY2F0aW9uKCk7XG4gICAgaWYgKGRlZmF1bHRMb2MpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TG9jO1xuICAgIH1cblxuICAgIC8vIDQuIFZhbGlkYXRlIGlmIHJlcXVpcmVkXG4gICAgaWYgKHRoaXMucmVxdWlyZXNMb2NhdGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBMb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgJHt0aGlzLnJlc291cmNlVHlwZSgpfSBidXQgd2FzIG5vdCBwcm92aWRlZCBgICtcbiAgICAgICAgICBgYW5kIGNvdWxkIG5vdCBiZSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgcmVzb3VyY2UuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbmFtZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjZW50cmFsaXplcyBuYW1lIHJlc29sdXRpb24gbG9naWMuIEJ5IGRlZmF1bHQsIGl0IHVzZXMgdGhlXG4gICAqIHByb3ZpZGVkIG5hbWUgb3IgZmFsbHMgYmFjayB0byB0aGUgY29uc3RydWN0IElELlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgcmVzb3VyY2UgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVOYW1lKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wcy5uYW1lIHx8IHRoaXMubm9kZS5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciBzdGFuZGFyZCBzY2hlbWEgcmVzb2x1dGlvblxuICAgKlxuICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcmVzb2x2ZSB0aGUgc2NoZW1hIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAqIGZyb20gdGhlIEFwaVZlcnNpb25NYW5hZ2VyLiBUaGlzIHByb3ZpZGVzIGEgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gdGhhdFxuICAgKiBtb3N0IHJlc291cmNlcyBjYW4gdXNlIHdpdGhvdXQgY3VzdG9tIGxvZ2ljLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgc2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICBjb25zdCB2ZXJzaW9uQ29uZmlnID0gdGhpcy5fYXBpVmVyc2lvbk1hbmFnZXIudmVyc2lvbkNvbmZpZyhcbiAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICB0aGlzLnJlc29sdmVkQXBpVmVyc2lvbixcbiAgICApO1xuXG4gICAgaWYgKCF2ZXJzaW9uQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzb2x2ZSBzY2hlbWE6IHZlcnNpb24gY29uZmlndXJhdGlvbiBub3QgZm91bmQgZm9yIGAgK1xuICAgICAgICAgIGAke3RoaXMucmVzb3VyY2VUeXBlKCl9QCR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcnNpb25Db25maWcuc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhdGVzdCBhdmFpbGFibGUgdmVyc2lvbiBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiBsb2dpY1xuICAgKiBmb3IgdXNlIGluIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxhdGVzdCBhdmFpbGFibGUgdmVyc2lvbiwgb3IgdW5kZWZpbmVkIGlmIG5vbmUgZm91bmRcbiAgICovXG4gIHB1YmxpYyBsYXRlc3RWZXJzaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25NYW5hZ2VyXG4gICAgICA/IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oKVxuICAgICAgOiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5sYXRlc3RWZXJzaW9uKHRoaXMucmVzb3VyY2VUeXBlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHN1cHBvcnRlZCB2ZXJzaW9ucyBmb3IgdGhpcyByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdmVyc2lvbiByZWdpc3RyeSBmb3IgdXNlIGluXG4gICAqIHN1YmNsYXNzZXMgb3IgZXh0ZXJuYWwgdG9vbGluZy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc3VwcG9ydGVkIHZlcnNpb24gc3RyaW5ncywgc29ydGVkIGJ5IHJlbGVhc2UgZGF0ZVxuICAgKi9cbiAgcHVibGljIHN1cHBvcnRlZFZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbk1hbmFnZXJcbiAgICAgID8gdGhpcy5fdmVyc2lvbk1hbmFnZXIuc3VwcG9ydGVkVmVyc2lvbnMoKVxuICAgICAgOiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5zdXBwb3J0ZWRWZXJzaW9ucyh0aGlzLnJlc291cmNlVHlwZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyBtaWdyYXRpb24gZnJvbSBjdXJyZW50IHZlcnNpb24gdG8gYSB0YXJnZXQgdmVyc2lvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIGV4dGVybmFsIHRvb2xzIHRvIGFuYWx5emUgbWlncmF0aW9uIHJlcXVpcmVtZW50c1xuICAgKiBiZXR3ZWVuIHZlcnNpb25zIGZvciBwbGFubmluZyBhbmQgYXV0b21hdGlvbiBwdXJwb3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldFZlcnNpb24gLSBUaGUgdGFyZ2V0IHZlcnNpb24gdG8gYW5hbHl6ZSBtaWdyYXRpb24gdG9cbiAgICogQHJldHVybnMgRGV0YWlsZWQgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBhbmFseXplTWlncmF0aW9uVG8odGFyZ2V0VmVyc2lvbjogc3RyaW5nKTogTWlncmF0aW9uQW5hbHlzaXMge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5hbmFseXplTWlncmF0aW9uKFxuICAgICAgdGhpcy5yZXNvdXJjZVR5cGUoKSxcbiAgICAgIHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uLFxuICAgICAgdGFyZ2V0VmVyc2lvbixcbiAgICApO1xuICB9XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgSU1QTEVNRU5UQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgcHJvcGVydGllcyB0aHJvdWdoIHRoZSBmcmFtZXdvcmsgcGlwZWxpbmVcbiAgICovXG4gIHByaXZhdGUgX3Byb2Nlc3NQcm9wZXJ0aWVzKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBhbnkge1xuICAgIGxldCBwcm9jZXNzZWRQcm9wcyA9IHsgLi4ucHJvcHMgfTtcblxuICAgIC8vIEVuc3VyZSBuYW1lIGlzIHNldCBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgZm9yIHZhbGlkYXRpb24gdG8gd29yayBjb3JyZWN0bHlcbiAgICBpZiAoIXByb2Nlc3NlZFByb3BzLm5hbWUpIHtcbiAgICAgIHByb2Nlc3NlZFByb3BzLm5hbWUgPSB0aGlzLnJlc29sdmVOYW1lKHByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHZhbGlkYXRvclxuICAgIHByb2Nlc3NlZFByb3BzID0gdGhpcy5fc2NoZW1hVmFsaWRhdG9yLmFwcGx5RGVmYXVsdHMocHJvY2Vzc2VkUHJvcHMpO1xuXG4gICAgLy8gQXBwbHkgcHJvcGVydHkgdHJhbnNmb3JtYXRpb25zIGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlVHJhbnNmb3JtYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICAvLyBGb3IgdHJhbnNmb3JtYXRpb24sIHdlIHdvdWxkIG5lZWQgYSBzb3VyY2Ugc2NoZW1hLCBidXQgc2luY2Ugd2UncmUgbm90XG4gICAgICAvLyBtaWdyYXRpbmcgZnJvbSBhIGRpZmZlcmVudCB2ZXJzaW9uIGluIHRoaXMgY29udGV4dCwgd2UnbGwgc2tpcCB0cmFuc2Zvcm1hdGlvblxuICAgICAgLy8gVGhpcyB3b3VsZCBiZSB1c2VkIHdoZW4gdXBncmFkaW5nIGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlclxuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRQcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBtaWdyYXRpb24gYW5hbHlzaXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb25cbiAgICovXG4gIHByaXZhdGUgX3BlcmZvcm1NaWdyYXRpb25BbmFseXNpcygpOiBNaWdyYXRpb25BbmFseXNpcyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBkZXByZWNhdGVkIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICBpZiAodGhpcy5fdmVyc2lvbk1hbmFnZXIuaXNEZXByZWNhdGVkKHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSkge1xuICAgICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmxhdGVzdFZlcnNpb24oKTtcbiAgICAgIGlmIChsYXRlc3RWZXJzaW9uICYmIGxhdGVzdFZlcnNpb24gIT09IHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uTWFuYWdlci5hbmFseXplTWlncmF0aW9uKFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlKCksXG4gICAgICAgICAgdGhpcy5yZXNvbHZlZEFwaVZlcnNpb24sXG4gICAgICAgICAgbGF0ZXN0VmVyc2lvbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgQXp1cmUgcmVzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZUF6dXJlUmVzb3VyY2UocHJvcHM6IGFueSk6IHZvaWQge1xuICAgIC8vIEVuc3VyZSBuYW1lIGlzIHNldCBpbiBwcm9wcyBmb3IgdmFsaWRhdGlvblxuICAgIGNvbnN0IHByb3BzV2l0aE5hbWUgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUgfHwgdGhpcy5yZXNvbHZlTmFtZShwcm9wcyksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcmVzb3VyY2UgYm9keSB1c2luZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICBjb25zdCByZXNvdXJjZUJvZHkgPSB0aGlzLmNyZWF0ZVJlc291cmNlQm9keShwcm9wc1dpdGhOYW1lKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcGFyZW50IElEIHVzaW5nIHRoZSBvdmVycmlkZWFibGUgbWV0aG9kXG4gICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnJlc29sdmVQYXJlbnRJZChwcm9wc1dpdGhOYW1lKTtcblxuICAgIC8vIEZpbmQgcGFyZW50IEF6YXBpUmVzb3VyY2UgY29uc3RydWN0IGlmIHBhcmVudCBJRCByZWZlcmVuY2VzIGEgcmVzb3VyY2VcbiAgICBjb25zdCBwYXJlbnRSZXNvdXJjZSA9IHRoaXMuX2ZpbmRQYXJlbnRBemFwaVJlc291cmNlKHBhcmVudElkKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGJhc2UgY2xhc3MgbWV0aG9kXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gdGhpcy5yZXNvbHZlTmFtZShwcm9wcyk7XG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZSA9IHRoaXMuY3JlYXRlQXphcGlSZXNvdXJjZShcbiAgICAgIHJlc291cmNlQm9keSxcbiAgICAgIHBhcmVudElkLFxuICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgdGhpcy5sb2NhdGlvbixcbiAgICAgIHBhcmVudFJlc291cmNlLFxuICAgICAgcHJvcHNXaXRoTmFtZS5kZXBlbmRzT24sXG4gICAgICB0aGlzLl90YWdzLCAvLyBQYXNzIHRhZ3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHRyYWN0aW5nIGZyb20gYm9keVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIHBhcmVudCBBemFwaVJlc291cmNlIGNvbnN0cnVjdCBpZiB0aGUgcGFyZW50SWQgcmVmZXJlbmNlcyBhIHJlc291cmNlXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhcmVudElkIGlzIGEgc3RhdGljIHN0cmluZyBvciBwYXJlbnQgbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9maW5kUGFyZW50QXphcGlSZXNvdXJjZShcbiAgICBwYXJlbnRJZDogc3RyaW5nLFxuICApOiBBemFwaVJlc291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IGlzIGEgc3RyaW5nIGludGVycG9sYXRpb24gcmVmZXJlbmNpbmcgYW5vdGhlciByZXNvdXJjZVxuICAgIC8vIFBhdHRlcm46ICR7YXphcGlfcmVzb3VyY2UucmVzb3VyY2VfbmFtZV9IQVNILmlkfSBvciAke2NvbnN0cnVjdC5mcW59LmlkXG4gICAgaWYgKCFwYXJlbnRJZC5pbmNsdWRlcyhcIiR7XCIpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBQYXJlbnQgaXMgYSBzdGF0aWMgc3RyaW5nIElELCBub3QgYSByZXNvdXJjZSByZWZlcmVuY2VcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgcGFyZW50IEF6YXBpUmVzb3VyY2UgaW4gdGhlIGNvbnN0cnVjdCB0cmVlXG4gICAgLy8gV2UgbmVlZCB0byBzZWFyY2ggdGhlIGVudGlyZSB0cmVlIHRvIGZpbmQgdGhlIG1hdGNoaW5nIHBhcmVudFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9maW5kUm9vdCgpO1xuICAgIHJldHVybiB0aGlzLl9maW5kUGFyZW50UmVzb3VyY2Uocm9vdCwgcGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSByb290IG9mIHRoZSBjb25zdHJ1Y3QgdHJlZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZmluZFJvb3QoKTogQ29uc3RydWN0IHtcbiAgICBsZXQgY3VycmVudDogQ29uc3RydWN0ID0gdGhpcztcbiAgICB3aGlsZSAoY3VycmVudC5ub2RlLnNjb3BlKSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5ub2RlLnNjb3BlO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgYSBwYXJlbnQgcmVzb3VyY2UgYnkgbWF0Y2hpbmcgcGFyZW50SWQgcGF0dGVybnNcbiAgICogRW5oYW5jZWQgdG8gYmV0dGVyIGhhbmRsZSBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvbiBzeW50YXhcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnRSZXNvdXJjZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICk6IEF6YXBpUmVzb3VyY2UgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGFsbCBjaGlsZHJlbiBvZiB0aGlzIHNjb3BlXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBzY29wZS5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkIGluc3RhbmNlb2YgQXphcGlSZXNvdXJjZSAmJlxuICAgICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgICBjaGlsZC50ZXJyYWZvcm1SZXNvdXJjZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRnFuID0gY2hpbGQudGVycmFmb3JtUmVzb3VyY2UuZnFuO1xuXG4gICAgICAgIC8vIE1hdGNoIGlmIHRoZSBjaGlsZCdzIEZRTiBhcHBlYXJzIGFueXdoZXJlIGluIHRoZSBwYXJlbnRJZCBzdHJpbmdcbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIGxpa2U6ICR7YXphcGlfcmVzb3VyY2UuZG5zLXJlc29sdmVyX3Jlc291cmNlX0YxNTE3QkU0LmlkfVxuICAgICAgICAvLyB3aGVyZSBjaGlsZEZxbiB3b3VsZCBiZTogYXphcGlfcmVzb3VyY2UuZG5zLXJlc29sdmVyX3Jlc291cmNlX0YxNTE3QkU0XG4gICAgICAgIGlmIChwYXJlbnRJZC5pbmNsdWRlcyhjaGlsZEZxbikpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIGNoaWxkJ3Mgc3VidHJlZVxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9maW5kUGFyZW50UmVzb3VyY2UoY2hpbGQsIHBhcmVudElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGlzIHJlc291cmNlLlxuICAgKlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBjaGlsZCByZXNvdXJjZSBjbGFzc2VzIChsaWtlIFN1Ym5ldCkgdGhhdCBuZWVkXG4gICAqIGN1c3RvbSBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy4gQnkgZGVmYXVsdCwgdGhpcyBkZWxlZ2F0ZXMgdG8gdGhlXG4gICAqIHByaXZhdGUgX2RldGVybWluZVBhcmVudElkIG1ldGhvZCB3aGljaCBoYW5kbGVzIHN0YW5kYXJkIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgcGFyZW50IHJlc291cmNlIElEXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXRlcm1pbmVQYXJlbnRJZChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcGFyZW50IElEIGZvciB0aGUgcmVzb3VyY2UgKGludGVybmFsIGltcGxlbWVudGF0aW9uKVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyB0aGUgZGVmYXVsdCBwYXJlbnQgSUQgcmVzb2x1dGlvbiBsb2dpYy5cbiAgICogUmVzb3VyY2Utc3BlY2lmaWMgbG9naWMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSBvdmVycmlkZWFibGUgcmVzb2x2ZVBhcmVudElkKCkgbWV0aG9kLlxuICAgKlxuICAgKiBEZWZhdWx0IGJlaGF2aW9yOlxuICAgKiAtIElmIHJlc291cmNlR3JvdXBJZCBpcyBwcm92aWRlZCBpbiBwcm9wcywgdXNlIGl0XG4gICAqIC0gT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHN1YnNjcmlwdGlvbiBzY29wZVxuICAgKi9cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgLy8gSWYgcmVzb3VyY2UgZ3JvdXAgSUQgaXMgcHJvdmlkZWQsIHVzZSBpdCBhcyBwYXJlbnRcbiAgICBpZiAocHJvcHMucmVzb3VyY2VHcm91cElkKSB7XG4gICAgICByZXR1cm4gcHJvcHMucmVzb3VyY2VHcm91cElkO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gc3Vic2NyaXB0aW9uIHNjb3BlIGZvciByZXNvdXJjZXMgd2l0aG91dCBleHBsaWNpdCBwYXJlbnRcbiAgICBjb25zdCBjbGllbnRDb25maWcgPSBuZXcgRGF0YUF6YXBpQ2xpZW50Q29uZmlnKFxuICAgICAgdGhpcyxcbiAgICAgIFwiY2xpZW50X2NvbmZpZ19kZWZhdWx0XCIsXG4gICAgICB7fSxcbiAgICApO1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0uc3Vic2NyaXB0aW9uX2lkfWA7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBmcmFtZXdvcmsgbWVzc2FnZXMgaW5jbHVkaW5nIHdhcm5pbmdzIGFuZCBtaWdyYXRpb24gZ3VpZGFuY2VcbiAgICovXG4gIHByaXZhdGUgX2xvZ0ZyYW1ld29ya01lc3NhZ2VzKCk6IHZvaWQge1xuICAgIC8vIEFOU0kgY29sb3IgY29kZXMgZm9yIHRlcm1pbmFsIG91dHB1dFxuICAgIGNvbnN0IFJFRCA9IFwiXFx4MWJbMzFtXCI7XG4gICAgY29uc3QgWUVMTE9XID0gXCJcXHgxYlszM21cIjtcbiAgICBjb25zdCBSRVNFVCA9IFwiXFx4MWJbMG1cIjtcbiAgICBjb25zdCBCT0xEID0gXCJcXHgxYlsxbVwiO1xuXG4gICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHVzaW5nIHRoZSB2ZXJzaW9uIG1hbmFnZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLl92ZXJzaW9uTWFuYWdlci5pc0RlcHJlY2F0ZWQodGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pICYmXG4gICAgICAhdGhpcy5fdmVyc2lvbk1hbmFnZXIuaXNTdW5zZXQodGhpcy5yZXNvbHZlZEFwaVZlcnNpb24pXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV33imqDvuI8gIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGlzIGRlcHJlY2F0ZWQuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciB1cGdyYWRpbmcgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uOiAke3RoaXMubGF0ZXN0VmVyc2lvbigpfSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3ZlcnNpb25NYW5hZ2VyLmlzU3Vuc2V0KHRoaXMucmVzb2x2ZWRBcGlWZXJzaW9uKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYCR7UkVEfSR7Qk9MRH3wn5qoIEFQSSB2ZXJzaW9uICR7dGhpcy5yZXNvbHZlZEFwaVZlcnNpb259IGZvciAke3RoaXMucmVzb3VyY2VUeXBlKCl9IGhhcyByZWFjaGVkIHN1bnNldC4gYCArXG4gICAgICAgICAgYEltbWVkaWF0ZSBtaWdyYXRpb24gdG8gJHt0aGlzLmxhdGVzdFZlcnNpb24oKX0gaXMgcmVxdWlyZWQuJHtSRVNFVH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWlncmF0aW9uIGFuYWx5c2lzIHJlc3VsdHNcbiAgICBpZiAodGhpcy5taWdyYXRpb25BbmFseXNpcyAmJiAhdGhpcy5taWdyYXRpb25BbmFseXNpcy5jb21wYXRpYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke1lFTExPV31NaWdyYXRpb24gZnJvbSAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZnJvbVZlcnNpb259IHRvICR7dGhpcy5taWdyYXRpb25BbmFseXNpcy50b1ZlcnNpb259IGAgK1xuICAgICAgICAgIGBoYXMgJHt0aGlzLm1pZ3JhdGlvbkFuYWx5c2lzLmJyZWFraW5nQ2hhbmdlcy5sZW5ndGh9IGJyZWFraW5nIGNoYW5nZXMuIGAgK1xuICAgICAgICAgIGBFc3RpbWF0ZWQgZWZmb3J0OiAke3RoaXMubWlncmF0aW9uQW5hbHlzaXMuZXN0aW1hdGVkRWZmb3J0fSR7UkVTRVR9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHZhbGlkYXRpb24gd2FybmluZ3NcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uUmVzdWx0Py53YXJuaW5ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtZRUxMT1d9UHJvcGVydHkgdmFsaWRhdGlvbiB3YXJuaW5nOiAke3dhcm5pbmd9JHtSRVNFVH1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTU9OSVRPUklORyBJTlRFR1JBVElPTiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbW9uaXRvcmluZyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIG1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBkdXJpbmcgY29uc3RydWN0aW9uIGlmIG1vbml0b3JpbmcgaXMgY29uZmlndXJlZC5cbiAgICogSXQgY3JlYXRlcyBhY3Rpb24gZ3JvdXBzLCBtZXRyaWMgYWxlcnRzLCBhbmQgYWN0aXZpdHkgbG9nIGFsZXJ0cyBhcyBjaGlsZCBjb25zdHJ1Y3RzLlxuICAgKlxuICAgKiBQcm90ZWN0ZWQgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBvciBleHRlbmQgbW9uaXRvcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBwcm9wc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU1vbml0b3JpbmdSZXNvdXJjZXMoXG4gICAgY29uZmlnOiBNb25pdG9yaW5nQ29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBTa2lwIGlmIG1vbml0b3JpbmcgaXMgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgIGlmIChjb25maWcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGlhZ25vc3RpYyBzZXR0aW5ncyB1c2luZyBkeW5hbWljIGltcG9ydCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgaWYgKGNvbmZpZy5kaWFnbm9zdGljU2V0dGluZ3MpIHtcbiAgICAgIGNvbnN0IHsgRGlhZ25vc3RpY1NldHRpbmdzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtZGlhZ25vc3RpY3NldHRpbmdzL2xpYi9kaWFnbm9zdGljLXNldHRpbmdzXCJcbiAgICAgICk7XG4gICAgICBuZXcgRGlhZ25vc3RpY1NldHRpbmdzKHRoaXMsIFwibW9uaXRvcmluZy1kaWFnbm9zdGljLXNldHRpbmdzXCIsIHtcbiAgICAgICAgLi4uY29uZmlnLmRpYWdub3N0aWNTZXR0aW5ncyxcbiAgICAgICAgdGFyZ2V0UmVzb3VyY2VJZDogdGhpcy5yZXNvdXJjZUlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFjdGlvbiBncm91cHMgdXNpbmcgZHluYW1pYyBpbXBvcnRcbiAgICBpZiAoY29uZmlnLmFjdGlvbkdyb3VwcyAmJiBjb25maWcuYWN0aW9uR3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgQWN0aW9uR3JvdXAgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuLi8uLi8uLi9henVyZS1hY3Rpb25ncm91cC9saWIvYWN0aW9uLWdyb3VwXCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aW9uR3JvdXBzLmZvckVhY2goKGFjdGlvbkdyb3VwUHJvcHMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkdyb3VwID0gbmV3IEFjdGlvbkdyb3VwKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYG1vbml0b3JpbmctYWN0aW9uLWdyb3VwLSR7aW5kZXh9YCxcbiAgICAgICAgICBhY3Rpb25Hcm91cFByb3BzLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1vbml0b3JpbmdBY3Rpb25Hcm91cHMucHVzaChhY3Rpb25Hcm91cCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWV0cmljIGFsZXJ0cyB1c2luZyBkeW5hbWljIGltcG9ydFxuICAgIGlmIChjb25maWcubWV0cmljQWxlcnRzICYmIGNvbmZpZy5tZXRyaWNBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBNZXRyaWNBbGVydCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4uLy4uLy4uL2F6dXJlLW1ldHJpY2FsZXJ0L2xpYi9tZXRyaWMtYWxlcnRcIlxuICAgICAgKTtcbiAgICAgIGNvbmZpZy5tZXRyaWNBbGVydHMuZm9yRWFjaCgobWV0cmljQWxlcnRQcm9wcywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gSWYgc2NvcGVzIG5vdCBwcm92aWRlZCwgZGVmYXVsdCB0byB0aGlzIHJlc291cmNlXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aFNjb3BlOiBNZXRyaWNBbGVydFByb3BzID0ge1xuICAgICAgICAgIC4uLm1ldHJpY0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBtZXRyaWNBbGVydFByb3BzLnNjb3BlcyB8fCBbdGhpcy5yZXNvdXJjZUlkXSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtZXRyaWNBbGVydCA9IG5ldyBNZXRyaWNBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLW1ldHJpYy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ01ldHJpY0FsZXJ0cy5wdXNoKG1ldHJpY0FsZXJ0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhY3Rpdml0eSBsb2cgYWxlcnRzIHVzaW5nIGR5bmFtaWMgaW1wb3J0XG4gICAgaWYgKGNvbmZpZy5hY3Rpdml0eUxvZ0FsZXJ0cyAmJiBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBBY3Rpdml0eUxvZ0FsZXJ0IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgIFwiLi4vLi4vLi4vYXp1cmUtYWN0aXZpdHlsb2dhbGVydC9saWIvYWN0aXZpdHktbG9nLWFsZXJ0XCJcbiAgICAgICk7XG4gICAgICBjb25maWcuYWN0aXZpdHlMb2dBbGVydHMuZm9yRWFjaCgoYWN0aXZpdHlMb2dBbGVydFByb3BzLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBJZiBzY29wZXMgbm90IHByb3ZpZGVkLCBkZWZhdWx0IHRvIHRoaXMgcmVzb3VyY2VcbiAgICAgICAgY29uc3QgcHJvcHNXaXRoU2NvcGU6IEFjdGl2aXR5TG9nQWxlcnRQcm9wcyA9IHtcbiAgICAgICAgICAuLi5hY3Rpdml0eUxvZ0FsZXJ0UHJvcHMsXG4gICAgICAgICAgc2NvcGVzOiBhY3Rpdml0eUxvZ0FsZXJ0UHJvcHMuc2NvcGVzIHx8IFt0aGlzLnJlc291cmNlSWRdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5TG9nQWxlcnQgPSBuZXcgQWN0aXZpdHlMb2dBbGVydChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBtb25pdG9yaW5nLWFjdGl2aXR5LWxvZy1hbGVydC0ke2luZGV4fWAsXG4gICAgICAgICAgcHJvcHNXaXRoU2NvcGUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9uaXRvcmluZ0FjdGl2aXR5TG9nQWxlcnRzLnB1c2goYWN0aXZpdHlMb2dBbGVydCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVNPVVJDRSBNQU5BR0VNRU5UIE1FVEhPRFMgKGZyb20gQXphcGlSZXNvdXJjZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBBWkFQSSBUZXJyYWZvcm0gcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc2VzXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIHNlbmQgdG8gdGhlIEF6dXJlIEFQSSAoc2hvdWxkIGluY2x1ZGUgbG9jYXRpb24gaWYgbmVlZGVkKVxuICAgKiBAcGFyYW0gcGFyZW50SWQgLSBUaGUgcGFyZW50IHJlc291cmNlIElEIChlLmcuLCBzdWJzY3JpcHRpb24gb3IgcmVzb3VyY2UgZ3JvdXApXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgKG9wdGlvbmFsLCBvbmx5IGZvciB0b3AtbGV2ZWwgcmVzb3VyY2VzIHdpdGhvdXQgbG9jYXRpb24gaW4gYm9keSlcbiAgICogQHBhcmFtIHBhcmVudFJlc291cmNlIC0gVGhlIHBhcmVudCByZXNvdXJjZSBmb3IgZGVwZW5kZW5jeSB0cmFja2luZ1xuICAgKiBAcGFyYW0gZGVwZW5kc09uIC0gRXhwbGljaXQgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHJlc291cmNlXG4gICAqIEBwYXJhbSB0YWdzIC0gVGFncyB0byBhcHBseSB0byB0aGUgcmVzb3VyY2UgKHBhc3NlZCBzZXBhcmF0ZWx5IGZyb20gYm9keSBmb3IgcHJvcGVyIGlkZW1wb3RlbmN5KVxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBBWkFQSSByZXNvdXJjZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUF6YXBpUmVzb3VyY2UoXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwYXJlbnRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBsb2NhdGlvbj86IHN0cmluZyxcbiAgICBwYXJlbnRSZXNvdXJjZT86IEF6YXBpUmVzb3VyY2UsXG4gICAgZGVwZW5kc09uPzogY2RrdGYuSVRlcnJhZm9ybURlcGVuZGFibGVbXSxcbiAgICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogY2RrdGYuVGVycmFmb3JtUmVzb3VyY2Uge1xuICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY2hpbGQgcmVzb3VyY2UgYnkgY291bnRpbmcgcGF0aCBzZWdtZW50c1xuICAgIC8vIENoaWxkIHJlc291cmNlcyBoYXZlIG11bHRpcGxlIHNlZ21lbnRzIChlLmcuLCBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrcy9zdWJuZXRzXCIpXG4gICAgLy8gVG9wLWxldmVsIHJlc291cmNlcyBoYXZlIG9uZSBzZWdtZW50IChlLmcuLCBcIk1pY3Jvc29mdC5OZXR3b3JrL3ZpcnR1YWxOZXR3b3Jrc1wiKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZVBhcnRzID0gdGhpcy5fcmVzb3VyY2VUeXBlLnNwbGl0KFwiL1wiKTtcbiAgICBjb25zdCBpc0NoaWxkUmVzb3VyY2UgPSByZXNvdXJjZVR5cGVQYXJ0cy5sZW5ndGggPiAyO1xuXG4gICAgLy8gUmVtb3ZlIHRhZ3MgZnJvbSBwcm9wZXJ0aWVzIHRvIGF2b2lkIGR1cGxpY2F0ZSBzcGVjaWZpY2F0aW9uIGVycm9yXG4gICAgLy8gVGhlIEFaQVBJIHByb3ZpZGVyIHJlcXVpcmVzIHRhZ3MgYXQgdGhlIHRvcCBsZXZlbCBvbmx5LCBub3QgaW4gdGhlIGJvZHlcbiAgICAvLyBUaGlzIHByZXZlbnRzOiBcImNhbid0IHNwZWNpZnkgYm90aCB0aGUgYXJndW1lbnQgJ3RhZ3MnIGFuZCAndGFncycgaW4gdGhlIGFyZ3VtZW50ICdib2R5J1wiXG4gICAgLy8gVGFncyBhcmUgbm93IHBhc3NlZCBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciBmb3IgYmV0dGVyIGNsYXJpdHkgYW5kIGlkZW1wb3RlbmN5XG4gICAgY29uc3QgYm9keVdpdGhvdXRUYWdzID0geyAuLi5wcm9wZXJ0aWVzIH07XG4gICAgZGVsZXRlIGJvZHlXaXRob3V0VGFncy50YWdzO1xuXG4gICAgLy8gQnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZ2VuZXJhdGVkIEFaQVBJIFJlc291cmNlIGNsYXNzXG4gICAgLy8gQWRkIGxvY2F0aW9uIG9ubHkgaWY6XG4gICAgLy8gMS4gVGhpcyBpcyBhIHRvcC1sZXZlbCByZXNvdXJjZSAobm90IGEgY2hpbGQgcmVzb3VyY2UpXG4gICAgLy8gMi4gTG9jYXRpb24gaXMgcHJvdmlkZWQgYXMgcGFyYW1ldGVyXG4gICAgLy8gMy4gTG9jYXRpb24gaXMgbm90IGFscmVhZHkgaW4gdGhlIGJvZHlcbiAgICAvLyBDaGlsZCByZXNvdXJjZXMgaW5oZXJpdCBsb2NhdGlvbiBmcm9tIHRoZWlyIHBhcmVudCBhbmQgc2hvdWxkIG5vdCBzcGVjaWZ5IGl0XG5cbiAgICAvLyBDb21iaW5lIGRlcGVuZHNPbiBhcnJheXM6IGV4cGxpY2l0IGRlcGVuZGVuY2llcyArIHBhcmVudCByZXNvdXJjZSBkZXBlbmRlbmN5XG4gICAgY29uc3QgY29tYmluZWREZXBlbmRzT246IGNka3RmLklUZXJyYWZvcm1EZXBlbmRhYmxlW10gPSBbXTtcbiAgICBpZiAoZGVwZW5kc09uICYmIGRlcGVuZHNPbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb21iaW5lZERlcGVuZHNPbi5wdXNoKC4uLmRlcGVuZHNPbik7XG4gICAgfVxuXG4gICAgLy8gQ1JJVElDQUw6IEFsd2F5cyBhZGQgcGFyZW50IGRlcGVuZGVuY3kgd2hlbiBwYXJlbnRfaWQgY29udGFpbnMgaW50ZXJwb2xhdGlvbnNcbiAgICAvLyBUaGlzIGVuc3VyZXMgcHJvcGVyIGRlc3Ryb3ktdGltZSBvcmRlcmluZyBldmVuIGlmIHBhcmVudCBkZXRlY3Rpb24gZmFpbHNcbiAgICBpZiAocGFyZW50UmVzb3VyY2U/LnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICBjb21iaW5lZERlcGVuZHNPbi5wdXNoKHBhcmVudFJlc291cmNlLnRlcnJhZm9ybVJlc291cmNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFJlc291cmNlQ29uZmlnID0ge1xuICAgICAgdHlwZTogYCR7dGhpcy5fcmVzb3VyY2VUeXBlfUAke3RoaXMuYXBpVmVyc2lvbn1gLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHBhcmVudElkOiBwYXJlbnRJZCxcbiAgICAgIGJvZHk6IGJvZHlXaXRob3V0VGFncyxcbiAgICAgIC4uLighaXNDaGlsZFJlc291cmNlICYmIGxvY2F0aW9uICYmICFwcm9wZXJ0aWVzLmxvY2F0aW9uICYmIHsgbG9jYXRpb24gfSksXG4gICAgICAvLyBBZGQgdGFncyBhdCB0aGUgdG9wIGxldmVsIGlmIHRoZXkgZXhpc3RcbiAgICAgIC8vIFRhZ3MgYXJlIHBhc3NlZCBhcyBhIHNlcGFyYXRlIHBhcmFtZXRlciBhbmQgYWRkZWQgaGVyZSB0byBlbnN1cmUgdGhleSdyZSBpbiB0aGVcbiAgICAgIC8vIGluaXRpYWwgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24sIHByb3ZpZGluZyBwcm9wZXIgaWRlbXBvdGVuY3lcbiAgICAgIC4uLih0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDAgJiYgeyB0YWdzIH0pLFxuICAgICAgLy8gQWRkIGRlcGVuZHNfb24gZm9yIGV4cGxpY2l0IGRlcGVuZGVuY2llcyBhbmQgcGFyZW50IHJlc291cmNlXG4gICAgICAuLi4oY29tYmluZWREZXBlbmRzT24ubGVuZ3RoID4gMCAmJiB7IGRlcGVuZHNPbjogY29tYmluZWREZXBlbmRzT24gfSksXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSB0aGUgQVpBUEkgcmVzb3VyY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBwcm92aWRlciBjbGFzc1xuICAgIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgXCJyZXNvdXJjZVwiLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQVpBUEkgZGF0YSBzb3VyY2UgZm9yIHJlYWRpbmcgZXhpc3RpbmcgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZUlkIC0gVGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgVGVycmFmb3JtIGRhdGEgc291cmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQXphcGlEYXRhU291cmNlKFxuICAgIHJlc291cmNlSWQ6IHN0cmluZyxcbiAgKTogY2RrdGYuVGVycmFmb3JtRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1EYXRhU291cmNlKHRoaXMsIFwiZGF0YVwiLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwiYXphcGlfcmVzb3VyY2VcIixcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogXCJhemFwaVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRhdGFTb3VyY2UuYWRkT3ZlcnJpZGUoXCJ0eXBlXCIsIHRoaXMuX3Jlc291cmNlVHlwZSk7XG4gICAgZGF0YVNvdXJjZS5hZGRPdmVycmlkZShcInJlc291cmNlX2lkXCIsIHJlc291cmNlSWQpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVzb3VyY2Ugd2l0aCBuZXcgcHJvcGVydGllc1xuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBuZXcgcHJvcGVydGllcyB0byBhcHBseVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUF6YXBpUmVzb3VyY2UocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlKSB7XG4gICAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwiYm9keVwiLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbiB8fCB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtIHJlc291cmNlIGZvciB1c2UgaW4gZGVwZW5kZW5jeSBkZWNsYXJhdGlvbnNcbiAgICogVGhpcyBhbGxvd3MgZXhwbGljaXQgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IGJldHdlZW4gcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlKCk6IGNka3RmLlRlcnJhZm9ybVJlc291cmNlIHtcbiAgICByZXR1cm4gdGhpcy50ZXJyYWZvcm1SZXNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZXNvdXJjZSBhcyBhIFRlcnJhZm9ybSBvdXRwdXQgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgb3V0cHV0KCk6IGNka3RmLlRlcnJhZm9ybU91dHB1dCB7XG4gICAgcmV0dXJuIG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJvdXRwdXRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMudGVycmFmb3JtUmVzb3VyY2U/LmZxbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGFjY2VzcyByb2xlIGFzc2lnbm1lbnQgZm9yIGEgc3BlY2lmaWVkIEF6dXJlIEFEIG9iamVjdFxuICAgKlxuICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBjcmVhdGVzIHJvbGUgYXNzaWdubWVudHMgdXNpbmcgQVpBUEkgaW5zdGVhZCBvZiBBenVyZVJNIHByb3ZpZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0SWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEF6dXJlIEFEIG9iamVjdFxuICAgKiBAcGFyYW0gcm9sZURlZmluaXRpb25OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEF6dXJlIFJCQUMgcm9sZSB0byBiZSBhc3NpZ25lZFxuICAgKi9cbiAgcHVibGljIGFkZEFjY2VzcyhvYmplY3RJZDogc3RyaW5nLCByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIG5ldyBBemFwaVJvbGVBc3NpZ25tZW50KHRoaXMsIGByYmFjLSR7b2JqZWN0SWR9LSR7cm9sZURlZmluaXRpb25OYW1lfWAsIHtcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcbiAgICAgIHJvbGVEZWZpbml0aW9uTmFtZTogcm9sZURlZmluaXRpb25OYW1lLFxuICAgICAgc2NvcGU6IHRoaXMucmVzb3VyY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdGFnIHRvIHRoaXMgcmVzb3VyY2UuIFRoZSB0YWcgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQXp1cmUgcmVzb3VyY2UuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHByb3BlciBpbW11dGFiaWxpdHkgYnkgc3RvcmluZyB0YWdzIHNlcGFyYXRlbHkgZnJvbSBwcm9wcy5cbiAgICogVGFncyBhZGRlZCB2aWEgdGhpcyBtZXRob2QgYXJlIGNvbWJpbmVkIHdpdGggdGFncyBmcm9tIHByb3BzIGFuZCBpbmNsdWRlZCBpblxuICAgKiB0aGUgZGVwbG95ZWQgQXp1cmUgcmVzb3VyY2UuXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIEluIENESyBmb3IgVGVycmFmb3JtLCB0YWdzIHNob3VsZCBpZGVhbGx5IGJlIHNldCBkdXJpbmcgcmVzb3VyY2VcbiAgICogY29uc3RydWN0aW9uIHZpYSBwcm9wcy4gV2hpbGUgdGhpcyBtZXRob2QgYWxsb3dzIGFkZGluZyB0YWdzIGFmdGVyIGNvbnN0cnVjdGlvbixcbiAgICogdGhvc2UgdGFncyBhcmUgb25seSBpbmNsdWRlZCBpZiBhZGRlZCBiZWZvcmUgdGhlIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uIGlzXG4gICAqIHN5bnRoZXNpemVkLiBGb3IgYmVzdCByZXN1bHRzLCBhZGQgYWxsIHRhZ3MgdmlhIHByb3BzIG9yIGNhbGwgYWRkVGFnKCkgaW4gdGhlXG4gICAqIHNhbWUgc2NvcGUgd2hlcmUgdGhlIHJlc291cmNlIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGFnIGtleVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGFnIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkVGFnKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdGFnc1trZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHRhZ3Mgb24gdGhpcyByZXNvdXJjZSAocmVhZG9ubHkgdmlldylcbiAgICpcbiAgICogVGhpcyBnZXR0ZXIgcHJvdmlkZXMgY29udmVuaWVudCBhY2Nlc3MgdG8gYWxsIHRhZ3MgaW5jbHVkaW5nIHRob3NlIGZyb20gcHJvcHNcbiAgICogYW5kIHRob3NlIGFkZGVkIGR5bmFtaWNhbGx5IHZpYSBhZGRUYWcoKS4gUmV0dXJucyBhIGNvcHkgdG8gbWFpbnRhaW4gaW1tdXRhYmlsaXR5LlxuICAgKi9cbiAgcHVibGljIGdldCB0YWdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RhZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90ZWN0ZWQgbWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWdzIGZvciB1c2UgaW4gY3JlYXRlUmVzb3VyY2VCb2R5IGltcGxlbWVudGF0aW9uc1xuICAgKlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyBtZXRob2Qgd2hlbiBjcmVhdGluZyByZXNvdXJjZSBib2RpZXMgdG8gZW5zdXJlXG4gICAqIGFsbCB0YWdzIChmcm9tIHByb3BzIGFuZCBhZGRUYWcoKSkgYXJlIGluY2x1ZGVkIGluIHRoZSBBenVyZSByZXNvdXJjZS5cbiAgICogVXNlcyBhIG5vbi1nZXR0ZXIgbmFtZSB0byBhdm9pZCBKU0lJIGNvbmZsaWN0cyB3aXRoIHRoZSB0YWdzIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgdGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFsbFRhZ3MoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdGFncyB9O1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVIgQ0xBU1NFUyBBTkQgSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBBWkFQSSByb2xlIGFzc2lnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBemFwaVJvbGVBc3NpZ25tZW50UHJvcHMge1xuICByZWFkb25seSBvYmplY3RJZDogc3RyaW5nO1xuICByZWFkb25seSByb2xlRGVmaW5pdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBWkFQSS1iYXNlZCByb2xlIGFzc2lnbm1lbnQgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBemFwaVJvbGVBc3NpZ25tZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF6YXBpUm9sZUFzc2lnbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgcHJpbmNpcGFsSWQ6IHByb3BzLm9iamVjdElkLFxuICAgICAgcm9sZURlZmluaXRpb25JZDogYFtzdWJzY3JpcHRpb25SZXNvdXJjZUlkKCdNaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMnLCByb2xlRGVmaW5pdGlvbklkKCcke3Byb3BzLnJvbGVEZWZpbml0aW9uTmFtZX0nKSldYCxcbiAgICAgIHNjb3BlOiBwcm9wcy5zY29wZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnOiBSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcm9sZUFzc2lnbm1lbnRzXCIsXG4gICAgICBuYW1lOiBcIltndWlkKCldXCIsXG4gICAgICBwYXJlbnRJZDogcHJvcHMuc2NvcGUsXG4gICAgICBib2R5OiBwcm9wZXJ0aWVzLFxuICAgIH07XG4gICAgbmV3IFJlc291cmNlKHRoaXMsIFwicm9sZS1hc3NpZ25tZW50XCIsIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==