@lowcodeunit/applications-flow-common 1.33.154-social-ish-angular-13-test → 1.33.155-lets-get-social-ish

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 (264) hide show
  1. package/bundles/lowcodeunit-applications-flow-common.umd.js +6968 -0
  2. package/bundles/lowcodeunit-applications-flow-common.umd.js.map +1 -0
  3. package/bundles/lowcodeunit-applications-flow-common.umd.min.js +16 -0
  4. package/bundles/lowcodeunit-applications-flow-common.umd.min.js.map +1 -0
  5. package/esm2015/lcu.api.js +38 -0
  6. package/esm2015/lib/applications-flow.module.js +218 -0
  7. package/esm2015/lib/controls/build-pipeline-form/build-pipeline-form.component.js +210 -0
  8. package/esm2015/lib/controls/devops-source-control-form/devops-source-control-form.component.js +412 -0
  9. package/esm2015/lib/controls/edit-application-form/edit-application-form.component.js +60 -0
  10. package/esm2015/lib/controls/processor-details-form/processor-details-form.component.js +330 -0
  11. package/esm2015/lib/controls/security-toggle/security-toggle.component.js +51 -0
  12. package/esm2015/lib/controls/source-control-form/source-control-form.component.js +61 -0
  13. package/esm2015/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.js +25 -0
  14. package/esm2015/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.js +31 -0
  15. package/esm2015/lib/dialogs/edit-application-dialog/edit-application-dialog.component.js +29 -0
  16. package/esm2015/lib/dialogs/source-control-dialog/source-control-dialog.component.js +25 -0
  17. package/esm2015/lib/elements/analytics-card/analytics-card.component.js +21 -0
  18. package/esm2015/lib/elements/base-form/base-form.component.js +61 -0
  19. package/esm2015/lib/elements/breadcrumb/breadcrumb.component.js +113 -0
  20. package/esm2015/lib/elements/card-carousel/card-carousel.component.js +67 -0
  21. package/esm2015/lib/elements/dynamic-tabs/dynamic-tabs.component.js +69 -0
  22. package/esm2015/lib/elements/feed-card-sm/feed-card-sm.component.js +31 -0
  23. package/esm2015/lib/elements/form-card/form-card.component.js +22 -0
  24. package/esm2015/lib/elements/gh-control/gh-control.component.js +72 -0
  25. package/esm2015/lib/elements/main-feed-card/main-feed-card.component.js +24 -0
  26. package/esm2015/lib/elements/project-info-card/project-info-card.component.js +39 -0
  27. package/esm2015/lib/elements/projects/controls/builds/builds.component.js +26 -0
  28. package/esm2015/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.js +145 -0
  29. package/esm2015/lib/elements/projects/controls/forms/source-control/source-control.component.js +262 -0
  30. package/esm2015/lib/elements/projects/controls/git-auth/git-auth.component.js +25 -0
  31. package/esm2015/lib/elements/projects/controls/header/header.component.js +75 -0
  32. package/esm2015/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.js +102 -0
  33. package/esm2015/lib/elements/projects/controls/project-items/project-items.component.js +49 -0
  34. package/esm2015/lib/elements/projects/controls/project-tabs/project-tabs.component.js +91 -0
  35. package/esm2015/lib/elements/projects/controls/recent-activities/recent-activities.component.js +15 -0
  36. package/esm2015/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.js +590 -0
  37. package/esm2015/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.js +62 -0
  38. package/esm2015/lib/elements/projects/controls/tabs/devops/devops.component.js +202 -0
  39. package/esm2015/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.js +178 -0
  40. package/esm2015/lib/elements/projects/controls/tabs/domains/domains.component.js +133 -0
  41. package/esm2015/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.js +86 -0
  42. package/esm2015/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.js +129 -0
  43. package/esm2015/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.js +113 -0
  44. package/esm2015/lib/elements/projects/controls/tabs/general/general.component.js +46 -0
  45. package/esm2015/lib/elements/projects/projects.component.js +92 -0
  46. package/esm2015/lib/elements/slotted-card/slotted-card.component.js +30 -0
  47. package/esm2015/lib/elements/three-column/three-column.component.js +32 -0
  48. package/esm2015/lib/elements/two-column-header/two-column-header.component.js +15 -0
  49. package/esm2015/lib/models/actions.model.js +3 -0
  50. package/esm2015/lib/models/base-form-config.model.js +6 -0
  51. package/esm2015/lib/models/card-form-config.model.js +6 -0
  52. package/esm2015/lib/models/dev-settings-preset.model.js +3 -0
  53. package/esm2015/lib/models/domain.model.js +3 -0
  54. package/esm2015/lib/models/dynamic-tabs.model.js +6 -0
  55. package/esm2015/lib/models/form-actions.model.js +3 -0
  56. package/esm2015/lib/models/form.model.js +6 -0
  57. package/esm2015/lib/models/form.values.model.js +11 -0
  58. package/esm2015/lib/models/project-actions.model.js +6 -0
  59. package/esm2015/lib/models/user-feed.model.js +12 -0
  60. package/{esm2020/lib/services/applications-flow.service.mjs → esm2015/lib/services/applications-flow.service.js} +13 -9
  61. package/esm2015/lib/services/eac.service.js +223 -0
  62. package/esm2015/lib/services/forms.service.js +131 -0
  63. package/esm2015/lib/services/npm.service.js +79 -0
  64. package/esm2015/lib/services/project.service.js +340 -0
  65. package/esm2015/lib/state/applications-flow-state.context.js +37 -0
  66. package/esm2015/lib/state/applications-flow.state.js +72 -0
  67. package/esm2015/lowcodeunit-applications-flow-common.js +29 -0
  68. package/fesm2015/lowcodeunit-applications-flow-common.js +5364 -0
  69. package/fesm2015/lowcodeunit-applications-flow-common.js.map +1 -0
  70. package/lcu.api.d.ts +13 -39
  71. package/lcu.api.d.ts.map +1 -0
  72. package/lib/applications-flow.module.d.ts +1 -53
  73. package/lib/applications-flow.module.d.ts.map +1 -0
  74. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts +1 -3
  75. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts.map +1 -0
  76. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts +1 -3
  77. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts.map +1 -0
  78. package/lib/controls/edit-application-form/edit-application-form.component.d.ts +1 -3
  79. package/lib/controls/edit-application-form/edit-application-form.component.d.ts.map +1 -0
  80. package/lib/controls/processor-details-form/processor-details-form.component.d.ts +1 -3
  81. package/lib/controls/processor-details-form/processor-details-form.component.d.ts.map +1 -0
  82. package/lib/controls/security-toggle/security-toggle.component.d.ts +1 -3
  83. package/lib/controls/security-toggle/security-toggle.component.d.ts.map +1 -0
  84. package/lib/controls/source-control-form/source-control-form.component.d.ts +1 -3
  85. package/lib/controls/source-control-form/source-control-form.component.d.ts.map +1 -0
  86. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts +1 -3
  87. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts.map +1 -0
  88. package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts +1 -3
  89. package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts.map +1 -0
  90. package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts +1 -3
  91. package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts.map +1 -0
  92. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts +1 -3
  93. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts.map +1 -0
  94. package/lib/elements/analytics-card/analytics-card.component.d.ts +1 -3
  95. package/lib/elements/analytics-card/analytics-card.component.d.ts.map +1 -0
  96. package/lib/elements/base-form/base-form.component.d.ts +1 -3
  97. package/lib/elements/base-form/base-form.component.d.ts.map +1 -0
  98. package/lib/elements/breadcrumb/breadcrumb.component.d.ts +1 -3
  99. package/lib/elements/breadcrumb/breadcrumb.component.d.ts.map +1 -0
  100. package/lib/elements/card-carousel/card-carousel.component.d.ts +1 -3
  101. package/lib/elements/card-carousel/card-carousel.component.d.ts.map +1 -0
  102. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts +1 -3
  103. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts.map +1 -0
  104. package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts +1 -3
  105. package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts.map +1 -0
  106. package/lib/elements/form-card/form-card.component.d.ts +1 -3
  107. package/lib/elements/form-card/form-card.component.d.ts.map +1 -0
  108. package/lib/elements/gh-control/gh-control.component.d.ts +1 -3
  109. package/lib/elements/gh-control/gh-control.component.d.ts.map +1 -0
  110. package/lib/elements/main-feed-card/main-feed-card.component.d.ts +1 -3
  111. package/lib/elements/main-feed-card/main-feed-card.component.d.ts.map +1 -0
  112. package/lib/elements/project-info-card/project-info-card.component.d.ts +1 -3
  113. package/lib/elements/project-info-card/project-info-card.component.d.ts.map +1 -0
  114. package/lib/elements/projects/controls/builds/builds.component.d.ts +1 -3
  115. package/lib/elements/projects/controls/builds/builds.component.d.ts.map +1 -0
  116. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts +1 -3
  117. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts.map +1 -0
  118. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts +1 -3
  119. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts.map +1 -0
  120. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts +1 -3
  121. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts.map +1 -0
  122. package/lib/elements/projects/controls/header/header.component.d.ts +1 -3
  123. package/lib/elements/projects/controls/header/header.component.d.ts.map +1 -0
  124. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts +1 -3
  125. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts.map +1 -0
  126. package/lib/elements/projects/controls/project-items/project-items.component.d.ts +1 -3
  127. package/lib/elements/projects/controls/project-items/project-items.component.d.ts.map +1 -0
  128. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts +1 -3
  129. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts.map +1 -0
  130. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts +1 -3
  131. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts.map +1 -0
  132. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts +1 -3
  133. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts.map +1 -0
  134. package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts +1 -3
  135. package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts.map +1 -0
  136. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts +1 -3
  137. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts.map +1 -0
  138. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts +1 -3
  139. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts.map +1 -0
  140. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts +1 -3
  141. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts.map +1 -0
  142. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts +1 -3
  143. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts.map +1 -0
  144. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts +1 -3
  145. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts.map +1 -0
  146. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts +1 -3
  147. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts.map +1 -0
  148. package/lib/elements/projects/controls/tabs/general/general.component.d.ts +1 -3
  149. package/lib/elements/projects/controls/tabs/general/general.component.d.ts.map +1 -0
  150. package/lib/elements/projects/projects.component.d.ts +1 -3
  151. package/lib/elements/projects/projects.component.d.ts.map +1 -0
  152. package/lib/elements/slotted-card/slotted-card.component.d.ts +1 -3
  153. package/lib/elements/slotted-card/slotted-card.component.d.ts.map +1 -0
  154. package/lib/elements/three-column/three-column.component.d.ts +1 -3
  155. package/lib/elements/three-column/three-column.component.d.ts.map +1 -0
  156. package/lib/elements/two-column-header/two-column-header.component.d.ts +1 -3
  157. package/lib/elements/two-column-header/two-column-header.component.d.ts.map +1 -0
  158. package/lib/models/actions.model.d.ts +1 -0
  159. package/lib/models/actions.model.d.ts.map +1 -0
  160. package/lib/models/base-form-config.model.d.ts +1 -0
  161. package/lib/models/base-form-config.model.d.ts.map +1 -0
  162. package/lib/models/card-form-config.model.d.ts +1 -0
  163. package/lib/models/card-form-config.model.d.ts.map +1 -0
  164. package/lib/models/dev-settings-preset.model.d.ts +1 -0
  165. package/lib/models/dev-settings-preset.model.d.ts.map +1 -0
  166. package/lib/models/domain.model.d.ts +1 -0
  167. package/lib/models/domain.model.d.ts.map +1 -0
  168. package/lib/models/dynamic-tabs.model.d.ts +1 -0
  169. package/lib/models/dynamic-tabs.model.d.ts.map +1 -0
  170. package/lib/models/form-actions.model.d.ts +1 -0
  171. package/lib/models/form-actions.model.d.ts.map +1 -0
  172. package/lib/models/form.model.d.ts +1 -0
  173. package/lib/models/form.model.d.ts.map +1 -0
  174. package/lib/models/form.values.model.d.ts +1 -0
  175. package/lib/models/form.values.model.d.ts.map +1 -0
  176. package/lib/models/project-actions.model.d.ts +1 -0
  177. package/lib/models/project-actions.model.d.ts.map +1 -0
  178. package/lib/models/user-feed.model.d.ts +42 -0
  179. package/lib/models/user-feed.model.d.ts.map +1 -0
  180. package/lib/services/applications-flow.service.d.ts +1 -3
  181. package/lib/services/applications-flow.service.d.ts.map +1 -0
  182. package/lib/services/eac.service.d.ts +2 -3
  183. package/lib/services/eac.service.d.ts.map +1 -0
  184. package/lib/services/forms.service.d.ts +1 -3
  185. package/lib/services/forms.service.d.ts.map +1 -0
  186. package/lib/services/npm.service.d.ts +1 -3
  187. package/lib/services/npm.service.d.ts.map +1 -0
  188. package/lib/services/project.service.d.ts +3 -3
  189. package/lib/services/project.service.d.ts.map +1 -0
  190. package/lib/state/applications-flow-state.context.d.ts +1 -3
  191. package/lib/state/applications-flow-state.context.d.ts.map +1 -0
  192. package/lib/state/applications-flow.state.d.ts +4 -0
  193. package/lib/state/applications-flow.state.d.ts.map +1 -0
  194. package/lowcodeunit-applications-flow-common.d.ts +25 -1
  195. package/lowcodeunit-applications-flow-common.d.ts.map +1 -0
  196. package/lowcodeunit-applications-flow-common.metadata.json +1 -0
  197. package/package.json +12 -20
  198. package/esm2020/lcu.api.mjs +0 -65
  199. package/esm2020/lib/applications-flow.module.mjs +0 -328
  200. package/esm2020/lib/controls/build-pipeline-form/build-pipeline-form.component.mjs +0 -245
  201. package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +0 -446
  202. package/esm2020/lib/controls/edit-application-form/edit-application-form.component.mjs +0 -67
  203. package/esm2020/lib/controls/processor-details-form/processor-details-form.component.mjs +0 -318
  204. package/esm2020/lib/controls/security-toggle/security-toggle.component.mjs +0 -58
  205. package/esm2020/lib/controls/source-control-form/source-control-form.component.mjs +0 -69
  206. package/esm2020/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.mjs +0 -29
  207. package/esm2020/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.mjs +0 -35
  208. package/esm2020/lib/dialogs/edit-application-dialog/edit-application-dialog.component.mjs +0 -33
  209. package/esm2020/lib/dialogs/source-control-dialog/source-control-dialog.component.mjs +0 -29
  210. package/esm2020/lib/elements/analytics-card/analytics-card.component.mjs +0 -28
  211. package/esm2020/lib/elements/base-form/base-form.component.mjs +0 -57
  212. package/esm2020/lib/elements/breadcrumb/breadcrumb.component.mjs +0 -117
  213. package/esm2020/lib/elements/card-carousel/card-carousel.component.mjs +0 -70
  214. package/esm2020/lib/elements/dynamic-tabs/dynamic-tabs.component.mjs +0 -74
  215. package/esm2020/lib/elements/feed-card-sm/feed-card-sm.component.mjs +0 -40
  216. package/esm2020/lib/elements/flow-tool/flow-tool.component.mjs +0 -75
  217. package/esm2020/lib/elements/form-card/form-card.component.mjs +0 -33
  218. package/esm2020/lib/elements/gh-control/gh-control.component.mjs +0 -78
  219. package/esm2020/lib/elements/main-feed-card/main-feed-card.component.mjs +0 -34
  220. package/esm2020/lib/elements/project-info-card/project-info-card.component.mjs +0 -60
  221. package/esm2020/lib/elements/projects/controls/builds/builds.component.mjs +0 -32
  222. package/esm2020/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.mjs +0 -145
  223. package/esm2020/lib/elements/projects/controls/forms/source-control/source-control.component.mjs +0 -285
  224. package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +0 -26
  225. package/esm2020/lib/elements/projects/controls/header/header.component.mjs +0 -83
  226. package/esm2020/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.mjs +0 -118
  227. package/esm2020/lib/elements/projects/controls/project-items/project-items.component.mjs +0 -54
  228. package/esm2020/lib/elements/projects/controls/project-tabs/project-tabs.component.mjs +0 -103
  229. package/esm2020/lib/elements/projects/controls/recent-activities/recent-activities.component.mjs +0 -14
  230. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.mjs +0 -561
  231. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.mjs +0 -72
  232. package/esm2020/lib/elements/projects/controls/tabs/devops/devops.component.mjs +0 -242
  233. package/esm2020/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.mjs +0 -179
  234. package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +0 -140
  235. package/esm2020/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.mjs +0 -90
  236. package/esm2020/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.mjs +0 -142
  237. package/esm2020/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.mjs +0 -124
  238. package/esm2020/lib/elements/projects/controls/tabs/general/general.component.mjs +0 -40
  239. package/esm2020/lib/elements/projects/projects.component.mjs +0 -98
  240. package/esm2020/lib/elements/slotted-card/slotted-card.component.mjs +0 -49
  241. package/esm2020/lib/elements/three-column/three-column.component.mjs +0 -30
  242. package/esm2020/lib/elements/two-column-header/two-column-header.component.mjs +0 -15
  243. package/esm2020/lib/models/actions.model.mjs +0 -3
  244. package/esm2020/lib/models/base-form-config.model.mjs +0 -6
  245. package/esm2020/lib/models/card-form-config.model.mjs +0 -6
  246. package/esm2020/lib/models/dev-settings-preset.model.mjs +0 -3
  247. package/esm2020/lib/models/domain.model.mjs +0 -3
  248. package/esm2020/lib/models/dynamic-tabs.model.mjs +0 -6
  249. package/esm2020/lib/models/form-actions.model.mjs +0 -3
  250. package/esm2020/lib/models/form.model.mjs +0 -6
  251. package/esm2020/lib/models/form.values.model.mjs +0 -11
  252. package/esm2020/lib/models/project-actions.model.mjs +0 -6
  253. package/esm2020/lib/services/eac.service.mjs +0 -173
  254. package/esm2020/lib/services/forms.service.mjs +0 -132
  255. package/esm2020/lib/services/npm.service.mjs +0 -77
  256. package/esm2020/lib/services/project.service.mjs +0 -303
  257. package/esm2020/lib/state/applications-flow-state.context.mjs +0 -36
  258. package/esm2020/lib/state/applications-flow.state.mjs +0 -72
  259. package/esm2020/lowcodeunit-applications-flow-common.mjs +0 -5
  260. package/fesm2015/lowcodeunit-applications-flow-common.mjs +0 -5570
  261. package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +0 -1
  262. package/fesm2020/lowcodeunit-applications-flow-common.mjs +0 -5449
  263. package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +0 -1
  264. package/lib/elements/flow-tool/flow-tool.component.d.ts +0 -28
@@ -1,446 +0,0 @@
1
- import { COMMA, ENTER } from '@angular/cdk/keycodes';
2
- import { Component, Input, ViewChild } from '@angular/core';
3
- import { FormControl, Validators } from '@angular/forms';
4
- import { Guid } from '@lcu/common';
5
- import { ProjectHostingDetails } from '../../state/applications-flow.state';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../services/applications-flow.service";
8
- import * as i2 from "../../services/eac.service";
9
- import * as i3 from "@angular/forms";
10
- import * as i4 from "@angular/material/card";
11
- import * as i5 from "@angular/material/icon";
12
- import * as i6 from "@angular/material/form-field";
13
- import * as i7 from "@angular/material/select";
14
- import * as i8 from "@angular/material/core";
15
- import * as i9 from "@angular/material/button";
16
- import * as i10 from "@angular/material/autocomplete";
17
- import * as i11 from "@angular/material/chips";
18
- import * as i12 from "@lowcodeunit/app-host-common";
19
- import * as i13 from "@angular/flex-layout/flex";
20
- import * as i14 from "@angular/material/tooltip";
21
- import * as i15 from "@angular/common";
22
- import * as i16 from "@angular/material/input";
23
- import * as i17 from "@angular/flex-layout/extended";
24
- export class DevopsSourceControlFormComponent {
25
- // Constructors
26
- constructor(appsFlowSvc, eacSvc, formBuilder) {
27
- this.appsFlowSvc = appsFlowSvc;
28
- this.eacSvc = eacSvc;
29
- this.formBuilder = formBuilder;
30
- this.SeparatorKeysCodes = [ENTER, COMMA];
31
- this.BuildPath = null;
32
- this.HostingDetails = new ProjectHostingDetails();
33
- this.SelectedBranches = [];
34
- this.SourceControlRoot = '';
35
- this.UseBranches = true;
36
- this.UseBuildPath = false;
37
- }
38
- // Properties
39
- get ArtifactLookups() {
40
- return this.DevOpsAction?.ArtifactLookups;
41
- }
42
- get ArtifactLookup() {
43
- const artLookup = this.DevOpsAction?.ArtifactLookups
44
- ? this.DevOpsAction?.ArtifactLookups[0]
45
- : null;
46
- return artLookup;
47
- }
48
- get Artifact() {
49
- return this.Environment?.Artifacts && this.ArtifactLookup
50
- ? this.Environment?.Artifacts[this.ArtifactLookup] || {}
51
- : {};
52
- }
53
- get BranchesFormControl() {
54
- return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'branches');
55
- }
56
- get BuildPathFormControl() {
57
- return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'buildPath');
58
- }
59
- get DevOpsActionLookups() {
60
- // console.log(this.DevOpsActions);
61
- return Object.keys(this.DevOpsActions || {});
62
- }
63
- get DevOpsAction() {
64
- return this.Environment.DevOpsActions && this.DevOpsActionLookup
65
- ? this.Environment.DevOpsActions[this.DevOpsActionLookup] || {}
66
- : {};
67
- }
68
- get DevOpsActionLookup() {
69
- if (!!this.DevOpsActionLookupFormControl?.value) {
70
- return this.DevOpsActionLookupFormControl.value;
71
- }
72
- if (!!this.EditingSourceControl?.DevOpsActionTriggerLookups) {
73
- return this.EditingSourceControl?.DevOpsActionTriggerLookups[0];
74
- }
75
- else {
76
- return null;
77
- }
78
- }
79
- get DevOpsActionLookupFormControl() {
80
- return this.DevOpsSourceControlFormGroup.get('devOpsActionLookup');
81
- }
82
- get DevOpsActions() {
83
- return this.Environment.DevOpsActions || {};
84
- }
85
- get EditingSourceControl() {
86
- let sc = this.Environment?.Sources
87
- ? this.Environment?.Sources[this.EditingSourceControlLookup]
88
- : null;
89
- if (sc == null && this.EditingSourceControlLookup) {
90
- sc = {};
91
- }
92
- return sc;
93
- }
94
- get MainBranchFormControl() {
95
- return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'mainBranch');
96
- }
97
- get OrganizationFormControl() {
98
- return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'organization');
99
- }
100
- get RepositoryFormControl() {
101
- return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'repository');
102
- }
103
- // Life Cycle
104
- ngAfterViewInit() { }
105
- ngOnDestroy() {
106
- this.destroyFormControls();
107
- }
108
- ngOnInit() {
109
- if (this.EditingSourceControlLookup === null) {
110
- this.CreateNewSourceControl();
111
- }
112
- if (this.EditingSourceControl != null) {
113
- this.DevOpsSourceControlFormGroup = this.formBuilder.group({});
114
- this.setupFormControls();
115
- }
116
- this.RefreshOrganizations();
117
- }
118
- // API Methods
119
- AddBranchOption(event) {
120
- this.addBranchOption(event.value);
121
- event.input.value = '';
122
- }
123
- BranchOptionSelected(event) {
124
- this.addBranchOption(event.option.value);
125
- }
126
- BranchesChanged(branches) {
127
- this.loadProjectHostingDetails();
128
- }
129
- BuildPathChanged(event) {
130
- //do something??
131
- }
132
- CreateNewSourceControl() {
133
- this.SetEditingSourceControl(Guid.CreateRaw());
134
- }
135
- CreateRepository() {
136
- this.CreatingRepository = true;
137
- this.RepositoryFormControl.reset();
138
- }
139
- CancelCreateRepository() {
140
- this.CreatingRepository = false;
141
- }
142
- DevOpsActionLookupChanged(event) {
143
- this.configureDevOpsAction();
144
- }
145
- MainBranchChanged(event) {
146
- this.emitBranchesChanged();
147
- }
148
- OrganizationChanged(event) {
149
- const org = this.OrganizationFormControl;
150
- this.RepositoryFormControl.reset();
151
- if (this.UseBranches) {
152
- this.BranchesFormControl.reset();
153
- this.SelectedBranches = [];
154
- }
155
- this.listRepositories();
156
- }
157
- RefreshOrganizations() {
158
- // this.Loading = true;
159
- this.listOrganizations();
160
- this.OrganizationFormControl?.reset();
161
- this.RepositoryFormControl?.reset();
162
- if (this.UseBranches) {
163
- this.BranchesFormControl?.reset();
164
- }
165
- }
166
- RemoveBranchOption(option) {
167
- const index = this.SelectedBranches.indexOf(option);
168
- if (index >= 0) {
169
- this.SelectedBranches.splice(index, 1);
170
- }
171
- this.emitBranchesChanged();
172
- }
173
- RepositoryChanged(event) {
174
- const repo = this.RepositoryFormControl;
175
- if (this.UseBranches) {
176
- this.BranchesFormControl.reset();
177
- this.SelectedBranches = [];
178
- this.listBranches();
179
- }
180
- if (!this.UseBranches) {
181
- this.listBuildPaths();
182
- }
183
- }
184
- SaveRepository() {
185
- this.Loading = true;
186
- const org = this.OrganizationFormControl.value;
187
- const repoName = this.RepositoryFormControl.value;
188
- this.appsFlowSvc
189
- .CreateRepository(org, repoName)
190
- .subscribe((response) => {
191
- if (response.Status.Code === 0) {
192
- this.listRepositories(repoName);
193
- this.CreatingRepository = false;
194
- }
195
- else {
196
- // TODO: Need to surface an error to the user...
197
- this.Loading = false;
198
- }
199
- });
200
- }
201
- SetEditingSourceControl(scLookup) {
202
- this.EditingSourceControlLookup = scLookup;
203
- }
204
- SubmitSourceControl() {
205
- console.log("source control submitted: ", this.DevOpsSourceControlFormGroup.value);
206
- this.SaveSourceControl();
207
- }
208
- SaveSourceControl() {
209
- const saveEnvReq = {
210
- Environment: {
211
- ...this.Environment,
212
- Artifacts: this.Environment.Artifacts || {},
213
- DevOpsActions: this.Environment.DevOpsActions || {},
214
- Secrets: this.Environment.Secrets || {},
215
- Sources: this.Environment.Sources || {},
216
- },
217
- EnvironmentLookup: this.EnvironmentLookup,
218
- EnterpriseDataTokens: {},
219
- };
220
- let artifactLookup;
221
- // let artifact: EaCArtifact = {
222
- // ...this.Artifact,
223
- // ...this.HostingDetailsFormControls
224
- // .SelectedHostingOptionInputControlValues,
225
- // };
226
- let artifact = this.Artifact;
227
- if (!this.ArtifactLookup) {
228
- artifactLookup = Guid.CreateRaw();
229
- artifact = {
230
- ...artifact,
231
- // Type: this.HostingDetailsFormControls.SelectedHostingOption
232
- // .ArtifactType,
233
- // Name: this.HostingDetailsFormControls.SelectedHostingOption.Name,
234
- NPMRegistry: 'https://registry.npmjs.org/',
235
- };
236
- }
237
- else {
238
- artifactLookup = this.ArtifactLookup;
239
- }
240
- saveEnvReq.Environment.Artifacts[artifactLookup] = artifact;
241
- let devOpsActionLookup;
242
- if (!this.DevOpsActionLookup) {
243
- devOpsActionLookup = Guid.CreateRaw();
244
- const doa = {
245
- ...this.DevOpsAction,
246
- ArtifactLookups: [artifactLookup],
247
- // Name: this.HostingDetailsFormControls.DevOpsActionNameFormControl.value,
248
- // Path: this.HostingDetailsFormControls.SelectedHostingOption.Path,
249
- // Templates:
250
- // this.HostingDetailsFormControls.SelectedHostingOption.Templates,
251
- };
252
- // if (this.HostingDetailsFormControls.NPMTokenFormControl?.value) {
253
- // const secretLookup = 'npm-access-token';
254
- // doa.SecretLookups = [secretLookup];
255
- // saveEnvReq.Environment.Secrets[secretLookup] = {
256
- // Name: 'NPM Access Token',
257
- // DataTokenLookup: secretLookup,
258
- // KnownAs: 'NPM_TOKEN',
259
- // };
260
- // saveEnvReq.EnterpriseDataTokens[secretLookup] = {
261
- // Name: saveEnvReq.Environment.Secrets[secretLookup].Name,
262
- // Description: saveEnvReq.Environment.Secrets[secretLookup].Name,
263
- // Value: this.NPMTokenFormControl.value,
264
- // };
265
- // }
266
- // saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
267
- saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = this.DevOpsAction;
268
- }
269
- else {
270
- devOpsActionLookup = this.DevOpsActionLookupFormControl.value;
271
- const doa = {
272
- ...this.DevOpsAction,
273
- // Name: this.HostingDetailsFormControls.DevOpsActionNameFormControl.value,
274
- };
275
- // saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
276
- saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = this.DevOpsAction;
277
- }
278
- let source = {
279
- ...this.EditingSourceControl,
280
- Branches: this.SelectedBranches,
281
- MainBranch: this.MainBranchFormControl.value,
282
- };
283
- source = {
284
- ...source,
285
- Type: 'GitHub',
286
- Name: this.EditingSourceControlLookup,
287
- DevOpsActionTriggerLookups: [devOpsActionLookup],
288
- Organization: this.OrganizationFormControl.value,
289
- Repository: this.RepositoryFormControl.value,
290
- };
291
- const scLookup = `github://${source.Organization}/${source.Repository}`;
292
- saveEnvReq.Environment.Sources[scLookup] = source;
293
- this.eacSvc.SaveEnvironmentAsCode(saveEnvReq);
294
- }
295
- // Helpers
296
- addBranchOption(value) {
297
- value = (value || '').trim();
298
- if (value && this.SelectedBranches.indexOf(value) < 0) {
299
- this.SelectedBranches.push(value);
300
- }
301
- this.BranchesInput.nativeElement.blur();
302
- this.emitBranchesChanged();
303
- }
304
- configureDevOpsAction() {
305
- setTimeout(() => {
306
- this.DevOpsActionLookupFormControl.setValue(this.DevOpsActionLookup);
307
- }, 0);
308
- }
309
- destroyFormControls() {
310
- this.DevOpsSourceControlFormGroup.removeControl([this.SourceControlRoot, 'mainBranch'].join(''));
311
- this.DevOpsSourceControlFormGroup?.removeControl([this.SourceControlRoot, 'branches'].join(''));
312
- this.DevOpsSourceControlFormGroup?.removeControl([this.SourceControlRoot, 'buildPath'].join(''));
313
- this.SelectedBranches = [];
314
- this.DevOpsSourceControlFormGroup?.removeControl([this.SourceControlRoot, 'organization'].join(''));
315
- this.DevOpsSourceControlFormGroup?.removeControl([this.SourceControlRoot, 'repository'].join(''));
316
- }
317
- emitBranchesChanged() {
318
- if (this.SelectedBranches?.length > 0 &&
319
- (!this.MainBranchFormControl.value ||
320
- this.SelectedBranches.indexOf(this.MainBranchFormControl.value) < 0)) {
321
- this.MainBranchFormControl.setValue(this.SelectedBranches.find((branch) => branch === 'main' || branch === 'master') || this.SelectedBranches[0]);
322
- }
323
- else if (this.SelectedBranches?.length <= 0) {
324
- this.MainBranchFormControl.reset();
325
- }
326
- this.BranchesFormControl.setValue(this.SelectedBranches.join(','));
327
- this.BranchesChanged(this.SelectedBranches || []);
328
- }
329
- listBranches() {
330
- if (this.UseBranches) {
331
- this.Loading = true;
332
- this.appsFlowSvc
333
- .ListBranches(this.OrganizationFormControl.value, this.RepositoryFormControl.value)
334
- .subscribe((response) => {
335
- this.BranchOptions = response.Model;
336
- this.Loading = false;
337
- if (this.EditingSourceControl?.Branches?.length > 0) {
338
- this.SelectedBranches = this.EditingSourceControl.Branches;
339
- }
340
- else if (this.BranchOptions?.length === 1) {
341
- this.BranchesFormControl.setValue(this.BranchOptions[0].Name);
342
- this.SelectedBranches = [this.BranchOptions[0].Name];
343
- }
344
- this.emitBranchesChanged();
345
- this.listBuildPaths();
346
- });
347
- }
348
- }
349
- listBuildPaths() {
350
- if (this.UseBuildPath) {
351
- this.Loading = true;
352
- this.appsFlowSvc
353
- .ListBuildPaths(this.OrganizationFormControl.value, this.RepositoryFormControl.value)
354
- .subscribe((response) => {
355
- this.BuildPathOptions = response.Model;
356
- this.Loading = false;
357
- if (this.BuildPathOptions?.length === 1) {
358
- this.BuildPathFormControl.setValue(this.BuildPathOptions[0]);
359
- }
360
- });
361
- }
362
- }
363
- listOrganizations() {
364
- this.Loading = true;
365
- this.appsFlowSvc
366
- .ListOrganizations()
367
- .subscribe((response) => {
368
- this.OrganizationOptions = response.Model;
369
- this.Loading = false;
370
- if (this.EditingSourceControl?.Organization) {
371
- setTimeout(() => {
372
- this.OrganizationFormControl.setValue(this.EditingSourceControl.Organization);
373
- this.listRepositories(this.EditingSourceControl?.Repository);
374
- }, 0);
375
- }
376
- });
377
- }
378
- listRepositories(activeRepo = null) {
379
- this.Loading = true;
380
- this.appsFlowSvc
381
- .ListRepositories(this.OrganizationFormControl.value)
382
- .subscribe((response) => {
383
- this.RepositoryOptions = response.Model;
384
- this.Loading = false;
385
- if (activeRepo) {
386
- setTimeout(() => {
387
- this.RepositoryFormControl.setValue(activeRepo);
388
- this.listBranches();
389
- if (!this.UseBranches) {
390
- this.listBuildPaths();
391
- }
392
- }, 0);
393
- }
394
- else if (this.RepositoryOptions?.length <= 0) {
395
- this.CreatingRepository = true;
396
- }
397
- });
398
- }
399
- loadProjectHostingDetails() {
400
- if (this.SelectedBranches?.length > 0) {
401
- this.HostingDetails.Loading = true;
402
- this.appsFlowSvc
403
- .LoadProjectHostingDetails(this.OrganizationFormControl?.value, this.RepositoryFormControl?.value, this.MainBranchFormControl?.value)
404
- .subscribe((response) => {
405
- this.HostingDetails = response.Model;
406
- this.HostingDetails.Loading = false;
407
- this.configureDevOpsAction();
408
- }, (err) => {
409
- this.HostingDetails.Loading = false;
410
- });
411
- }
412
- }
413
- setupFormControls() {
414
- // this.destroyFormControls();
415
- this.DevOpsSourceControlFormGroup.addControl('devOpsActionLookup', new FormControl(this.DevOpsActionLookup || '', []));
416
- this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'organization'].join(''), new FormControl(this.EditingSourceControl.Organization ?? '', Validators.required));
417
- this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'repository'].join(''), new FormControl(this.EditingSourceControl.Repository ?? '', Validators.required));
418
- if (this.UseBranches) {
419
- this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'branches'].join(''), new FormControl(this.EditingSourceControl?.Branches ?? '', Validators.required));
420
- this.SelectedBranches = this.EditingSourceControl?.Branches;
421
- this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'mainBranch'].join(''), new FormControl(this.EditingSourceControl.MainBranch ?? '', Validators.required));
422
- }
423
- if (this.UseBuildPath) {
424
- this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'buildPath'].join(''), new FormControl(this.BuildPath ?? '', Validators.required));
425
- }
426
- }
427
- }
428
- DevopsSourceControlFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DevopsSourceControlFormComponent, deps: [{ token: i1.ApplicationsFlowService }, { token: i2.EaCService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
429
- DevopsSourceControlFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: DevopsSourceControlFormComponent, selector: "lcu-devops-source-control-form", inputs: { EditingSourceControlLookup: ["editing-source-control-lookup", "EditingSourceControlLookup"], Environment: ["environment", "Environment"], EnvironmentLookup: ["environment-lookup", "EnvironmentLookup"] }, viewQueries: [{ propertyName: "BranchesInput", first: true, predicate: ["branches"], descendants: true }], ngImport: i0, template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select formControlName=\"devOpsActionLookup\" placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" (selectionChange)=\"DevOpsActionLookupChanged($event)\">\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option [value]=\"devOpsActionLookup\" *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field class=\"mat-full-width with-hint\" *ngIf=\"OrganizationOptions?.length > 0\">\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'organization'\" placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" [disabled]=\"Loading || HostingDetails?.Loading\" required>\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}\n"], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i9.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i12.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }], directives: [{ type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatPrefix, selector: "[matPrefix]" }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i16.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { type: i6.MatLabel, selector: "mat-label" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }] });
430
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: DevopsSourceControlFormComponent, decorators: [{
431
- type: Component,
432
- args: [{ selector: 'lcu-devops-source-control-form', template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select formControlName=\"devOpsActionLookup\" placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" (selectionChange)=\"DevOpsActionLookupChanged($event)\">\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option [value]=\"devOpsActionLookup\" *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field class=\"mat-full-width with-hint\" *ngIf=\"OrganizationOptions?.length > 0\">\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'organization'\" placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" [disabled]=\"Loading || HostingDetails?.Loading\" required>\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!DevOpsSourceControlFormGroup.valid || !DevOpsSourceControlFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Source Control\n </button>\n \n </mat-card-actions>\n </mat-card>\n</form>", styles: [".form-card,.sc-card{width:100%}\n"] }]
433
- }], ctorParameters: function () { return [{ type: i1.ApplicationsFlowService }, { type: i2.EaCService }, { type: i3.FormBuilder }]; }, propDecorators: { EditingSourceControlLookup: [{
434
- type: Input,
435
- args: ['editing-source-control-lookup']
436
- }], Environment: [{
437
- type: Input,
438
- args: ['environment']
439
- }], EnvironmentLookup: [{
440
- type: Input,
441
- args: ['environment-lookup']
442
- }], BranchesInput: [{
443
- type: ViewChild,
444
- args: ['branches']
445
- }] } });
446
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQWlCLFNBQVMsRUFBYyxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQWdDLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlsRyxPQUFPLEVBQXFDLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0RSxPQUFPLEVBQXNELHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPaEksTUFBTSxPQUFPLGdDQUFnQztJQWlKM0MsZ0JBQWdCO0lBQ2hCLFlBQ1ksV0FBb0MsRUFDcEMsTUFBa0IsRUFDbEIsV0FBd0I7UUFGeEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFOcEIsdUJBQWtCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFVLENBQUM7UUFTM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJ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LG9CQUFvQixDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQ3BCLENBQ0YsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQzFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFDOUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUMzRCxDQUFDO1NBQ0g7SUFDSCxDQUFDOzs2SEFqcEJVLGdDQUFnQztpSEFBaEMsZ0NBQWdDLHVZQ2pCN0MsMDZUQThPTzsyRkQ3Tk0sZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQztpS0FTbkMsMEJBQTBCO3NCQURoQyxLQUFLO3VCQUFDLCtCQUErQjtnQkFJL0IsV0FBVztzQkFEakIsS0FBSzt1QkFBQyxhQUFhO2dCQUliLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBSXBCLGFBQWE7c0JBRG5CLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBCYXNlTW9kZWxlZFJlc3BvbnNlLCBCYXNlUmVzcG9uc2UsIEd1aWQgfSBmcm9tICdAbGN1L2NvbW1vbic7XG5pbXBvcnQgeyBFYUNBcnRpZmFjdCwgRWFDRGV2T3BzQWN0aW9uLCBFYUNFbnZpcm9ubWVudEFzQ29kZSwgRWFDU291cmNlQ29udHJvbCB9IGZyb20gJ0BzZW1hbnRpY2pzL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbnNGbG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9ucy1mbG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWFDU2VydmljZSwgU2F2ZUVudmlyb25tZW50QXNDb2RlRXZlbnRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWFjLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2l0SHViQnJhbmNoLCBHaXRIdWJPcmdhbml6YXRpb24sIEdpdEh1YlJlcG9zaXRvcnksIFByb2plY3RIb3N0aW5nRGV0YWlscyB9IGZyb20gJy4uLy4uL3N0YXRlL2FwcGxpY2F0aW9ucy1mbG93LnN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN1LWRldm9wcy1zb3VyY2UtY29udHJvbC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rldm9wcy1zb3VyY2UtY29udHJvbC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXZvcHNTb3VyY2VDb250cm9sRm9ybUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgLy8gIEZpZWxkc1xuXG4gIEBJbnB1dCgnZWRpdGluZy1zb3VyY2UtY29udHJvbC1sb29rdXAnKVxuICBwdWJsaWMgRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2Vudmlyb25tZW50JylcbiAgcHVibGljIEVudmlyb25tZW50OiBFYUNFbnZpcm9ubWVudEFzQ29kZTtcblxuICBASW5wdXQoJ2Vudmlyb25tZW50LWxvb2t1cCcpXG4gIHB1YmxpYyBFbnZpcm9ubWVudExvb2t1cDogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoJ2JyYW5jaGVzJylcbiAgcHVibGljIEJyYW5jaGVzSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgLy9PcHRpb25hbCBpbnB1dCBub3QgYmVpbmcgdXNlZCBzZXR0aW5nIHRvIFxuICAvLyBASW5wdXQoJ2J1aWxkLXBhdGgnKVxuICBwdWJsaWMgQnVpbGRQYXRoOiBzdHJpbmc7XG5cbiAgLy9PcHRpb25hbCBub3QgYmVpbmcgdXNlZFxuICAvLyBASW5wdXQoJ2J1aWxkLXBhdGgtZGlzYWJsZWQnKVxuICBwdWJsaWMgQnVpbGRQYXRoRGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLy8gdGhpcyBpbnB1dCBpcyBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZVxuICAvLyBASW5wdXQoJ3NvdXJjZS1jb250cm9sLXJvb3QnKVxuICBwdWJsaWMgU291cmNlQ29udHJvbFJvb3Q6IHN0cmluZztcblxuICAvL25vdCBiZWluZyB1c2VkIHNldCB0byB0cnVlIGJ5IGRlZmF1bHRcbiAgLy8gQElucHV0KCd1c2UtYnJhbmNoZXMnKVxuICBwdWJsaWMgVXNlQnJhbmNoZXM6IGJvb2xlYW47XG5cbiAgLy9ub3QgYmVpbmcgdXNlZCBzZXQgdG8gZmFsc2UgYnkgZGVmYXVsdFxuICAvLyBASW5wdXQoJ3VzZS1idWlsZC1wYXRoJylcbiAgcHVibGljIFVzZUJ1aWxkUGF0aDogYm9vbGVhbjtcblxuXG5cblxuICAvLyAgUHJvcGVydGllc1xuXG4gIHB1YmxpYyBnZXQgQXJ0aWZhY3RMb29rdXBzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLkRldk9wc0FjdGlvbj8uQXJ0aWZhY3RMb29rdXBzO1xuICB9XG5cbiAgcHVibGljIGdldCBBcnRpZmFjdExvb2t1cCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFydExvb2t1cCA9IHRoaXMuRGV2T3BzQWN0aW9uPy5BcnRpZmFjdExvb2t1cHNcbiAgICAgID8gdGhpcy5EZXZPcHNBY3Rpb24/LkFydGlmYWN0TG9va3Vwc1swXVxuICAgICAgOiBudWxsO1xuICAgICAgcmV0dXJuIGFydExvb2t1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQXJ0aWZhY3QoKVxuICA6IEVhQ0FydGlmYWN0e1xuICAgIHJldHVybiB0aGlzLkVudmlyb25tZW50Py5BcnRpZmFjdHMgJiYgdGhpcy5BcnRpZmFjdExvb2t1cFxuICAgID8gdGhpcy5FbnZpcm9ubWVudD8uQXJ0aWZhY3RzW3RoaXMuQXJ0aWZhY3RMb29rdXBdIHx8IHt9XG4gICAgOiB7fTtcbiAgfSBcbiAgcHVibGljIGdldCBCcmFuY2hlc0Zvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQodGhpcy5Tb3VyY2VDb250cm9sUm9vdCArICdicmFuY2hlcycpO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0IEJ1aWxkUGF0aEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQodGhpcy5Tb3VyY2VDb250cm9sUm9vdCArICdidWlsZFBhdGgnKTtcbiAgfVxuXG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25Mb29rdXBzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuRGV2T3BzQWN0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuRGV2T3BzQWN0aW9ucyB8fCB7fSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbigpOiBhbnl7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyAmJiB0aGlzLkRldk9wc0FjdGlvbkxvb2t1cFxuICAgICAgPyB0aGlzLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnNbdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBdIHx8IHt9XG4gICAgICA6IHt9O1xuICB9XG5cbiAgXG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25Mb29rdXAoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLkRldk9wc0FjdGlvbkxvb2t1cEZvcm1Db250cm9sPy52YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCEhdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uRGV2T3BzQWN0aW9uVHJpZ2dlckxvb2t1cHMpIHtcbiAgICAgIHJldHVybiB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5EZXZPcHNBY3Rpb25UcmlnZ2VyTG9va3Vwc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KCdkZXZPcHNBY3Rpb25Mb29rdXAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9ucygpOiB7IFtsb29rdXA6IHN0cmluZ106IEVhQ0Rldk9wc0FjdGlvbiB9IHtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zIHx8IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBFZGl0aW5nU291cmNlQ29udHJvbCgpOiBFYUNTb3VyY2VDb250cm9sIHtcbiAgICBsZXQgc2MgPSB0aGlzLkVudmlyb25tZW50Py5Tb3VyY2VzXG4gICAgICA/IHRoaXMuRW52aXJvbm1lbnQ/LlNvdXJjZXNbdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cF1cbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChzYyA9PSBudWxsICYmIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXApIHtcbiAgICAgIHNjID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjO1xuICB9XG5cbiAgcHVibGljIGdldCBNYWluQnJhbmNoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ21haW5CcmFuY2gnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgT3JnYW5pemF0aW9uRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ29yZ2FuaXphdGlvbicpO1xuICB9XG5cbiAgcHVibGljIGdldCBSZXBvc2l0b3J5Rm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ3JlcG9zaXRvcnknKTtcbiAgfVxuXG4gIHB1YmxpYyBCcmFuY2hPcHRpb25zOiBHaXRIdWJCcmFuY2hbXTtcblxuICBwdWJsaWMgQnVpbGRQYXRoT3B0aW9uczogc3RyaW5nW107XG5cbiAgcHVibGljIENyZWF0aW5nUmVwb3NpdG9yeTogYm9vbGVhbjtcblxuICBwdWJsaWMgRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyBIb3N0aW5nRGV0YWlsczogUHJvamVjdEhvc3RpbmdEZXRhaWxzO1xuXG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBPcmdhbml6YXRpb25PcHRpb25zOiBHaXRIdWJPcmdhbml6YXRpb25bXTtcblxuICBwdWJsaWMgUmVwb3NpdG9yeU9wdGlvbnM6IEdpdEh1YlJlcG9zaXRvcnlbXTtcblxuICBwdWJsaWMgU2VsZWN0ZWRCcmFuY2hlczogc3RyaW5nW107XG5cbiAgcHVibGljIHJlYWRvbmx5IFNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xuXG4gIC8vICBDb25zdHJ1Y3RvcnNcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwcHNGbG93U3ZjOiBBcHBsaWNhdGlvbnNGbG93U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZWFjU3ZjOiBFYUNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICkge1xuXG4gICAgdGhpcy5CdWlsZFBhdGggPSBudWxsO1xuXG4gICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IG5ldyBQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5Tb3VyY2VDb250cm9sUm9vdCA9ICcnO1xuXG4gICAgdGhpcy5Vc2VCcmFuY2hlcyA9IHRydWU7XG5cbiAgICB0aGlzLlVzZUJ1aWxkUGF0aCA9IGZhbHNlO1xuXG4gIH1cblxuICAvLyAgTGlmZSBDeWNsZVxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQgeyB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUZvcm1Db250cm9scygpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuQ3JlYXRlTmV3U291cmNlQ29udHJvbCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sICE9IG51bGwpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuXG4gICAgICB0aGlzLnNldHVwRm9ybUNvbnRyb2xzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5SZWZyZXNoT3JnYW5pemF0aW9ucygpO1xuICB9XG5cbiAgLy8gIEFQSSBNZXRob2RzXG4gIHB1YmxpYyBBZGRCcmFuY2hPcHRpb24oZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG5cbiAgICB0aGlzLmFkZEJyYW5jaE9wdGlvbihldmVudC52YWx1ZSk7XG5cbiAgICBldmVudC5pbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIEJyYW5jaE9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5hZGRCcmFuY2hPcHRpb24oZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBCcmFuY2hlc0NoYW5nZWQoYnJhbmNoZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkUHJvamVjdEhvc3RpbmdEZXRhaWxzKCk7XG4gIH1cblxuICBwdWJsaWMgQnVpbGRQYXRoQ2hhbmdlZChldmVudDogTWF0U2VsZWN0Q2hhbmdlKTogdm9pZCB7XG4gICAgLy9kbyBzb21ldGhpbmc/P1xuICB9XG5cbiAgcHVibGljIENyZWF0ZU5ld1NvdXJjZUNvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5TZXRFZGl0aW5nU291cmNlQ29udHJvbChHdWlkLkNyZWF0ZVJhdygpKTtcbiAgfVxuXG4gIHB1YmxpYyBDcmVhdGVSZXBvc2l0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuQ3JlYXRpbmdSZXBvc2l0b3J5ID0gdHJ1ZTtcblxuICAgIHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgQ2FuY2VsQ3JlYXRlUmVwb3NpdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIERldk9wc0FjdGlvbkxvb2t1cENoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJlRGV2T3BzQWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgTWFpbkJyYW5jaENoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuZW1pdEJyYW5jaGVzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIE9yZ2FuaXphdGlvbkNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IG9yZyA9IHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgaWYgKHRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RSZXBvc2l0b3JpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBSZWZyZXNoT3JnYW5pemF0aW9ucygpOiB2b2lkIHtcbiAgICAvLyB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubGlzdE9yZ2FuaXphdGlvbnMoKTtcblxuICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnJlc2V0KCk7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbD8ucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2w/LnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFJlbW92ZUJyYW5jaE9wdGlvbihvcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2Yob3B0aW9uKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRCcmFuY2hlc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBSZXBvc2l0b3J5Q2hhbmdlZChldmVudDogTWF0U2VsZWN0Q2hhbmdlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sO1xuXG4gICAgaWYgKHRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5yZXNldCgpO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSBbXTtcblxuICAgICAgdGhpcy5saXN0QnJhbmNoZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMubGlzdEJ1aWxkUGF0aHMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgU2F2ZVJlcG9zaXRvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9yZyA9IHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgLkNyZWF0ZVJlcG9zaXRvcnkob3JnLCByZXBvTmFtZSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBCYXNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLlN0YXR1cy5Db2RlID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5saXN0UmVwb3NpdG9yaWVzKHJlcG9OYW1lKTtcblxuICAgICAgICAgIHRoaXMuQ3JlYXRpbmdSZXBvc2l0b3J5ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gIFRPRE86ICBOZWVkIHRvIHN1cmZhY2UgYW4gZXJyb3IgdG8gdGhlIHVzZXIuLi5cblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBTZXRFZGl0aW5nU291cmNlQ29udHJvbChzY0xvb2t1cDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCA9IHNjTG9va3VwO1xuICB9XG5cbiAgcHVibGljIFN1Ym1pdFNvdXJjZUNvbnRyb2woKSB7XG4gICAgY29uc29sZS5sb2coXCJzb3VyY2UgY29udHJvbCBzdWJtaXR0ZWQ6IFwiLCB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAudmFsdWUpO1xuICAgIHRoaXMuU2F2ZVNvdXJjZUNvbnRyb2woKTtcblxuICB9XG5cbiAgcHVibGljIFNhdmVTb3VyY2VDb250cm9sKCk6IHZvaWQge1xuICAgIGNvbnN0IHNhdmVFbnZSZXE6IFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCA9ICBcblxuICAgIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLnRoaXMuRW52aXJvbm1lbnQsXG4gICAgICAgIEFydGlmYWN0czogdGhpcy5FbnZpcm9ubWVudC5BcnRpZmFjdHMgfHwge30sXG4gICAgICAgIERldk9wc0FjdGlvbnM6IHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyB8fCB7fSxcbiAgICAgICAgU2VjcmV0czogdGhpcy5FbnZpcm9ubWVudC5TZWNyZXRzIHx8IHt9LFxuICAgICAgICBTb3VyY2VzOiB0aGlzLkVudmlyb25tZW50LlNvdXJjZXMgfHwge30sXG4gICAgICB9LFxuICAgICAgRW52aXJvbm1lbnRMb29rdXA6IHRoaXMuRW52aXJvbm1lbnRMb29rdXAsXG4gICAgICBFbnRlcnByaXNlRGF0YVRva2Vuczoge30sXG4gICAgfTtcblxuICAgIGxldCBhcnRpZmFjdExvb2t1cDogc3RyaW5nO1xuXG4gICAgLy8gbGV0IGFydGlmYWN0OiBFYUNBcnRpZmFjdCA9IHtcbiAgICAvLyAgIC4uLnRoaXMuQXJ0aWZhY3QsXG4gICAgLy8gICAuLi50aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzXG4gICAgLy8gICAgIC5TZWxlY3RlZEhvc3RpbmdPcHRpb25JbnB1dENvbnRyb2xWYWx1ZXMsXG4gICAgLy8gfTtcblxuICAgIGxldCBhcnRpZmFjdCA9IHRoaXMuQXJ0aWZhY3RcblxuICAgIGlmICghdGhpcy5BcnRpZmFjdExvb2t1cCkge1xuICAgICAgYXJ0aWZhY3RMb29rdXAgPSBHdWlkLkNyZWF0ZVJhdygpO1xuXG4gICAgICBhcnRpZmFjdCA9IHtcbiAgICAgICAgLi4uYXJ0aWZhY3QsXG4gICAgICAgIC8vIFR5cGU6IHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uXG4gICAgICAgIC8vICAgLkFydGlmYWN0VHlwZSxcbiAgICAgICAgLy8gTmFtZTogdGhpcy5Ib3N0aW5nRGV0YWlsc0Zvcm1Db250cm9scy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uTmFtZSxcbiAgICAgICAgTlBNUmVnaXN0cnk6ICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJ0aWZhY3RMb29rdXAgPSB0aGlzLkFydGlmYWN0TG9va3VwO1xuICAgIH1cblxuICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuQXJ0aWZhY3RzW2FydGlmYWN0TG9va3VwXSA9IGFydGlmYWN0O1xuXG4gICAgbGV0IGRldk9wc0FjdGlvbkxvb2t1cDogc3RyaW5nO1xuXG4gICAgaWYgKCF0aGlzLkRldk9wc0FjdGlvbkxvb2t1cCkge1xuICAgICAgZGV2T3BzQWN0aW9uTG9va3VwID0gR3VpZC5DcmVhdGVSYXcoKTtcblxuICAgICAgY29uc3QgZG9hOiBFYUNEZXZPcHNBY3Rpb24gPSB7XG4gICAgICAgIC4uLnRoaXMuRGV2T3BzQWN0aW9uLFxuICAgICAgICBBcnRpZmFjdExvb2t1cHM6IFthcnRpZmFjdExvb2t1cF0sXG4gICAgICAgIC8vIE5hbWU6IHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuRGV2T3BzQWN0aW9uTmFtZUZvcm1Db250cm9sLnZhbHVlLFxuICAgICAgICAvLyBQYXRoOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLlNlbGVjdGVkSG9zdGluZ09wdGlvbi5QYXRoLFxuICAgICAgICAvLyBUZW1wbGF0ZXM6XG4gICAgICAgIC8vICAgdGhpcy5Ib3N0aW5nRGV0YWlsc0Zvcm1Db250cm9scy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uVGVtcGxhdGVzLFxuICAgICAgfTtcblxuICAgICAgLy8gaWYgKHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuTlBNVG9rZW5Gb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgIC8vICAgY29uc3Qgc2VjcmV0TG9va3VwID0gJ25wbS1hY2Nlc3MtdG9rZW4nO1xuXG4gICAgICAvLyAgIGRvYS5TZWNyZXRMb29rdXBzID0gW3NlY3JldExvb2t1cF07XG5cbiAgICAgIC8vICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5TZWNyZXRzW3NlY3JldExvb2t1cF0gPSB7XG4gICAgICAvLyAgICAgTmFtZTogJ05QTSBBY2Nlc3MgVG9rZW4nLFxuICAgICAgLy8gICAgIERhdGFUb2tlbkxvb2t1cDogc2VjcmV0TG9va3VwLFxuICAgICAgLy8gICAgIEtub3duQXM6ICdOUE1fVE9LRU4nLFxuICAgICAgLy8gICB9O1xuXG4gICAgICAvLyAgIHNhdmVFbnZSZXEuRW50ZXJwcmlzZURhdGFUb2tlbnNbc2VjcmV0TG9va3VwXSA9IHtcbiAgICAgIC8vICAgICBOYW1lOiBzYXZlRW52UmVxLkVudmlyb25tZW50LlNlY3JldHNbc2VjcmV0TG9va3VwXS5OYW1lLFxuICAgICAgLy8gICAgIERlc2NyaXB0aW9uOiBzYXZlRW52UmVxLkVudmlyb25tZW50LlNlY3JldHNbc2VjcmV0TG9va3VwXS5OYW1lLFxuICAgICAgLy8gICAgIFZhbHVlOiB0aGlzLk5QTVRva2VuRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAvLyAgIH07XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gZG9hO1xuICAgICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zW2Rldk9wc0FjdGlvbkxvb2t1cF0gPSB0aGlzLkRldk9wc0FjdGlvbjtcblxuICAgIH0gZWxzZSB7XG4gICAgICBkZXZPcHNBY3Rpb25Mb29rdXAgPSB0aGlzLkRldk9wc0FjdGlvbkxvb2t1cEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICBjb25zdCBkb2E6IEVhQ0Rldk9wc0FjdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5EZXZPcHNBY3Rpb24sXG4gICAgICAgIC8vIE5hbWU6IHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuRGV2T3BzQWN0aW9uTmFtZUZvcm1Db250cm9sLnZhbHVlLFxuICAgICAgfTtcblxuICAgICAgLy8gc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zW2Rldk9wc0FjdGlvbkxvb2t1cF0gPSBkb2E7XG4gICAgICBzYXZlRW52UmVxLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnNbZGV2T3BzQWN0aW9uTG9va3VwXSA9IHRoaXMuRGV2T3BzQWN0aW9uO1xuXG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZTogRWFDU291cmNlQ29udHJvbCA9IHtcbiAgICAgIC4uLnRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wsXG4gICAgICBCcmFuY2hlczogdGhpcy5TZWxlY3RlZEJyYW5jaGVzLFxuICAgICAgTWFpbkJyYW5jaDogdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgfTtcblxuICAgIHNvdXJjZSA9IHtcbiAgICAgIC4uLnNvdXJjZSxcbiAgICAgIFR5cGU6ICdHaXRIdWInLFxuICAgICAgTmFtZTogdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCxcbiAgICAgIERldk9wc0FjdGlvblRyaWdnZXJMb29rdXBzOiBbZGV2T3BzQWN0aW9uTG9va3VwXSxcbiAgICAgIE9yZ2FuaXphdGlvbjpcbiAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgIFJlcG9zaXRvcnk6IHRoaXMuUmVwb3NpdG9yeUZvcm1Db250cm9sLnZhbHVlLFxuICAgIH07XG5cbiAgICBjb25zdCBzY0xvb2t1cCA9IGBnaXRodWI6Ly8ke3NvdXJjZS5Pcmdhbml6YXRpb259LyR7c291cmNlLlJlcG9zaXRvcnl9YDtcblxuICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuU291cmNlc1tzY0xvb2t1cF0gPSBzb3VyY2U7XG5cbiAgICB0aGlzLmVhY1N2Yy5TYXZlRW52aXJvbm1lbnRBc0NvZGUoc2F2ZUVudlJlcSk7XG4gIH1cblxuICAvLyAgSGVscGVyc1xuXG4gIHByb3RlY3RlZCBhZGRCcmFuY2hPcHRpb24odmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBpZiAodmFsdWUgJiYgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2YodmFsdWUpIDwgMCkge1xuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuQnJhbmNoZXNJbnB1dC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcblxuICAgIHRoaXMuZW1pdEJyYW5jaGVzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZURldk9wc0FjdGlvbigpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5EZXZPcHNBY3Rpb25Mb29rdXApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lGb3JtQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ21haW5CcmFuY2gnXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdicmFuY2hlcyddLmpvaW4oJycpKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cD8ucmVtb3ZlQ29udHJvbChbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2J1aWxkUGF0aCddLmpvaW4oJycpKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwPy5yZW1vdmVDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdvcmdhbml6YXRpb24nXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ3JlcG9zaXRvcnknXS5qb2luKCcnKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJyYW5jaGVzQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICghdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUgfHxcbiAgICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2YodGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUpIDwgMClcbiAgICApIHtcbiAgICAgIHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuZmluZChcbiAgICAgICAgICAoYnJhbmNoKSA9PiBicmFuY2ggPT09ICdtYWluJyB8fCBicmFuY2ggPT09ICdtYXN0ZXInXG4gICAgICAgICkgfHwgdGhpcy5TZWxlY3RlZEJyYW5jaGVzWzBdXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5TZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5TZWxlY3RlZEJyYW5jaGVzLmpvaW4oJywnKSk7XG5cbiAgICB0aGlzLkJyYW5jaGVzQ2hhbmdlZCh0aGlzLlNlbGVjdGVkQnJhbmNoZXMgfHwgW10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RCcmFuY2hlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTGlzdEJyYW5jaGVzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJCcmFuY2hbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJyYW5jaE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkJyYW5jaGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLkJyYW5jaGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5CcmFuY2hPcHRpb25zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFt0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG5cbiAgICAgICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0QnVpbGRQYXRocygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCdWlsZFBhdGgpIHtcbiAgICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgICAgLkxpc3RCdWlsZFBhdGhzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxzdHJpbmdbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGF0aE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuQnVpbGRQYXRoT3B0aW9ucz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLkJ1aWxkUGF0aEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnVpbGRQYXRoT3B0aW9uc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdE9yZ2FuaXphdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5MaXN0T3JnYW5pemF0aW9ucygpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJPcmdhbml6YXRpb25bXT4pID0+IHtcbiAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25PcHRpb25zID0gcmVzcG9uc2UuTW9kZWw7XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/Lk9yZ2FuaXphdGlvbikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5Pcmdhbml6YXRpb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdFJlcG9zaXRvcmllcyh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5SZXBvc2l0b3J5KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdFJlcG9zaXRvcmllcyhhY3RpdmVSZXBvOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5MaXN0UmVwb3NpdG9yaWVzKHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJSZXBvc2l0b3J5W10+KSA9PiB7XG4gICAgICAgIHRoaXMuUmVwb3NpdG9yeU9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoYWN0aXZlUmVwbykge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wuc2V0VmFsdWUoYWN0aXZlUmVwbyk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdEJyYW5jaGVzKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgICAgICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5SZXBvc2l0b3J5T3B0aW9ucz8ubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRCcmFuY2hlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTG9hZFByb2plY3RIb3N0aW5nRGV0YWlscyhcbiAgICAgICAgICB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWx1ZSxcbiAgICAgICAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsdWUsXG4gICAgICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2w/LnZhbHVlXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzcG9uc2U6IEJhc2VNb2RlbGVkUmVzcG9uc2U8UHJvamVjdEhvc3RpbmdEZXRhaWxzPikgPT4ge1xuICAgICAgICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IHJlc3BvbnNlLk1vZGVsO1xuXG4gICAgICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzLkxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmVEZXZPcHNBY3Rpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBGb3JtQ29udHJvbHMoKTogdm9pZCB7XG5cbiAgICAvLyB0aGlzLmRlc3Ryb3lGb3JtQ29udHJvbHMoKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2Rldk9wc0FjdGlvbkxvb2t1cCcsXG4gICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5EZXZPcHNBY3Rpb25Mb29rdXAgfHwgJycsIFtdKVxuICAgICk7XG5cblxuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ29yZ2FuaXphdGlvbiddLmpvaW4oJycpLFxuICAgICAgbmV3IEZvcm1Db250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLk9yZ2FuaXphdGlvbiA/PyAnJyxcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAncmVwb3NpdG9yeSddLmpvaW4oJycpLFxuICAgICAgbmV3IEZvcm1Db250cm9sKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2wuUmVwb3NpdG9yeSA/PyAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuVXNlQnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2JyYW5jaGVzJ10uam9pbignJyksXG4gICAgICAgIG5ldyBGb3JtQ29udHJvbCh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5CcmFuY2hlcyA/PyAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkJyYW5jaGVzO1xuXG4gICAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdtYWluQnJhbmNoJ10uam9pbignJyksXG4gICAgICAgIG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgICB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLk1haW5CcmFuY2ggPz8gJycsXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLlVzZUJ1aWxkUGF0aCkge1xuICAgICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnYnVpbGRQYXRoJ10uam9pbignJyksXG4gICAgICAgIG5ldyBGb3JtQ29udHJvbCh0aGlzLkJ1aWxkUGF0aCA/PyAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgICAgICk7XG4gICAgfVxuICB9XG59IiwiPGZvcm0gY2xhc3M9XCJmb3JtLWNhcmRcIiBbZm9ybUdyb3VwXT1cIkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXBcIiAobmdTdWJtaXQpPVwiU3VibWl0U291cmNlQ29udHJvbCgpXCI+XG5cbiAgPG1hdC1jYXJkIGNsYXNzPVwic3ByZWFkXCIgY2xhc3M9XCJzYy1jYXJkXCI+XG4gICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC10aXRsZT4gU291cmNlIENvbnRyb2wgPC9tYXQtY2FyZC10aXRsZT5cblxuICAgICAgPGRpdiBmeEZsZXg+PC9kaXY+XG5cbiAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggbWF0VG9vbHRpcD1cIkNvbmZpZ3VyZSBzb3VyY2UgY29udHJvbCwgRGV2T3BzIENJL0NELCBhbmQgYXJ0aWZhY3RzLlwiPlxuICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgIDwvbWF0LWljb24+XG4gICAgPC9tYXQtY2FyZC1oZWFkZXI+XG5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGV2T3BzQWN0aW9uTG9va3VwXCIgcGxhY2Vob2xkZXI9XCJEZXZPcHMgQWN0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiIChzZWxlY3Rpb25DaGFuZ2UpPVwiRGV2T3BzQWN0aW9uTG9va3VwQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkZXZPcHNBY3Rpb25Mb29rdXAgb2YgRGV2T3BzQWN0aW9uTG9va3Vwc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZGV2T3BzQWN0aW9uTG9va3VwXCIgKm5nSWY9XCJEZXZPcHNBY3Rpb25zW2Rldk9wc0FjdGlvbkxvb2t1cF07IGxldCBkZXZPcHNBY3Rpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBkZXZPcHNBY3Rpb24uTmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJcIj4tLSBDcmVhdGUgTmV3IC0tPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIiAqbmdJZj1cIk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCB8fCAhTG9hZGluZ1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCB3aXRoLWhpbnRcIiAqbmdJZj1cIk9yZ2FuaXphdGlvbk9wdGlvbnM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmctaWNvblwiIG1hdFByZWZpeD5jb3Jwb3JhdGVfZmFyZTwvbWF0LWljb24+XG5cbiAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIlNvdXJjZUNvbnRyb2xSb290ICsgJ29yZ2FuaXphdGlvbidcIiBwbGFjZWhvbGRlcj1cIk9yZ2FuaXphdGlvblwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIk9yZ2FuaXphdGlvbkNoYW5nZWQoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcmdPcHQgb2YgT3JnYW5pemF0aW9uT3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3JnT3B0Lk5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcmdPcHQuTmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IChjbGljayk9XCJSZWZyZXNoT3JnYW5pemF0aW9ucygpXCIgbWF0VG9vbHRpcD1cIlJlZnJlc2ggT3JnYW5pemF0aW9uXCI+IHJlZnJlc2ggPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxhIG1hdFN1ZmZpeCBocmVmPVwiLy5vYXV0aC9naXRodWI/b2F1dGgtZm9yY2UtZWRpdD10cnVlXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY29sb3I9XCJhY2NlbnRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cImFjY2VudFwiIG1hdFRvb2x0aXA9XCJSZS1hdXRob3JpemUgT3JnYW5pemF0aW9uc1wiPiBsYXVuY2ggPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhbiBvcmdhbml6YXRpb24gb3Igd291bGQgbGlrZSB0byBjcmVhdGUgYSBuZXcgb25lLFxuICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9hY2NvdW50L29yZ2FuaXphdGlvbnMvbmV3XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgICAgIHN0YXJ0IGhlcmVcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgKE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCAmJiAhTG9hZGluZylcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdyZXBvc2l0b3J5J1wiIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgPyAnUmVwb3NpdG9yeSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdSZXBvc2l0b3J5IChzZWxlY3Qgb3JnYW5pemF0aW9uIGZpcnN0KSdcbiAgICAgICAgICAgICAgICAgIFwiIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgIU9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZCB8fCBMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXG4gICAgICAgICAgICAgICAgICBcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIlJlcG9zaXRvcnlDaGFuZ2VkKCRldmVudClcIiAqbmdJZj1cIiFDcmVhdGluZ1JlcG9zaXRvcnlcIiByZXF1aXJlZD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlcG9PcHQgb2YgUmVwb3NpdG9yeU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInJlcG9PcHQuTmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IHJlcG9PcHQuTmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJSZXBvc2l0b3J5IChjcmVhdGVzIG5ldyBpZiBkb2VzIG5vdCBleGlzdClcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdyZXBvc2l0b3J5J1wiICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5XCJcbiAgICAgICAgICAgIFtmeEhpZGVdPVwiTG9hZGluZyB8fCBIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiIHJlcXVpcmVkIC8+XG5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IChjbGljayk9XCJDcmVhdGVSZXBvc2l0b3J5KClcIiBbZnhIaWRlXT1cIkxvYWRpbmcgfHwgSG9zdGluZ0RldGFpbHM/LkxvYWRpbmdcIlxuICAgICAgICAgICAgKm5nSWY9XCIhQ3JlYXRpbmdSZXBvc2l0b3J5ICYmIE9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgYWRkX2NpcmNsZVxuICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJTYXZlUmVwb3NpdG9yeSgpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5ICYmIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgc2F2ZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIkNhbmNlbENyZWF0ZVJlcG9zaXRvcnkoKVwiICpuZ0lmPVwiQ3JlYXRpbmdSZXBvc2l0b3J5XCI+XG5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICAgIGNhbmNlbFxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgKEJyYW5jaGVzRm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgICAoT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIUxvYWRpbmcpKSAmJlxuICAgICAgICAgICAgICAgICFDcmVhdGluZ1JlcG9zaXRvcnkgJiZcbiAgICAgICAgICAgICAgICBVc2VCcmFuY2hlc1xuICAgICAgICAgICAgICBcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmctaWNvblwiIG1hdFByZWZpeD5hY2NvdW50X3RyZWU8L21hdC1pY29uPlxuXG4gICAgICAgICAgPG1hdC1sYWJlbD5TZWxlY3RlZCBCcmFuY2hlczwvbWF0LWxhYmVsPlxuXG4gICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgKG9wdGlvblNlbGVjdGVkKT1cIkJyYW5jaE9wdGlvblNlbGVjdGVkKCRldmVudClcIiAjYnJhbmNoT3B0aW9ucz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnJhbmNoT3B0IG9mIEJyYW5jaE9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJyYW5jaE9wdC5OYW1lXCI+XG4gICAgICAgICAgICAgICAge3sgYnJhbmNoT3B0Lk5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXG4gICAgICAgICAgPG1hdC1jaGlwLWxpc3QgI3NlbGVjdGVkQnJhbmNoZXM+XG4gICAgICAgICAgICA8bWF0LWNoaXAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwiUmVtb3ZlQnJhbmNoT3B0aW9uKHNlbEJyYW5jaClcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VsQnJhbmNoIG9mIFNlbGVjdGVkQnJhbmNoZXNcIj5cbiAgICAgICAgICAgICAge3sgc2VsQnJhbmNoIH19XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L21hdC1jaGlwPlxuXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJOZXcgQnJhbmNoLi4uXCIgW2Zvcm1Db250cm9sTmFtZV09XCJTb3VyY2VDb250cm9sUm9vdCArICdicmFuY2hlcydcIiAjYnJhbmNoZXNcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJicmFuY2hPcHRpb25zXCIgW21hdENoaXBJbnB1dEZvcl09XCJzZWxlY3RlZEJyYW5jaGVzXCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cIlNlcGFyYXRvcktleXNDb2Rlc1wiIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJBZGRCcmFuY2hPcHRpb24oJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWQgLz5cbiAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGggd2l0aC1oaW50XCIgW2Z4U2hvd109XCJTZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnLWljb25cIiBtYXRQcmVmaXg+YWNjb3VudF90cmVlPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnbWFpbkJyYW5jaCdcIiBwbGFjZWhvbGRlcj1cIk1haW4gQnJhbmNoXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJMb2FkaW5nIHx8IEhvc3RpbmdEZXRhaWxzPy5Mb2FkaW5nXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJNYWluQnJhbmNoQ2hhbmdlZCgkZXZlbnQpXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBicmFuY2ggb2YgU2VsZWN0ZWRCcmFuY2hlc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYnJhbmNoXCI+XG4gICAgICAgICAgICAgICAge3sgYnJhbmNoIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKGNsaWNrKT1cIlJlZnJlc2hPcmdhbml6YXRpb25zKClcIj4gcmVmcmVzaCA8L21hdC1pY29uPlxuXG4gICAgICAgICAgPGEgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBocmVmPVwiLy5vYXV0aC9naXRodWI/b2F1dGgtZm9yY2UtZWRpdD10cnVlXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY29sb3I9XCJhY2NlbnRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRUb29sdGlwPVwiUmUtYXV0aG9yaXplIE9yZ2FuaXphdGlvbnNcIiBjb2xvcj1cImFjY2VudFwiPiBsYXVuY2ggPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhbiBvcmdhbml6YXRpb24gb3Igd291bGQgbGlrZSB0byBjcmVhdGUgYSBuZXcgb25lLFxuICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9hY2NvdW50L29yZ2FuaXphdGlvbnMvbmV3XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgICAgIHN0YXJ0IGhlcmVcbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAoQnVpbGRQYXRoRm9ybUNvbnRyb2w/LnZhbGlkIHx8XG4gICAgICAgICAgICAgICAgICAoT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIUxvYWRpbmcpKSAmJlxuICAgICAgICAgICAgICAgICFDcmVhdGluZ1JlcG9zaXRvcnkgJiZcbiAgICAgICAgICAgICAgICBVc2VCdWlsZFBhdGhcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIHdpdGgtaGludFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZy1pY29uXCIgbWF0UHJlZml4PmJ1aWxkPC9tYXQtaWNvbj5cblxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiU291cmNlQ29udHJvbFJvb3QgKyAnYnVpbGRQYXRoJ1wiIHBsYWNlaG9sZGVyPVwiQnVpbGQgUGF0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiTG9hZGluZyB8fCBCdWlsZFBhdGhEaXNhYmxlZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiQnVpbGRQYXRoQ2hhbmdlZCgkZXZlbnQpXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidWlsZFBhdGggb2YgQnVpbGRQYXRoT3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiYnVpbGRQYXRoXCI+XG4gICAgICAgICAgICAgICAge3sgYnVpbGRQYXRoIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIFRoZSBidWlsZCBwYXRoIGlkZW50aWZpZXMgd2hpY2ggYnVpbGQgYWN0aW9uIHRvIHVzZSBmb3IgeW91clxuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJMb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcHJlYWRcIj5cbiAgICAgICAgICA8bGN1LWxvYWRlciBzdHlsZT1cIm1hcmdpbjogYXV0b1wiIFtsb2FkaW5nXT1cInRydWVcIj48L2xjdS1sb2FkZXI+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLTNcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1hdC10aXRsZVwiICpuZ0lmPVwiIU9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIG9yZ2FuaXphdGlvbnNcbiAgICAgICAgICAgIDwvaDQ+XG5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1hdC10aXRsZVwiICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgT3JnYW5pemF0aW9uRm9ybUNvbnRyb2w/LnZhbGlkICYmICFSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkXG4gICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHJlcG9zaXRvcmllc1xuICAgICAgICAgICAgPC9oND5cblxuICAgICAgICAgICAgPGg0IGNsYXNzPVwibWF0LXRpdGxlXCIgKm5nSWY9XCJSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkICYmICFCcmFuY2hlc0Zvcm1Db250cm9sPy52YWxpZFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIGJyYW5jaGVzXG4gICAgICAgICAgICA8L2g0PlxuXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJtYXQtdGl0bGVcIiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIChSZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnZhbGlkIHx8IEJyYW5jaGVzRm9ybUNvbnRyb2w/LnZhbGlkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICFCdWlsZFBhdGhGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgYnVpbGQgcGF0aHNcbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDwvZGl2PiAtLT5cblxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICA8bWF0LWNhcmQtYWN0aW9ucyBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuXG4gICAgICA8YnV0dG9uIFxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiIFxuICAgICAgICBmeEZsZXg9XCIxMDAlXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIFxuICAgICAgICBbZGlzYWJsZWRdPVwiIURldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAudmFsaWQgfHwgIURldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZGlydHlcIj5cbiAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgICBTYXZlIFNvdXJjZSBDb250cm9sXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIFxuICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gIDwvbWF0LWNhcmQ+XG48L2Zvcm0+Il19