@geoit/ui 0.0.2 → 0.0.5

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 (258) hide show
  1. package/AGENTS.md +12 -8
  2. package/README.md +140 -17
  3. package/ai/AGENTS.md +43 -32
  4. package/ai/README.md +36 -2
  5. package/ai/catalog.json +5585 -437
  6. package/ai/components/geo-alert.md +75 -21
  7. package/ai/components/geo-back-button.md +64 -18
  8. package/ai/components/geo-breadcrumb.md +71 -12
  9. package/ai/components/geo-button.md +90 -27
  10. package/ai/components/geo-chart.md +103 -0
  11. package/ai/components/geo-checkbox.md +67 -20
  12. package/ai/components/geo-column-picker.md +91 -18
  13. package/ai/components/geo-confirm-modal.md +92 -27
  14. package/ai/components/geo-dashboard.md +91 -0
  15. package/ai/components/geo-date-picker.md +105 -29
  16. package/ai/components/geo-date-range-picker.md +101 -28
  17. package/ai/components/geo-empty-state.md +75 -0
  18. package/ai/components/geo-feedback-form.md +97 -0
  19. package/ai/components/geo-file-picker.md +99 -26
  20. package/ai/components/geo-forgot-password.md +78 -0
  21. package/ai/components/geo-form-modal.md +111 -44
  22. package/ai/components/geo-icon.md +70 -16
  23. package/ai/components/geo-input.md +94 -29
  24. package/ai/components/geo-layout-footer.md +70 -0
  25. package/ai/components/geo-layout-header-actions.md +82 -0
  26. package/ai/components/geo-layout-header.md +89 -0
  27. package/ai/components/geo-layout-sidebar.md +86 -0
  28. package/ai/components/geo-layout.md +155 -0
  29. package/ai/components/geo-list-page.md +72 -0
  30. package/ai/components/geo-login.md +94 -0
  31. package/ai/components/geo-map-admin-filter.md +80 -0
  32. package/ai/components/geo-map-basemap-switcher.md +75 -0
  33. package/ai/components/geo-map-help.md +72 -0
  34. package/ai/components/geo-map-layer-card.md +73 -0
  35. package/ai/components/geo-map-layer-panel.md +75 -0
  36. package/ai/components/geo-map-layers-drawer.md +78 -0
  37. package/ai/components/geo-map-legend.md +74 -0
  38. package/ai/components/geo-map-locate.md +75 -0
  39. package/ai/components/geo-map-location-chip.md +71 -0
  40. package/ai/components/geo-map-measure.md +74 -0
  41. package/ai/components/geo-map-opacity.md +75 -0
  42. package/ai/components/geo-map-parcel-popup.md +79 -0
  43. package/ai/components/geo-map-search.md +83 -0
  44. package/ai/components/geo-map-shell.md +110 -0
  45. package/ai/components/geo-map-snapshot.md +75 -0
  46. package/ai/components/geo-map-swipe.md +73 -0
  47. package/ai/components/geo-map-toolbar.md +76 -0
  48. package/ai/components/geo-map-zoom.md +74 -0
  49. package/ai/components/geo-map.md +205 -0
  50. package/ai/components/geo-overlap-result.md +88 -0
  51. package/ai/components/geo-page-header.md +72 -0
  52. package/ai/components/geo-page-title.md +62 -16
  53. package/ai/components/geo-pagination.md +76 -24
  54. package/ai/components/geo-radio.md +110 -27
  55. package/ai/components/geo-row-actions.md +87 -19
  56. package/ai/components/geo-select.md +108 -28
  57. package/ai/components/geo-slider.md +70 -21
  58. package/ai/components/geo-stat-card.md +98 -0
  59. package/ai/components/geo-status-tag.md +67 -15
  60. package/ai/components/geo-step-form-layout.md +121 -38
  61. package/ai/components/geo-stepper.md +81 -19
  62. package/ai/components/geo-table-filter.md +90 -29
  63. package/ai/components/geo-table-pagination.md +70 -23
  64. package/ai/components/geo-table-toolbar.md +84 -29
  65. package/ai/components/geo-table.md +191 -59
  66. package/ai/components/geo-tabs.md +99 -27
  67. package/ai/components/geo-textarea.md +84 -23
  68. package/ai/components/geo-toast.md +138 -27
  69. package/ai/components/geo-tree.md +94 -22
  70. package/ai/components/geo-typography.md +70 -19
  71. package/ai/components/geo-upload.md +109 -39
  72. package/ai/mockup.html +1194 -0
  73. package/ai/recipes.md +132 -47
  74. package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +19 -36
  75. package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +14 -24
  76. package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +8 -11
  77. package/esm2022/lib/figma/geo-button/geo-button.component.mjs +30 -59
  78. package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +88 -0
  79. package/esm2022/lib/figma/geo-chart/geo-chart.types.mjs +2 -0
  80. package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +11 -22
  81. package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +22 -54
  82. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.component.mjs +49 -0
  83. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.types.mjs +2 -0
  84. package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +48 -78
  85. package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +47 -75
  86. package/esm2022/lib/figma/geo-empty-state/geo-empty-state.component.mjs +25 -0
  87. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.component.mjs +75 -0
  88. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.types.mjs +2 -0
  89. package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +59 -81
  90. package/esm2022/lib/figma/geo-forgot-password/geo-forgot-password.component.mjs +51 -0
  91. package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +45 -112
  92. package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +22 -32
  93. package/esm2022/lib/figma/geo-input/geo-input.component.mjs +41 -70
  94. package/esm2022/lib/figma/geo-layout/footer/geo-layout-footer.component.mjs +18 -0
  95. package/esm2022/lib/figma/geo-layout/geo-layout-actions.directive.mjs +15 -0
  96. package/esm2022/lib/figma/geo-layout/geo-layout.component.mjs +79 -0
  97. package/esm2022/lib/figma/geo-layout/geo-layout.types.mjs +42 -0
  98. package/esm2022/lib/figma/geo-layout/header/geo-layout-header.component.mjs +60 -0
  99. package/esm2022/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.mjs +70 -0
  100. package/esm2022/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.mjs +90 -0
  101. package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +22 -0
  102. package/esm2022/lib/figma/geo-login/geo-login.component.mjs +58 -0
  103. package/esm2022/lib/figma/geo-login/geo-login.types.mjs +2 -0
  104. package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +52 -0
  105. package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +61 -0
  106. package/esm2022/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.mjs +26 -0
  107. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.mjs +24 -0
  108. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.mjs +146 -0
  109. package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +37 -0
  110. package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +30 -0
  111. package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +72 -0
  112. package/esm2022/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.mjs +21 -0
  113. package/esm2022/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.mjs +375 -0
  114. package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +94 -0
  115. package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +136 -0
  116. package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +182 -0
  117. package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +577 -0
  118. package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +93 -0
  119. package/esm2022/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.mjs +129 -0
  120. package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +64 -0
  121. package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +295 -0
  122. package/esm2022/lib/figma/geo-map/geo-map-toolbar.icons.mjs +18 -0
  123. package/esm2022/lib/figma/geo-map/geo-map.component.mjs +144 -0
  124. package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +497 -0
  125. package/esm2022/lib/figma/geo-map/geo-map.controller.mjs +71 -0
  126. package/esm2022/lib/figma/geo-map/geo-map.types.mjs +2 -0
  127. package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +368 -0
  128. package/esm2022/lib/figma/geo-map/services/geo-map-projection.service.mjs +110 -0
  129. package/esm2022/lib/figma/geo-map/services/geo-map.service.mjs +540 -0
  130. package/esm2022/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.mjs +47 -0
  131. package/esm2022/lib/figma/geo-map/utils/geo-map-interactions.util.mjs +30 -0
  132. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.component.mjs +25 -0
  133. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.types.mjs +2 -0
  134. package/esm2022/lib/figma/geo-page-header/geo-page-header.component.mjs +23 -0
  135. package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +20 -35
  136. package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +13 -43
  137. package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +32 -52
  138. package/esm2022/lib/figma/geo-select/geo-select.component.mjs +46 -72
  139. package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +12 -28
  140. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.component.mjs +163 -0
  141. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.types.mjs +2 -0
  142. package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +23 -27
  143. package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +39 -96
  144. package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +18 -33
  145. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +14 -24
  146. package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +18 -36
  147. package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +41 -98
  148. package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +40 -73
  149. package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +26 -56
  150. package/esm2022/lib/figma/geo-table/geo-table.component.mjs +110 -210
  151. package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +33 -63
  152. package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +28 -44
  153. package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +18 -39
  154. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +12 -40
  155. package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +49 -64
  156. package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +50 -101
  157. package/esm2022/lib/figma/index.mjs +50 -1
  158. package/esm2022/lib/styles/tokens.mjs +56 -24
  159. package/fesm2022/geoit-ui.mjs +5981 -1825
  160. package/fesm2022/geoit-ui.mjs.map +1 -1
  161. package/lib/figma/geo-alert/geo-alert.component.d.ts +10 -11
  162. package/lib/figma/geo-back-button/geo-back-button.component.d.ts +6 -7
  163. package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +2 -2
  164. package/lib/figma/geo-button/geo-button.component.d.ts +21 -17
  165. package/lib/figma/geo-chart/geo-chart.component.d.ts +40 -0
  166. package/lib/figma/geo-chart/geo-chart.types.d.ts +13 -0
  167. package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +6 -7
  168. package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +15 -17
  169. package/lib/figma/geo-dashboard/geo-dashboard.component.d.ts +29 -0
  170. package/lib/figma/geo-dashboard/geo-dashboard.types.d.ts +7 -0
  171. package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +26 -21
  172. package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +25 -20
  173. package/lib/figma/geo-empty-state/geo-empty-state.component.d.ts +17 -0
  174. package/lib/figma/geo-feedback-form/geo-feedback-form.component.d.ts +36 -0
  175. package/lib/figma/geo-feedback-form/geo-feedback-form.types.d.ts +8 -0
  176. package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +23 -20
  177. package/lib/figma/geo-forgot-password/geo-forgot-password.component.d.ts +24 -0
  178. package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +33 -35
  179. package/lib/figma/geo-icon/geo-icon.component.d.ts +7 -7
  180. package/lib/figma/geo-input/geo-input.component.d.ts +23 -21
  181. package/lib/figma/geo-layout/footer/geo-layout-footer.component.d.ts +10 -0
  182. package/lib/figma/geo-layout/geo-layout-actions.directive.d.ts +6 -0
  183. package/lib/figma/geo-layout/geo-layout.component.d.ts +48 -0
  184. package/lib/figma/geo-layout/geo-layout.types.d.ts +44 -0
  185. package/lib/figma/geo-layout/header/geo-layout-header.component.d.ts +31 -0
  186. package/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.d.ts +32 -0
  187. package/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.d.ts +34 -0
  188. package/lib/figma/geo-list-page/geo-list-page.component.d.ts +16 -0
  189. package/lib/figma/geo-login/geo-login.component.d.ts +27 -0
  190. package/lib/figma/geo-login/geo-login.types.d.ts +6 -0
  191. package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +28 -0
  192. package/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.d.ts +26 -0
  193. package/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.d.ts +20 -0
  194. package/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.d.ts +15 -0
  195. package/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.d.ts +40 -0
  196. package/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.d.ts +25 -0
  197. package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +18 -0
  198. package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.d.ts +24 -0
  199. package/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.d.ts +14 -0
  200. package/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.d.ts +49 -0
  201. package/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.d.ts +30 -0
  202. package/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.d.ts +44 -0
  203. package/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.d.ts +56 -0
  204. package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +103 -0
  205. package/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.d.ts +21 -0
  206. package/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.d.ts +33 -0
  207. package/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.d.ts +30 -0
  208. package/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.d.ts +67 -0
  209. package/lib/figma/geo-map/geo-map-toolbar.icons.d.ts +17 -0
  210. package/lib/figma/geo-map/geo-map.component.d.ts +53 -0
  211. package/lib/figma/geo-map/geo-map.constants.d.ts +73 -0
  212. package/lib/figma/geo-map/geo-map.controller.d.ts +49 -0
  213. package/lib/figma/geo-map/geo-map.types.d.ts +224 -0
  214. package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +42 -0
  215. package/lib/figma/geo-map/services/geo-map-projection.service.d.ts +32 -0
  216. package/lib/figma/geo-map/services/geo-map.service.d.ts +99 -0
  217. package/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.d.ts +13 -0
  218. package/lib/figma/geo-map/utils/geo-map-interactions.util.d.ts +9 -0
  219. package/lib/figma/geo-overlap-result/geo-overlap-result.component.d.ts +18 -0
  220. package/lib/figma/geo-overlap-result/geo-overlap-result.types.d.ts +7 -0
  221. package/lib/figma/geo-page-header/geo-page-header.component.d.ts +16 -0
  222. package/lib/figma/geo-page-title/geo-page-title.component.d.ts +9 -9
  223. package/lib/figma/geo-pagination/geo-pagination.component.d.ts +9 -14
  224. package/lib/figma/geo-radio/geo-radio.component.d.ts +17 -15
  225. package/lib/figma/geo-select/geo-select.component.d.ts +24 -19
  226. package/lib/figma/geo-slider/geo-slider.component.d.ts +7 -9
  227. package/lib/figma/geo-stat-card/geo-stat-card.component.d.ts +50 -0
  228. package/lib/figma/geo-stat-card/geo-stat-card.types.d.ts +11 -0
  229. package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +7 -7
  230. package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +27 -29
  231. package/lib/figma/geo-stepper/geo-stepper.component.d.ts +6 -8
  232. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +6 -7
  233. package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +11 -12
  234. package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +21 -28
  235. package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +17 -20
  236. package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +17 -18
  237. package/lib/figma/geo-table/geo-table.component.d.ts +58 -62
  238. package/lib/figma/geo-tabs/geo-tabs.component.d.ts +14 -17
  239. package/lib/figma/geo-textarea/geo-textarea.component.d.ts +15 -13
  240. package/lib/figma/geo-toast/geo-toast.component.d.ts +11 -12
  241. package/lib/figma/geo-tree/geo-tree.component.d.ts +8 -13
  242. package/lib/figma/geo-typography/geo-typography.component.d.ts +13 -13
  243. package/lib/figma/geo-upload/geo-upload.component.d.ts +26 -28
  244. package/lib/figma/index.d.ts +49 -0
  245. package/lib/styles/tokens.d.ts +56 -23
  246. package/package.json +4 -2
  247. package/src/lib/figma/geo-map/assets/toolbar/fullscreen.svg +8 -0
  248. package/src/lib/figma/geo-map/assets/toolbar/home.svg +3 -0
  249. package/src/lib/figma/geo-map/assets/toolbar/layers.svg +3 -0
  250. package/src/lib/figma/geo-map/assets/toolbar/measure-area.svg +12 -0
  251. package/src/lib/figma/geo-map/assets/toolbar/measure-distance.svg +5 -0
  252. package/src/lib/figma/geo-map/assets/toolbar/pan.svg +13 -0
  253. package/src/lib/figma/geo-map/assets/toolbar/search.svg +3 -0
  254. package/src/lib/figma/geo-map/assets/toolbar/zoom-in.svg +3 -0
  255. package/src/lib/figma/geo-map/assets/toolbar/zoom-out.svg +5 -0
  256. package/src/lib/styles/design-tokens.scss +108 -35
  257. package/src/lib/styles/scrollbar.scss +2 -2
  258. package/src/lib/styles/theme.scss +1 -1
@@ -0,0 +1,577 @@
1
+ import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_DEFAULT_ZOOM, GEO_MAP_DEMO_ADMIN_NODES, GEO_MAP_DEMO_LEGEND_ITEMS, GEO_MAP_DEMO_PARCEL_DETAIL, GEO_MAP_DEMO_THEMATIC_LAYERS, GEO_MAP_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, } from '../../geo-map.constants';
3
+ import { GeoMapAdminFilterComponent } from '../geo-map-admin-filter/geo-map-admin-filter.component';
4
+ import { GeoMapBasemapSwitcherComponent } from '../geo-map-basemap-switcher/geo-map-basemap-switcher.component';
5
+ import { GeoMapHelpComponent } from '../geo-map-help/geo-map-help.component';
6
+ import { GeoMapLayersDrawerComponent } from '../geo-map-layers-drawer/geo-map-layers-drawer.component';
7
+ import { GeoMapLegendComponent } from '../geo-map-legend/geo-map-legend.component';
8
+ import { GeoMapLocationChipComponent } from '../geo-map-location-chip/geo-map-location-chip.component';
9
+ import { GeoMapMeasureComponent } from '../geo-map-measure/geo-map-measure.component';
10
+ import { GeoMapParcelPopupComponent } from '../geo-map-parcel-popup/geo-map-parcel-popup.component';
11
+ import { GeoMapSearchComponent } from '../geo-map-search/geo-map-search.component';
12
+ import { GeoMapSnapshotComponent } from '../geo-map-snapshot/geo-map-snapshot.component';
13
+ import { GeoMapSwipeComponent } from '../geo-map-swipe/geo-map-swipe.component';
14
+ import { GeoMapToolbarComponent } from '../geo-map-toolbar/geo-map-toolbar.component';
15
+ import { GeoMapZoomComponent } from '../geo-map-zoom/geo-map-zoom.component';
16
+ import { GeoMapComponent } from '../../geo-map.component';
17
+ import * as i0 from "@angular/core";
18
+ /**
19
+ * Map viewport + portal chrome (toolbar, layers drawer, legend, help, swipe, …).
20
+ *
21
+ * @summary Composed map shell with chrome tools for Storybook / portal.
22
+ * @whenToUse Public map page chrome (cổng công khai).
23
+ * @doNotUseWhen Need only the raw OL host — use geo-map.
24
+ */
25
+ export class GeoMapShellComponent {
26
+ destroyRef = inject(DestroyRef);
27
+ snapshotRef = viewChild(GeoMapSnapshotComponent);
28
+ zoomRef = viewChild(GeoMapZoomComponent);
29
+ center = input([...GEO_MAP_DEFAULT_CENTER]);
30
+ zoom = input(GEO_MAP_DEFAULT_ZOOM);
31
+ height = input('560px');
32
+ showMousePosition = input(false);
33
+ basemapOptions = input(GEO_MAP_DEFAULT_BASEMAP_OPTIONS);
34
+ toolbarActions = input(GEO_MAP_DEFAULT_TOOLBAR_ACTIONS);
35
+ /** Extra overlays merged after demo thematic + traffic. */
36
+ layers = input([]);
37
+ legendItems = input(GEO_MAP_DEMO_LEGEND_ITEMS);
38
+ showNav = input(true);
39
+ includeDemoLayers = input(true);
40
+ adminNodes = input(GEO_MAP_DEMO_ADMIN_NODES);
41
+ locationLabel = input('Phường 1 — TP Đà Lạt, Lâm Đồng');
42
+ parcelAudience = input('citizen');
43
+ provinceExtent = input(GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326);
44
+ /** When true, shell seeds mock search results (Storybook / demos). */
45
+ demoSearch = input(true);
46
+ /**
47
+ * `location` — Home opens ĐVHC filter (default).
48
+ * `emit` — Home only emits `actionClick` (e.g. portal navigates to login/dashboard).
49
+ */
50
+ homeMode = input('location');
51
+ basemapId = model('osm');
52
+ measureMode = model('none');
53
+ checkedMap = model({ traffic: false });
54
+ layersOpen = model(false);
55
+ legendOpen = model(false);
56
+ helpOpen = model(false);
57
+ swipeActive = model(false);
58
+ searchOpen = model(false);
59
+ adminFilterOpen = model(false);
60
+ parcelOpen = model(false);
61
+ managedLayers = model([]);
62
+ searchResults = model([]);
63
+ selectedParcel = model(null);
64
+ adminCheckedKeys = model([]);
65
+ adminExpandedKeys = model(['lam-dong']);
66
+ mapReady = output();
67
+ mapClick = output();
68
+ locateDenied = output();
69
+ actionClick = output();
70
+ search = output();
71
+ searchReset = output();
72
+ resultSelect = output();
73
+ parcelExport = output();
74
+ adminApply = output();
75
+ controller = signal(null);
76
+ /** Active map pointer tool (`none` = default arrow cursor). */
77
+ toolMode = signal('none');
78
+ /** When true, parcel Back returns to search popover. */
79
+ parcelFromSearch = signal(false);
80
+ panCursorBound = false;
81
+ onPanPointerDown = () => {
82
+ if (this.toolMode() === 'pan') {
83
+ this.setMapCursor('grabbing');
84
+ }
85
+ };
86
+ onPanPointerUp = () => {
87
+ if (this.toolMode() === 'pan') {
88
+ this.setMapCursor('grab');
89
+ }
90
+ };
91
+ constructor() {
92
+ // Enforce a single left chrome popover (search / ĐVHC / parcel / layers / legend).
93
+ effect(() => {
94
+ const search = this.searchOpen();
95
+ const admin = this.adminFilterOpen();
96
+ const parcel = this.parcelOpen();
97
+ const layers = this.layersOpen();
98
+ const legend = this.legendOpen();
99
+ const openCount = Number(search) +
100
+ Number(admin) +
101
+ Number(parcel) +
102
+ Number(layers) +
103
+ Number(legend);
104
+ if (openCount <= 1) {
105
+ return;
106
+ }
107
+ untracked(() => {
108
+ if (parcel) {
109
+ this.closePanelsExcept('parcel');
110
+ }
111
+ else if (layers) {
112
+ this.closePanelsExcept('layers');
113
+ }
114
+ else if (legend) {
115
+ this.closePanelsExcept('legend');
116
+ }
117
+ else if (search) {
118
+ this.closePanelsExcept('search');
119
+ }
120
+ else {
121
+ this.closePanelsExcept('admin');
122
+ }
123
+ });
124
+ }, { allowSignalWrites: true });
125
+ // When measure finishes / cancels, return to idle + default cursor.
126
+ effect(() => {
127
+ const mode = this.measureMode();
128
+ if (mode !== 'none') {
129
+ untracked(() => {
130
+ this.toolMode.set(mode);
131
+ });
132
+ return;
133
+ }
134
+ untracked(() => {
135
+ const tool = this.toolMode();
136
+ if (tool === 'distance' || tool === 'area') {
137
+ this.toolMode.set('none');
138
+ this.setMapCursor(null);
139
+ }
140
+ });
141
+ }, { allowSignalWrites: true });
142
+ this.destroyRef.onDestroy(() => this.unbindPanCursor());
143
+ }
144
+ basemap = computed(() => {
145
+ const id = this.basemapId();
146
+ const option = this.basemapOptions().find((item) => item.id === id);
147
+ return option?.basemap ?? 'osm';
148
+ });
149
+ resolvedToolbarActions = computed(() => {
150
+ const mode = this.measureMode();
151
+ const tool = this.toolMode();
152
+ const swipe = this.swipeActive();
153
+ const layersOpen = this.layersOpen();
154
+ const legendOpen = this.legendOpen();
155
+ const searchOpen = this.searchOpen();
156
+ const adminOpen = this.adminFilterOpen();
157
+ const fullscreen = this.zoomRef()?.isFullscreen() ?? false;
158
+ return this.toolbarActions().map((action) => {
159
+ if (action.id === 'home' && this.homeMode() === 'emit') {
160
+ return {
161
+ ...action,
162
+ label: 'Trang chủ',
163
+ tooltip: 'Về trang chủ / đăng nhập',
164
+ };
165
+ }
166
+ if (action.id === 'pan') {
167
+ return { ...action, active: tool === 'pan' && mode === 'none' };
168
+ }
169
+ if (action.id === 'measure-distance') {
170
+ return { ...action, active: mode === 'distance' };
171
+ }
172
+ if (action.id === 'measure-area') {
173
+ return { ...action, active: mode === 'area' };
174
+ }
175
+ if (action.id === 'swipe') {
176
+ return { ...action, active: swipe };
177
+ }
178
+ if (action.id === 'layers') {
179
+ return { ...action, active: layersOpen };
180
+ }
181
+ if (action.id === 'legend') {
182
+ return { ...action, active: legendOpen };
183
+ }
184
+ if (action.id === 'search') {
185
+ return { ...action, active: searchOpen };
186
+ }
187
+ if (action.id === 'admin-filter') {
188
+ return { ...action, active: adminOpen };
189
+ }
190
+ if (action.id === 'fullscreen') {
191
+ return {
192
+ ...action,
193
+ active: fullscreen,
194
+ icon: fullscreen ? 'fullscreen-exit' : 'fullscreen',
195
+ iconSrc: fullscreen ? undefined : action.iconSrc,
196
+ tooltip: fullscreen ? 'Thoát toàn màn hình' : 'Xem toàn bản đồ',
197
+ };
198
+ }
199
+ return action;
200
+ });
201
+ });
202
+ resolvedLayers = computed(() => {
203
+ const trafficOn = !!this.checkedMap()['traffic'];
204
+ const traffic = {
205
+ ...GEO_MAP_TRAFFIC_OVERLAY,
206
+ visible: trafficOn,
207
+ };
208
+ const managed = this.managedLayers();
209
+ if (managed.length) {
210
+ return [...managed, traffic];
211
+ }
212
+ const demo = this.includeDemoLayers() ? GEO_MAP_DEMO_THEMATIC_LAYERS : [];
213
+ return [...demo, traffic, ...this.layers()];
214
+ });
215
+ onMapReady(ctrl) {
216
+ this.controller.set(ctrl);
217
+ if (!this.managedLayers().length) {
218
+ const seed = this.includeDemoLayers()
219
+ ? GEO_MAP_DEMO_THEMATIC_LAYERS.map((layer) => ({ ...layer }))
220
+ : this.layers().map((layer) => ({ ...layer }));
221
+ this.managedLayers.set(seed);
222
+ }
223
+ this.bindPanCursor(ctrl);
224
+ if (this.toolMode() === 'pan') {
225
+ this.applyPanCursor();
226
+ }
227
+ this.mapReady.emit(ctrl);
228
+ }
229
+ onMapClick(event) {
230
+ this.parcelFromSearch.set(false);
231
+ this.mapClick.emit(event);
232
+ }
233
+ onBasemapChange(basemap) {
234
+ this.controller()?.setBasemap(basemap);
235
+ }
236
+ onToolbarAction(action) {
237
+ this.actionClick.emit(action);
238
+ switch (action.id) {
239
+ case 'home':
240
+ if (this.homeMode() === 'location') {
241
+ if (this.adminFilterOpen()) {
242
+ this.adminFilterOpen.set(false);
243
+ this.zoomRef()?.fitProvince();
244
+ }
245
+ else {
246
+ this.openPanel('admin');
247
+ }
248
+ }
249
+ break;
250
+ case 'admin-filter':
251
+ if (this.adminFilterOpen()) {
252
+ this.adminFilterOpen.set(false);
253
+ this.zoomRef()?.fitProvince();
254
+ }
255
+ else {
256
+ this.openPanel('admin');
257
+ }
258
+ break;
259
+ case 'fit-province':
260
+ this.zoomRef()?.fitProvince();
261
+ break;
262
+ case 'pan':
263
+ if (this.toolMode() === 'pan') {
264
+ this.exitToolMode();
265
+ }
266
+ else {
267
+ this.enterPanMode();
268
+ }
269
+ break;
270
+ case 'zoom-in':
271
+ this.zoomRef()?.zoomIn();
272
+ break;
273
+ case 'zoom-out':
274
+ this.zoomRef()?.zoomOut();
275
+ break;
276
+ case 'fullscreen':
277
+ this.zoomRef()?.toggleFullscreen();
278
+ break;
279
+ case 'search':
280
+ if (this.searchOpen()) {
281
+ this.searchOpen.set(false);
282
+ }
283
+ else {
284
+ this.openPanel('search');
285
+ }
286
+ break;
287
+ case 'layers':
288
+ if (this.layersOpen()) {
289
+ this.layersOpen.set(false);
290
+ }
291
+ else {
292
+ this.openPanel('layers');
293
+ }
294
+ break;
295
+ case 'legend':
296
+ if (this.legendOpen()) {
297
+ this.legendOpen.set(false);
298
+ }
299
+ else {
300
+ this.openPanel('legend');
301
+ }
302
+ break;
303
+ case 'help':
304
+ this.helpOpen.set(true);
305
+ break;
306
+ case 'swipe':
307
+ this.measureMode.set('none');
308
+ this.toolMode.set('none');
309
+ this.zoomRef()?.resetInteractionMode();
310
+ this.setMapCursor(null);
311
+ this.swipeActive.update((v) => !v);
312
+ if (this.swipeActive()) {
313
+ this.ensureSwipeOverlayVisible();
314
+ }
315
+ break;
316
+ case 'measure-distance':
317
+ this.swipeActive.set(false);
318
+ this.zoomRef()?.resetInteractionMode();
319
+ if (this.measureMode() === 'distance') {
320
+ this.exitToolMode();
321
+ }
322
+ else {
323
+ this.toolMode.set('distance');
324
+ this.measureMode.set('distance');
325
+ }
326
+ break;
327
+ case 'measure-area':
328
+ this.swipeActive.set(false);
329
+ this.zoomRef()?.resetInteractionMode();
330
+ if (this.measureMode() === 'area') {
331
+ this.exitToolMode();
332
+ }
333
+ else {
334
+ this.toolMode.set('area');
335
+ this.measureMode.set('area');
336
+ }
337
+ break;
338
+ case 'snapshot':
339
+ this.snapshotRef()?.capture();
340
+ break;
341
+ default:
342
+ break;
343
+ }
344
+ }
345
+ onToolbarToggle(event) {
346
+ if (event.action.id === 'traffic') {
347
+ this.controller()?.setLayerVisibility(GEO_MAP_TRAFFIC_LAYER_ID, event.checked);
348
+ }
349
+ }
350
+ onSearch(query) {
351
+ this.search.emit(query);
352
+ if (!this.demoSearch()) {
353
+ return;
354
+ }
355
+ const demo = this.buildDemoSearchResults(query);
356
+ this.searchResults.set(demo);
357
+ const geojsonCollection = {
358
+ type: 'FeatureCollection',
359
+ features: demo
360
+ .map((item) => item.geojson)
361
+ .filter((item) => !!item),
362
+ };
363
+ if (geojsonCollection.features.length) {
364
+ this.controller()?.setHighlightFromGeoJson(geojsonCollection);
365
+ }
366
+ }
367
+ onSearchReset() {
368
+ this.searchResults.set([]);
369
+ this.selectedParcel.set(null);
370
+ this.parcelOpen.set(false);
371
+ this.controller()?.clearHighlight();
372
+ this.searchReset.emit();
373
+ }
374
+ onParcelClosed() {
375
+ this.parcelFromSearch.set(false);
376
+ this.selectedParcel.set(null);
377
+ this.controller()?.clearHighlight();
378
+ }
379
+ onParcelBack() {
380
+ const fromSearch = this.parcelFromSearch();
381
+ this.parcelOpen.set(false);
382
+ if (fromSearch) {
383
+ this.parcelFromSearch.set(false);
384
+ this.openPanel('search');
385
+ return;
386
+ }
387
+ this.selectedParcel.set(null);
388
+ this.controller()?.clearHighlight();
389
+ }
390
+ onResultSelect(item) {
391
+ this.resultSelect.emit(item);
392
+ if (item.geojson) {
393
+ this.controller()?.setHighlightFromGeoJson(item.geojson);
394
+ }
395
+ else if (item.extent4326) {
396
+ this.controller()?.fitLonLatExtent(item.extent4326);
397
+ }
398
+ if (item.parcel) {
399
+ this.parcelFromSearch.set(true);
400
+ this.selectedParcel.set(item.parcel);
401
+ this.openPanel('parcel');
402
+ }
403
+ }
404
+ onAdminApply(keys) {
405
+ this.adminApply.emit(keys);
406
+ // Demo: fit a sample ward bbox when a leaf is selected.
407
+ if (this.demoSearch() && keys.some((key) => String(key).startsWith('xa-'))) {
408
+ this.controller()?.fitLonLatExtent([108.42, 11.92, 108.5, 11.98], {
409
+ maxZoom: 14,
410
+ });
411
+ }
412
+ }
413
+ onFitProvince() {
414
+ this.controller()?.fitProvince(this.provinceExtent());
415
+ }
416
+ onAdminClosed() {
417
+ this.zoomRef()?.fitProvince();
418
+ }
419
+ /** Open one left chrome popover; close the others to avoid stacked scroll. */
420
+ openPanel(panel) {
421
+ this.closePanelsExcept(panel);
422
+ if (panel === 'search') {
423
+ this.searchOpen.set(true);
424
+ }
425
+ else if (panel === 'admin') {
426
+ this.adminFilterOpen.set(true);
427
+ }
428
+ else if (panel === 'parcel') {
429
+ this.parcelOpen.set(true);
430
+ }
431
+ else if (panel === 'layers') {
432
+ this.layersOpen.set(true);
433
+ }
434
+ else {
435
+ this.legendOpen.set(true);
436
+ }
437
+ }
438
+ closePanelsExcept(keep) {
439
+ if (keep !== 'search' && this.searchOpen()) {
440
+ this.searchOpen.set(false);
441
+ }
442
+ if (keep !== 'admin' && this.adminFilterOpen()) {
443
+ this.adminFilterOpen.set(false);
444
+ }
445
+ if (keep !== 'parcel' && this.parcelOpen()) {
446
+ this.parcelOpen.set(false);
447
+ }
448
+ if (keep !== 'layers' && this.layersOpen()) {
449
+ this.layersOpen.set(false);
450
+ }
451
+ if (keep !== 'legend' && this.legendOpen()) {
452
+ this.legendOpen.set(false);
453
+ }
454
+ }
455
+ enterPanMode() {
456
+ this.toolMode.set('pan');
457
+ this.measureMode.set('none');
458
+ this.swipeActive.set(false);
459
+ this.zoomRef()?.resetInteractionMode();
460
+ this.applyPanCursor();
461
+ }
462
+ exitToolMode() {
463
+ this.toolMode.set('none');
464
+ this.measureMode.set('none');
465
+ this.swipeActive.set(false);
466
+ this.zoomRef()?.resetInteractionMode();
467
+ this.setMapCursor(null);
468
+ }
469
+ applyPanCursor() {
470
+ if (this.toolMode() !== 'pan') {
471
+ return;
472
+ }
473
+ this.setMapCursor('grab');
474
+ }
475
+ setMapCursor(cursor) {
476
+ const el = this.controller()?.getMap()?.getTargetElement();
477
+ if (!el) {
478
+ return;
479
+ }
480
+ el.style.cursor = cursor ?? '';
481
+ }
482
+ bindPanCursor(ctrl) {
483
+ const el = ctrl.getMap()?.getTargetElement();
484
+ if (!el || this.panCursorBound) {
485
+ return;
486
+ }
487
+ el.addEventListener('pointerdown', this.onPanPointerDown);
488
+ el.addEventListener('pointerup', this.onPanPointerUp);
489
+ el.addEventListener('pointerleave', this.onPanPointerUp);
490
+ el.addEventListener('pointercancel', this.onPanPointerUp);
491
+ this.panCursorBound = true;
492
+ }
493
+ unbindPanCursor() {
494
+ const el = this.controller()?.getMap()?.getTargetElement();
495
+ if (!el || !this.panCursorBound) {
496
+ return;
497
+ }
498
+ el.removeEventListener('pointerdown', this.onPanPointerDown);
499
+ el.removeEventListener('pointerup', this.onPanPointerUp);
500
+ el.removeEventListener('pointerleave', this.onPanPointerUp);
501
+ el.removeEventListener('pointercancel', this.onPanPointerUp);
502
+ this.panCursorBound = false;
503
+ }
504
+ buildDemoSearchResults(query) {
505
+ const parcelLayer = GEO_MAP_DEMO_THEMATIC_LAYERS.find((layer) => layer.id === 'demo-parcel' && layer.type === 'geojson');
506
+ const feature = parcelLayer && parcelLayer.type === 'geojson'
507
+ ? parcelLayer.data.features?.[0]
508
+ : undefined;
509
+ const keyword = Object.values(query.values)
510
+ .filter(Boolean)
511
+ .join(' ')
512
+ .trim();
513
+ const label = keyword || 'Thửa 12 — Tờ 45';
514
+ return [
515
+ {
516
+ id: 'demo-parcel-12',
517
+ title: `Thửa 12 / Tờ 45`,
518
+ subtitle: label,
519
+ extent4326: [108.45, 11.94, 108.465, 11.952],
520
+ geojson: feature ?? {
521
+ type: 'Feature',
522
+ properties: { parcel: '12', sheet: '45' },
523
+ geometry: {
524
+ type: 'Polygon',
525
+ coordinates: [
526
+ [
527
+ [108.45, 11.94],
528
+ [108.465, 11.94],
529
+ [108.465, 11.952],
530
+ [108.45, 11.952],
531
+ [108.45, 11.94],
532
+ ],
533
+ ],
534
+ },
535
+ },
536
+ parcel: { ...GEO_MAP_DEMO_PARCEL_DETAIL },
537
+ },
538
+ ];
539
+ }
540
+ ensureSwipeOverlayVisible() {
541
+ const list = this.managedLayers();
542
+ if (!list.length) {
543
+ return;
544
+ }
545
+ const anyVisible = list.some((layer) => layer.visible !== false);
546
+ if (anyVisible) {
547
+ return;
548
+ }
549
+ const next = list.map((layer, index) => index === 0 ? { ...layer, visible: true } : layer);
550
+ this.managedLayers.set(next);
551
+ }
552
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
553
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapShellComponent, isStandalone: true, selector: "geo-map-shell", inputs: { center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showMousePosition: { classPropertyName: "showMousePosition", publicName: "showMousePosition", isSignal: true, isRequired: false, transformFunction: null }, basemapOptions: { classPropertyName: "basemapOptions", publicName: "basemapOptions", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, includeDemoLayers: { classPropertyName: "includeDemoLayers", publicName: "includeDemoLayers", isSignal: true, isRequired: false, transformFunction: null }, adminNodes: { classPropertyName: "adminNodes", publicName: "adminNodes", isSignal: true, isRequired: false, transformFunction: null }, locationLabel: { classPropertyName: "locationLabel", publicName: "locationLabel", isSignal: true, isRequired: false, transformFunction: null }, parcelAudience: { classPropertyName: "parcelAudience", publicName: "parcelAudience", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, demoSearch: { classPropertyName: "demoSearch", publicName: "demoSearch", isSignal: true, isRequired: false, transformFunction: null }, homeMode: { classPropertyName: "homeMode", publicName: "homeMode", isSignal: true, isRequired: false, transformFunction: null }, basemapId: { classPropertyName: "basemapId", publicName: "basemapId", isSignal: true, isRequired: false, transformFunction: null }, measureMode: { classPropertyName: "measureMode", publicName: "measureMode", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null }, layersOpen: { classPropertyName: "layersOpen", publicName: "layersOpen", isSignal: true, isRequired: false, transformFunction: null }, legendOpen: { classPropertyName: "legendOpen", publicName: "legendOpen", isSignal: true, isRequired: false, transformFunction: null }, helpOpen: { classPropertyName: "helpOpen", publicName: "helpOpen", isSignal: true, isRequired: false, transformFunction: null }, swipeActive: { classPropertyName: "swipeActive", publicName: "swipeActive", isSignal: true, isRequired: false, transformFunction: null }, searchOpen: { classPropertyName: "searchOpen", publicName: "searchOpen", isSignal: true, isRequired: false, transformFunction: null }, adminFilterOpen: { classPropertyName: "adminFilterOpen", publicName: "adminFilterOpen", isSignal: true, isRequired: false, transformFunction: null }, parcelOpen: { classPropertyName: "parcelOpen", publicName: "parcelOpen", isSignal: true, isRequired: false, transformFunction: null }, managedLayers: { classPropertyName: "managedLayers", publicName: "managedLayers", isSignal: true, isRequired: false, transformFunction: null }, searchResults: { classPropertyName: "searchResults", publicName: "searchResults", isSignal: true, isRequired: false, transformFunction: null }, selectedParcel: { classPropertyName: "selectedParcel", publicName: "selectedParcel", isSignal: true, isRequired: false, transformFunction: null }, adminCheckedKeys: { classPropertyName: "adminCheckedKeys", publicName: "adminCheckedKeys", isSignal: true, isRequired: false, transformFunction: null }, adminExpandedKeys: { classPropertyName: "adminExpandedKeys", publicName: "adminExpandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { basemapId: "basemapIdChange", measureMode: "measureModeChange", checkedMap: "checkedMapChange", layersOpen: "layersOpenChange", legendOpen: "legendOpenChange", helpOpen: "helpOpenChange", swipeActive: "swipeActiveChange", searchOpen: "searchOpenChange", adminFilterOpen: "adminFilterOpenChange", parcelOpen: "parcelOpenChange", managedLayers: "managedLayersChange", searchResults: "searchResultsChange", selectedParcel: "selectedParcelChange", adminCheckedKeys: "adminCheckedKeysChange", adminExpandedKeys: "adminExpandedKeysChange", mapReady: "mapReady", mapClick: "mapClick", locateDenied: "locateDenied", actionClick: "actionClick", search: "search", searchReset: "searchReset", resultSelect: "resultSelect", parcelExport: "parcelExport", adminApply: "adminApply" }, host: { properties: { "style.height": "height()" }, classAttribute: "geo-map-shell-host" }, viewQueries: [{ propertyName: "snapshotRef", first: true, predicate: GeoMapSnapshotComponent, descendants: true, isSignal: true }, { propertyName: "zoomRef", first: true, predicate: GeoMapZoomComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"], dependencies: [{ kind: "component", type: GeoMapComponent, selector: "geo-map", inputs: ["center", "zoom", "minZoom", "maxZoom", "viewProjection", "basemap", "layers", "height", "registerProjections", "projections", "showMousePosition", "mousePositionProjection", "showZoomControl"], outputs: ["mapReady", "mapClick", "viewChange", "initError"] }, { kind: "component", type: GeoMapToolbarComponent, selector: "geo-map-toolbar", inputs: ["controller", "actions", "compact", "checkedMap"], outputs: ["checkedMapChange", "actionClick", "actionToggle"] }, { kind: "component", type: GeoMapZoomComponent, selector: "geo-map-zoom", inputs: ["controller", "showNav", "showFitProvince", "provinceExtent", "fullscreenTarget"] }, { kind: "component", type: GeoMapSnapshotComponent, selector: "geo-map-snapshot", inputs: ["controller", "label", "filename"], outputs: ["captured", "captureError"] }, { kind: "component", type: GeoMapMeasureComponent, selector: "geo-map-measure", inputs: ["controller", "mode", "showResult"], outputs: ["modeChange", "measureChange"] }, { kind: "component", type: GeoMapLayersDrawerComponent, selector: "geo-map-layers-drawer", inputs: ["controller", "open", "title", "legendItems", "showOpacity", "showLegend", "layers"], outputs: ["openChange", "layersChange", "closed"] }, { kind: "component", type: GeoMapLegendComponent, selector: "geo-map-legend", inputs: ["title", "items", "open"], outputs: ["openChange", "closed"] }, { kind: "component", type: GeoMapHelpComponent, selector: "geo-map-help", inputs: ["open", "title", "sections"], outputs: ["openChange"] }, { kind: "component", type: GeoMapSwipeComponent, selector: "geo-map-swipe", inputs: ["controller", "active", "position", "layerId"], outputs: ["activeChange", "positionChange"] }, { kind: "component", type: GeoMapSearchComponent, selector: "geo-map-search", inputs: ["open", "title", "mode", "results", "loading", "pageIndex", "pageSize", "total", "emptyText"], outputs: ["openChange", "modeChange", "pageIndexChange", "pageSizeChange", "search", "reset", "resultSelect", "closed"] }, { kind: "component", type: GeoMapAdminFilterComponent, selector: "geo-map-admin-filter", inputs: ["open", "title", "nodes", "checkedKeys", "expandedKeys"], outputs: ["openChange", "checkedKeysChange", "expandedKeysChange", "apply", "reset", "fitProvince", "closed", "selectionChange"] }, { kind: "component", type: GeoMapParcelPopupComponent, selector: "geo-map-parcel-popup", inputs: ["open", "title", "parcel", "audience", "showExport"], outputs: ["openChange", "closed", "back", "exportClick", "diagramClick"] }, { kind: "component", type: GeoMapLocationChipComponent, selector: "geo-map-location-chip", inputs: ["label", "icon"] }, { kind: "component", type: GeoMapBasemapSwitcherComponent, selector: "geo-map-basemap-switcher", inputs: ["options", "selectedId", "label", "tooltip"], outputs: ["selectedIdChange", "basemapChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
554
+ }
555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, decorators: [{
556
+ type: Component,
557
+ args: [{ selector: 'geo-map-shell', standalone: true, imports: [
558
+ GeoMapComponent,
559
+ GeoMapToolbarComponent,
560
+ GeoMapZoomComponent,
561
+ GeoMapSnapshotComponent,
562
+ GeoMapMeasureComponent,
563
+ GeoMapLayersDrawerComponent,
564
+ GeoMapLegendComponent,
565
+ GeoMapHelpComponent,
566
+ GeoMapSwipeComponent,
567
+ GeoMapSearchComponent,
568
+ GeoMapAdminFilterComponent,
569
+ GeoMapParcelPopupComponent,
570
+ GeoMapLocationChipComponent,
571
+ GeoMapBasemapSwitcherComponent,
572
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
573
+ class: 'geo-map-shell-host',
574
+ '[style.height]': 'height()',
575
+ }, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"] }]
576
+ }], ctorParameters: () => [] });
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1zaGVsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbWFwL2Nocm9tZS9nZW8tbWFwLXNoZWxsL2dlby1tYXAtc2hlbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zaGVsbC9nZW8tbWFwLXNoZWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLCtCQUErQixFQUMvQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLHdCQUF3QixFQUN4Qix1QkFBdUIsR0FDeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNwRyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNoSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBaUIxRDs7Ozs7O0dBTUc7QUE2QkgsTUFBTSxPQUFPLG9CQUFvQjtJQUNkLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsV0FBVyxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVqRCxNQUFNLEdBQUcsS0FBSyxDQUFXLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLGNBQWMsR0FBRyxLQUFLLENBQzdCLCtCQUErQixDQUNoQyxDQUFDO0lBQ08sY0FBYyxHQUFHLEtBQUssQ0FDN0IsK0JBQStCLENBQ2hDLENBQUM7SUFDRiwyREFBMkQ7SUFDbEQsTUFBTSxHQUFHLEtBQUssQ0FBc0IsRUFBRSxDQUFDLENBQUM7SUFDeEMsV0FBVyxHQUFHLEtBQUssQ0FBcUIseUJBQXlCLENBQUMsQ0FBQztJQUNuRSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxVQUFVLEdBQUcsS0FBSyxDQUFnQix3QkFBd0IsQ0FBQyxDQUFDO0lBQzVELGFBQWEsR0FBRyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUN4RCxjQUFjLEdBQUcsS0FBSyxDQUF1QixTQUFTLENBQUMsQ0FBQztJQUN4RCxjQUFjLEdBQUcsS0FBSyxDQUM3QixvQ0FBb0MsQ0FDckMsQ0FBQztJQUNGLHNFQUFzRTtJQUM3RCxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDOzs7T0FHRztJQUNNLFFBQVEsR0FBRyxLQUFLLENBQXNCLFVBQVUsQ0FBQyxDQUFDO0lBRWxELFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsV0FBVyxHQUFHLEtBQUssQ0FBb0IsTUFBTSxDQUFDLENBQUM7SUFDL0MsVUFBVSxHQUFHLEtBQUssQ0FBMEIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLGFBQWEsR0FBRyxLQUFLLENBQXNCLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLGFBQWEsR0FBRyxLQUFLLENBQTJCLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELGNBQWMsR0FBRyxLQUFLLENBQTRCLElBQUksQ0FBQyxDQUFDO0lBQ3hELGdCQUFnQixHQUFHLEtBQUssQ0FBeUIsRUFBRSxDQUFDLENBQUM7SUFDckQsaUJBQWlCLEdBQUcsS0FBSyxDQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFaEUsUUFBUSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUN0QyxRQUFRLEdBQUcsTUFBTSxFQUFvQixDQUFDO0lBQ3RDLFlBQVksR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUM5QixXQUFXLEdBQUcsTUFBTSxFQUF1QixDQUFDO0lBQzVDLE1BQU0sR0FBRyxNQUFNLEVBQXFCLENBQUM7SUFDckMsV0FBVyxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQzdCLFlBQVksR0FBRyxNQUFNLEVBQTBCLENBQUM7SUFDaEQsWUFBWSxHQUFHLE1BQU0sRUFBc0IsQ0FBQztJQUM1QyxVQUFVLEdBQUcsTUFBTSxFQUEwQixDQUFDO0lBRTlDLFVBQVUsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzVELCtEQUErRDtJQUN0RCxRQUFRLEdBQUcsTUFBTSxDQUF1QyxNQUFNLENBQUMsQ0FBQztJQUN6RSx3REFBd0Q7SUFDdkMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDZCxnQkFBZ0IsR0FBRyxHQUFTLEVBQUU7UUFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ2UsY0FBYyxHQUFHLEdBQVMsRUFBRTtRQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRjtRQUNFLG1GQUFtRjtRQUNuRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFNBQVMsR0FDYixNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDZCxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsT0FBTztZQUNULENBQUM7WUFDRCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO3FCQUFNLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7cUJBQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLG9FQUFvRTtRQUNwRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPO1lBQ1QsQ0FBQztZQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRVEsT0FBTyxHQUFHLFFBQVEsQ0FBZ0IsR0FBRyxFQUFFO1FBQzlDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sTUFBTSxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksS0FBSyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFDLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN2RCxPQUFPO29CQUNMLEdBQUcsTUFBTTtvQkFDVCxLQUFLLEVBQUUsV0FBVztvQkFDbEIsT0FBTyxFQUFFLDBCQUEwQjtpQkFDcEMsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbEUsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3RDLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMzQixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQzNDLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDMUMsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDL0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxZQUFZO29CQUNuRCxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNoRCxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO2lCQUNoRSxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFTSxjQUFjLEdBQUcsUUFBUSxDQUFzQixHQUFHLEVBQUU7UUFDM0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBc0I7WUFDakMsR0FBRyx1QkFBdUI7WUFDMUIsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFFLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxJQUFzQjtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDbkMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDN0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBdUI7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQXNCO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUEyQjtRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixRQUFRLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ25DLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7d0JBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7b0JBQ2hDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMxQixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssY0FBYztnQkFDakIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssY0FBYztnQkFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM5QixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxrQkFBa0I7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxjQUFjO2dCQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzlCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FHZjtRQUNDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGtCQUFrQixDQUNuQyx3QkFBd0IsRUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixRQUFRLEVBQUUsSUFBSTtpQkFDWCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQzNCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDNUMsQ0FBQztRQUNGLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBNEI7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsSUFBNEI7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0Isd0RBQXdEO1FBQ3hELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDaEUsT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCw4RUFBOEU7SUFDdEUsU0FBUyxDQUNmLEtBQTBEO1FBRTFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLElBQXlEO1FBRXpELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFxQjtRQUN4QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixPQUFPO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFzQjtRQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUQsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEQsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsRUFBRSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixLQUF3QjtRQUV4QixNQUFNLFdBQVcsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQ25ELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FDbEUsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUNYLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFDM0MsQ0FBQyxDQUFFLFdBQVcsQ0FBQyxJQUFnQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzthQUN4QyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUNULElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQzNDLE9BQU87WUFDTDtnQkFDRSxFQUFFLEVBQUUsZ0JBQWdCO2dCQUNwQixLQUFLLEVBQUUsaUJBQWlCO2dCQUN4QixRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0JBQzVDLE9BQU8sRUFBRSxPQUFPLElBQUk7b0JBQ2xCLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtvQkFDekMsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxTQUFTO3dCQUNmLFdBQVcsRUFBRTs0QkFDWDtnQ0FDRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7Z0NBQ2YsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO2dDQUNoQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7Z0NBQ2pCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQ0FDaEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDOzZCQUNoQjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRCxNQUFNLEVBQUUsRUFBRSxHQUFHLDBCQUEwQixFQUFFO2FBQzFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDckMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDbEQsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7d0dBdGpCVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixzcktBRVUsdUJBQXVCLDBGQUMzQixtQkFBbUIsZ0VDaEcxRCwwL0ZBd0dBLGtwRkRuQ0ksZUFBZSw4VEFDZixzQkFBc0Isc0xBQ3RCLG1CQUFtQixxSkFDbkIsdUJBQXVCLGlKQUN2QixzQkFBc0Isb0pBQ3RCLDJCQUEyQixvTkFDM0IscUJBQXFCLGtJQUNyQixtQkFBbUIseUhBQ25CLG9CQUFvQixnS0FDcEIscUJBQXFCLDRSQUNyQiwwQkFBMEIsc1FBQzFCLDBCQUEwQiwwTUFDMUIsMkJBQTJCLDZGQUMzQiw4QkFBOEI7OzRGQVdyQixvQkFBb0I7a0JBNUJoQyxTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1A7d0JBQ1AsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLDJCQUEyQjt3QkFDM0IscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQiwwQkFBMEI7d0JBQzFCLDBCQUEwQjt3QkFDMUIsMkJBQTJCO3dCQUMzQiw4QkFBOEI7cUJBQy9CLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSxvQkFBb0I7d0JBQzNCLGdCQUFnQixFQUFFLFVBQVU7cUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgR0VPX01BUF9ERUZBVUxUX0JBU0VNQVBfT1BUSU9OUyxcbiAgR0VPX01BUF9ERUZBVUxUX0NFTlRFUixcbiAgR0VPX01BUF9ERUZBVUxUX1BST1ZJTkNFX0VYVEVOVF80MzI2LFxuICBHRU9fTUFQX0RFRkFVTFRfVE9PTEJBUl9BQ1RJT05TLFxuICBHRU9fTUFQX0RFRkFVTFRfWk9PTSxcbiAgR0VPX01BUF9ERU1PX0FETUlOX05PREVTLFxuICBHRU9fTUFQX0RFTU9fTEVHRU5EX0lURU1TLFxuICBHRU9fTUFQX0RFTU9fUEFSQ0VMX0RFVEFJTCxcbiAgR0VPX01BUF9ERU1PX1RIRU1BVElDX0xBWUVSUyxcbiAgR0VPX01BUF9UUkFGRklDX0xBWUVSX0lELFxuICBHRU9fTUFQX1RSQUZGSUNfT1ZFUkxBWSxcbn0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb25zdGFudHMnO1xuaW1wb3J0IHsgR2VvTWFwQWRtaW5GaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLWFkbWluLWZpbHRlci9nZW8tbWFwLWFkbWluLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwQmFzZW1hcFN3aXRjaGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1iYXNlbWFwLXN3aXRjaGVyL2dlby1tYXAtYmFzZW1hcC1zd2l0Y2hlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwSGVscENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtaGVscC9nZW8tbWFwLWhlbHAuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcExheWVyc0RyYXdlckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtbGF5ZXJzLWRyYXdlci9nZW8tbWFwLWxheWVycy1kcmF3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcExlZ2VuZENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtbGVnZW5kL2dlby1tYXAtbGVnZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBMb2NhdGlvbkNoaXBDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLWxvY2F0aW9uLWNoaXAvZ2VvLW1hcC1sb2NhdGlvbi1jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBNZWFzdXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1tZWFzdXJlL2dlby1tYXAtbWVhc3VyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwUGFyY2VsUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLXBhcmNlbC1wb3B1cC9nZW8tbWFwLXBhcmNlbC1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1zZWFyY2gvZ2VvLW1hcC1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcFNuYXBzaG90Q29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1zbmFwc2hvdC9nZW8tbWFwLXNuYXBzaG90LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBTd2lwZUNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtc3dpcGUvZ2VvLW1hcC1zd2lwZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtdG9vbGJhci9nZW8tbWFwLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcFpvb21Db21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLXpvb20vZ2VvLW1hcC16b29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9nZW8tbWFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb250cm9sbGVyJztcbmltcG9ydCB0eXBlIHsgR2VvVHJlZU5vZGUgfSBmcm9tICcuLi8uLi8uLi9nZW8tdHJlZS9nZW8tdHJlZS50eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdlb01hcEJhc2VtYXAsXG4gIEdlb01hcEJhc2VtYXBPcHRpb24sXG4gIEdlb01hcENsaWNrRXZlbnQsXG4gIEdlb01hcExheWVyQ29uZmlnLFxuICBHZW9NYXBMZWdlbmRJdGVtLFxuICBHZW9NYXBNZWFzdXJlTW9kZSxcbiAgR2VvTWFwUGFyY2VsQXVkaWVuY2UsXG4gIEdlb01hcFBhcmNlbERldGFpbCxcbiAgR2VvTWFwU2VhcmNoUXVlcnksXG4gIEdlb01hcFNlYXJjaFJlc3VsdEl0ZW0sXG4gIEdlb01hcFRvb2xiYXJBY3Rpb24sXG59IGZyb20gJy4uLy4uL2dlby1tYXAudHlwZXMnO1xuXG4vKipcbiAqIE1hcCB2aWV3cG9ydCArIHBvcnRhbCBjaHJvbWUgKHRvb2xiYXIsIGxheWVycyBkcmF3ZXIsIGxlZ2VuZCwgaGVscCwgc3dpcGUsIOKApikuXG4gKlxuICogQHN1bW1hcnkgQ29tcG9zZWQgbWFwIHNoZWxsIHdpdGggY2hyb21lIHRvb2xzIGZvciBTdG9yeWJvb2sgLyBwb3J0YWwuXG4gKiBAd2hlblRvVXNlIFB1YmxpYyBtYXAgcGFnZSBjaHJvbWUgKGPhu5VuZyBjw7RuZyBraGFpKS5cbiAqIEBkb05vdFVzZVdoZW4gTmVlZCBvbmx5IHRoZSByYXcgT0wgaG9zdCDigJQgdXNlIGdlby1tYXAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dlby1tYXAtc2hlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgR2VvTWFwQ29tcG9uZW50LFxuICAgIEdlb01hcFRvb2xiYXJDb21wb25lbnQsXG4gICAgR2VvTWFwWm9vbUNvbXBvbmVudCxcbiAgICBHZW9NYXBTbmFwc2hvdENvbXBvbmVudCxcbiAgICBHZW9NYXBNZWFzdXJlQ29tcG9uZW50LFxuICAgIEdlb01hcExheWVyc0RyYXdlckNvbXBvbmVudCxcbiAgICBHZW9NYXBMZWdlbmRDb21wb25lbnQsXG4gICAgR2VvTWFwSGVscENvbXBvbmVudCxcbiAgICBHZW9NYXBTd2lwZUNvbXBvbmVudCxcbiAgICBHZW9NYXBTZWFyY2hDb21wb25lbnQsXG4gICAgR2VvTWFwQWRtaW5GaWx0ZXJDb21wb25lbnQsXG4gICAgR2VvTWFwUGFyY2VsUG9wdXBDb21wb25lbnQsXG4gICAgR2VvTWFwTG9jYXRpb25DaGlwQ29tcG9uZW50LFxuICAgIEdlb01hcEJhc2VtYXBTd2l0Y2hlckNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAtc2hlbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLW1hcC1zaGVsbC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdnZW8tbWFwLXNoZWxsLWhvc3QnLFxuICAgICdbc3R5bGUuaGVpZ2h0XSc6ICdoZWlnaHQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb01hcFNoZWxsQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNuYXBzaG90UmVmID0gdmlld0NoaWxkKEdlb01hcFNuYXBzaG90Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b29tUmVmID0gdmlld0NoaWxkKEdlb01hcFpvb21Db21wb25lbnQpO1xuXG4gIHJlYWRvbmx5IGNlbnRlciA9IGlucHV0PG51bWJlcltdPihbLi4uR0VPX01BUF9ERUZBVUxUX0NFTlRFUl0pO1xuICByZWFkb25seSB6b29tID0gaW5wdXQoR0VPX01BUF9ERUZBVUxUX1pPT00pO1xuICByZWFkb25seSBoZWlnaHQgPSBpbnB1dCgnNTYwcHgnKTtcbiAgcmVhZG9ubHkgc2hvd01vdXNlUG9zaXRpb24gPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IGJhc2VtYXBPcHRpb25zID0gaW5wdXQ8R2VvTWFwQmFzZW1hcE9wdGlvbltdPihcbiAgICBHRU9fTUFQX0RFRkFVTFRfQkFTRU1BUF9PUFRJT05TLFxuICApO1xuICByZWFkb25seSB0b29sYmFyQWN0aW9ucyA9IGlucHV0PEdlb01hcFRvb2xiYXJBY3Rpb25bXT4oXG4gICAgR0VPX01BUF9ERUZBVUxUX1RPT0xCQVJfQUNUSU9OUyxcbiAgKTtcbiAgLyoqIEV4dHJhIG92ZXJsYXlzIG1lcmdlZCBhZnRlciBkZW1vIHRoZW1hdGljICsgdHJhZmZpYy4gKi9cbiAgcmVhZG9ubHkgbGF5ZXJzID0gaW5wdXQ8R2VvTWFwTGF5ZXJDb25maWdbXT4oW10pO1xuICByZWFkb25seSBsZWdlbmRJdGVtcyA9IGlucHV0PEdlb01hcExlZ2VuZEl0ZW1bXT4oR0VPX01BUF9ERU1PX0xFR0VORF9JVEVNUyk7XG4gIHJlYWRvbmx5IHNob3dOYXYgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgaW5jbHVkZURlbW9MYXllcnMgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgYWRtaW5Ob2RlcyA9IGlucHV0PEdlb1RyZWVOb2RlW10+KEdFT19NQVBfREVNT19BRE1JTl9OT0RFUyk7XG4gIHJlYWRvbmx5IGxvY2F0aW9uTGFiZWwgPSBpbnB1dCgnUGjGsOG7nW5nIDEg4oCUIFRQIMSQw6AgTOG6oXQsIEzDom0gxJDhu5NuZycpO1xuICByZWFkb25seSBwYXJjZWxBdWRpZW5jZSA9IGlucHV0PEdlb01hcFBhcmNlbEF1ZGllbmNlPignY2l0aXplbicpO1xuICByZWFkb25seSBwcm92aW5jZUV4dGVudCA9IGlucHV0PHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPihcbiAgICBHRU9fTUFQX0RFRkFVTFRfUFJPVklOQ0VfRVhURU5UXzQzMjYsXG4gICk7XG4gIC8qKiBXaGVuIHRydWUsIHNoZWxsIHNlZWRzIG1vY2sgc2VhcmNoIHJlc3VsdHMgKFN0b3J5Ym9vayAvIGRlbW9zKS4gKi9cbiAgcmVhZG9ubHkgZGVtb1NlYXJjaCA9IGlucHV0KHRydWUpO1xuICAvKipcbiAgICogYGxvY2F0aW9uYCDigJQgSG9tZSBvcGVucyDEkFZIQyBmaWx0ZXIgKGRlZmF1bHQpLlxuICAgKiBgZW1pdGAg4oCUIEhvbWUgb25seSBlbWl0cyBgYWN0aW9uQ2xpY2tgIChlLmcuIHBvcnRhbCBuYXZpZ2F0ZXMgdG8gbG9naW4vZGFzaGJvYXJkKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVNb2RlID0gaW5wdXQ8J2xvY2F0aW9uJyB8ICdlbWl0Jz4oJ2xvY2F0aW9uJyk7XG5cbiAgcmVhZG9ubHkgYmFzZW1hcElkID0gbW9kZWwoJ29zbScpO1xuICByZWFkb25seSBtZWFzdXJlTW9kZSA9IG1vZGVsPEdlb01hcE1lYXN1cmVNb2RlPignbm9uZScpO1xuICByZWFkb25seSBjaGVja2VkTWFwID0gbW9kZWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHsgdHJhZmZpYzogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGxheWVyc09wZW4gPSBtb2RlbChmYWxzZSk7XG4gIHJlYWRvbmx5IGxlZ2VuZE9wZW4gPSBtb2RlbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhlbHBPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBzd2lwZUFjdGl2ZSA9IG1vZGVsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VhcmNoT3BlbiA9IG1vZGVsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWRtaW5GaWx0ZXJPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBwYXJjZWxPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBtYW5hZ2VkTGF5ZXJzID0gbW9kZWw8R2VvTWFwTGF5ZXJDb25maWdbXT4oW10pO1xuICByZWFkb25seSBzZWFyY2hSZXN1bHRzID0gbW9kZWw8R2VvTWFwU2VhcmNoUmVzdWx0SXRlbVtdPihbXSk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkUGFyY2VsID0gbW9kZWw8R2VvTWFwUGFyY2VsRGV0YWlsIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGFkbWluQ2hlY2tlZEtleXMgPSBtb2RlbDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PihbXSk7XG4gIHJlYWRvbmx5IGFkbWluRXhwYW5kZWRLZXlzID0gbW9kZWw8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj4oWydsYW0tZG9uZyddKTtcblxuICByZWFkb25seSBtYXBSZWFkeSA9IG91dHB1dDxHZW9NYXBDb250cm9sbGVyPigpO1xuICByZWFkb25seSBtYXBDbGljayA9IG91dHB1dDxHZW9NYXBDbGlja0V2ZW50PigpO1xuICByZWFkb25seSBsb2NhdGVEZW5pZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYWN0aW9uQ2xpY2sgPSBvdXRwdXQ8R2VvTWFwVG9vbGJhckFjdGlvbj4oKTtcbiAgcmVhZG9ubHkgc2VhcmNoID0gb3V0cHV0PEdlb01hcFNlYXJjaFF1ZXJ5PigpO1xuICByZWFkb25seSBzZWFyY2hSZXNldCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZXN1bHRTZWxlY3QgPSBvdXRwdXQ8R2VvTWFwU2VhcmNoUmVzdWx0SXRlbT4oKTtcbiAgcmVhZG9ubHkgcGFyY2VsRXhwb3J0ID0gb3V0cHV0PEdlb01hcFBhcmNlbERldGFpbD4oKTtcbiAgcmVhZG9ubHkgYWRtaW5BcHBseSA9IG91dHB1dDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PigpO1xuXG4gIHJlYWRvbmx5IGNvbnRyb2xsZXIgPSBzaWduYWw8R2VvTWFwQ29udHJvbGxlciB8IG51bGw+KG51bGwpO1xuICAvKiogQWN0aXZlIG1hcCBwb2ludGVyIHRvb2wgKGBub25lYCA9IGRlZmF1bHQgYXJyb3cgY3Vyc29yKS4gKi9cbiAgcmVhZG9ubHkgdG9vbE1vZGUgPSBzaWduYWw8J25vbmUnIHwgJ3BhbicgfCAnZGlzdGFuY2UnIHwgJ2FyZWEnPignbm9uZScpO1xuICAvKiogV2hlbiB0cnVlLCBwYXJjZWwgQmFjayByZXR1cm5zIHRvIHNlYXJjaCBwb3BvdmVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmNlbEZyb21TZWFyY2ggPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHBhbkN1cnNvckJvdW5kID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25QYW5Qb2ludGVyRG93biA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAncGFuJykge1xuICAgICAgdGhpcy5zZXRNYXBDdXJzb3IoJ2dyYWJiaW5nJyk7XG4gICAgfVxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUGFuUG9pbnRlclVwID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdwYW4nKSB7XG4gICAgICB0aGlzLnNldE1hcEN1cnNvcignZ3JhYicpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFbmZvcmNlIGEgc2luZ2xlIGxlZnQgY2hyb21lIHBvcG92ZXIgKHNlYXJjaCAvIMSQVkhDIC8gcGFyY2VsIC8gbGF5ZXJzIC8gbGVnZW5kKS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hPcGVuKCk7XG4gICAgICBjb25zdCBhZG1pbiA9IHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCk7XG4gICAgICBjb25zdCBwYXJjZWwgPSB0aGlzLnBhcmNlbE9wZW4oKTtcbiAgICAgIGNvbnN0IGxheWVycyA9IHRoaXMubGF5ZXJzT3BlbigpO1xuICAgICAgY29uc3QgbGVnZW5kID0gdGhpcy5sZWdlbmRPcGVuKCk7XG4gICAgICBjb25zdCBvcGVuQ291bnQgPVxuICAgICAgICBOdW1iZXIoc2VhcmNoKSArXG4gICAgICAgIE51bWJlcihhZG1pbikgK1xuICAgICAgICBOdW1iZXIocGFyY2VsKSArXG4gICAgICAgIE51bWJlcihsYXllcnMpICtcbiAgICAgICAgTnVtYmVyKGxlZ2VuZCk7XG4gICAgICBpZiAob3BlbkNvdW50IDw9IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHBhcmNlbCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ3BhcmNlbCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGxheWVycykge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2xheWVycycpO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2xlZ2VuZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ3NlYXJjaCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2FkbWluJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG5cbiAgICAvLyBXaGVuIG1lYXN1cmUgZmluaXNoZXMgLyBjYW5jZWxzLCByZXR1cm4gdG8gaWRsZSArIGRlZmF1bHQgY3Vyc29yLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5tZWFzdXJlTW9kZSgpO1xuICAgICAgaWYgKG1vZGUgIT09ICdub25lJykge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KG1vZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbCA9IHRoaXMudG9vbE1vZGUoKTtcbiAgICAgICAgaWYgKHRvb2wgPT09ICdkaXN0YW5jZScgfHwgdG9vbCA9PT0gJ2FyZWEnKSB7XG4gICAgICAgICAgdGhpcy50b29sTW9kZS5zZXQoJ25vbmUnKTtcbiAgICAgICAgICB0aGlzLnNldE1hcEN1cnNvcihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcblxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gdGhpcy51bmJpbmRQYW5DdXJzb3IoKSk7XG4gIH1cblxuICByZWFkb25seSBiYXNlbWFwID0gY29tcHV0ZWQ8R2VvTWFwQmFzZW1hcD4oKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5iYXNlbWFwSWQoKTtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLmJhc2VtYXBPcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgIHJldHVybiBvcHRpb24/LmJhc2VtYXAgPz8gJ29zbSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlc29sdmVkVG9vbGJhckFjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMubWVhc3VyZU1vZGUoKTtcbiAgICBjb25zdCB0b29sID0gdGhpcy50b29sTW9kZSgpO1xuICAgIGNvbnN0IHN3aXBlID0gdGhpcy5zd2lwZUFjdGl2ZSgpO1xuICAgIGNvbnN0IGxheWVyc09wZW4gPSB0aGlzLmxheWVyc09wZW4oKTtcbiAgICBjb25zdCBsZWdlbmRPcGVuID0gdGhpcy5sZWdlbmRPcGVuKCk7XG4gICAgY29uc3Qgc2VhcmNoT3BlbiA9IHRoaXMuc2VhcmNoT3BlbigpO1xuICAgIGNvbnN0IGFkbWluT3BlbiA9IHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCk7XG4gICAgY29uc3QgZnVsbHNjcmVlbiA9IHRoaXMuem9vbVJlZigpPy5pc0Z1bGxzY3JlZW4oKSA/PyBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy50b29sYmFyQWN0aW9ucygpLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoYWN0aW9uLmlkID09PSAnaG9tZScgJiYgdGhpcy5ob21lTW9kZSgpID09PSAnZW1pdCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgbGFiZWw6ICdUcmFuZyBjaOG7pycsXG4gICAgICAgICAgdG9vbHRpcDogJ1bhu4EgdHJhbmcgY2jhu6cgLyDEkcSDbmcgbmjhuq1wJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdwYW4nKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiB0b29sID09PSAncGFuJyAmJiBtb2RlID09PSAnbm9uZScgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdtZWFzdXJlLWRpc3RhbmNlJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogbW9kZSA9PT0gJ2Rpc3RhbmNlJyB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ21lYXN1cmUtYXJlYScpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYWN0aW9uLCBhY3RpdmU6IG1vZGUgPT09ICdhcmVhJyB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ3N3aXBlJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogc3dpcGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdsYXllcnMnKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiBsYXllcnNPcGVuIH07XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uLmlkID09PSAnbGVnZW5kJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogbGVnZW5kT3BlbiB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ3NlYXJjaCcpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYWN0aW9uLCBhY3RpdmU6IHNlYXJjaE9wZW4gfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdhZG1pbi1maWx0ZXInKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiBhZG1pbk9wZW4gfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdmdWxsc2NyZWVuJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICBhY3RpdmU6IGZ1bGxzY3JlZW4sXG4gICAgICAgICAgaWNvbjogZnVsbHNjcmVlbiA/ICdmdWxsc2NyZWVuLWV4aXQnIDogJ2Z1bGxzY3JlZW4nLFxuICAgICAgICAgIGljb25TcmM6IGZ1bGxzY3JlZW4gPyB1bmRlZmluZWQgOiBhY3Rpb24uaWNvblNyYyxcbiAgICAgICAgICB0b29sdGlwOiBmdWxsc2NyZWVuID8gJ1Rob8OhdCB0b8OgbiBtw6BuIGjDrG5oJyA6ICdYZW0gdG/DoG4gYuG6o24gxJHhu5MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcmVzb2x2ZWRMYXllcnMgPSBjb21wdXRlZDxHZW9NYXBMYXllckNvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgdHJhZmZpY09uID0gISF0aGlzLmNoZWNrZWRNYXAoKVsndHJhZmZpYyddO1xuICAgIGNvbnN0IHRyYWZmaWM6IEdlb01hcExheWVyQ29uZmlnID0ge1xuICAgICAgLi4uR0VPX01BUF9UUkFGRklDX09WRVJMQVksXG4gICAgICB2aXNpYmxlOiB0cmFmZmljT24sXG4gICAgfTtcbiAgICBjb25zdCBtYW5hZ2VkID0gdGhpcy5tYW5hZ2VkTGF5ZXJzKCk7XG4gICAgaWYgKG1hbmFnZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gWy4uLm1hbmFnZWQsIHRyYWZmaWNdO1xuICAgIH1cbiAgICBjb25zdCBkZW1vID0gdGhpcy5pbmNsdWRlRGVtb0xheWVycygpID8gR0VPX01BUF9ERU1PX1RIRU1BVElDX0xBWUVSUyA6IFtdO1xuICAgIHJldHVybiBbLi4uZGVtbywgdHJhZmZpYywgLi4udGhpcy5sYXllcnMoKV07XG4gIH0pO1xuXG4gIG9uTWFwUmVhZHkoY3RybDogR2VvTWFwQ29udHJvbGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXQoY3RybCk7XG4gICAgaWYgKCF0aGlzLm1hbmFnZWRMYXllcnMoKS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSB0aGlzLmluY2x1ZGVEZW1vTGF5ZXJzKClcbiAgICAgICAgPyBHRU9fTUFQX0RFTU9fVEhFTUFUSUNfTEFZRVJTLm1hcCgobGF5ZXIpID0+ICh7IC4uLmxheWVyIH0pKVxuICAgICAgICA6IHRoaXMubGF5ZXJzKCkubWFwKChsYXllcikgPT4gKHsgLi4ubGF5ZXIgfSkpO1xuICAgICAgdGhpcy5tYW5hZ2VkTGF5ZXJzLnNldChzZWVkKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kUGFuQ3Vyc29yKGN0cmwpO1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdwYW4nKSB7XG4gICAgICB0aGlzLmFwcGx5UGFuQ3Vyc29yKCk7XG4gICAgfVxuICAgIHRoaXMubWFwUmVhZHkuZW1pdChjdHJsKTtcbiAgfVxuXG4gIG9uTWFwQ2xpY2soZXZlbnQ6IEdlb01hcENsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmNlbEZyb21TZWFyY2guc2V0KGZhbHNlKTtcbiAgICB0aGlzLm1hcENsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25CYXNlbWFwQ2hhbmdlKGJhc2VtYXA6IEdlb01hcEJhc2VtYXApOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0QmFzZW1hcChiYXNlbWFwKTtcbiAgfVxuXG4gIG9uVG9vbGJhckFjdGlvbihhY3Rpb246IEdlb01hcFRvb2xiYXJBY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNsaWNrLmVtaXQoYWN0aW9uKTtcbiAgICBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgY2FzZSAnaG9tZSc6XG4gICAgICAgIGlmICh0aGlzLmhvbWVNb2RlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgICAgICBpZiAodGhpcy5hZG1pbkZpbHRlck9wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5hZG1pbkZpbHRlck9wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuem9vbVJlZigpPy5maXRQcm92aW5jZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYW5lbCgnYWRtaW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZG1pbi1maWx0ZXInOlxuICAgICAgICBpZiAodGhpcy5hZG1pbkZpbHRlck9wZW4oKSkge1xuICAgICAgICAgIHRoaXMuYWRtaW5GaWx0ZXJPcGVuLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy56b29tUmVmKCk/LmZpdFByb3ZpbmNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuUGFuZWwoJ2FkbWluJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaXQtcHJvdmluY2UnOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uZml0UHJvdmluY2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYW4nOlxuICAgICAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAncGFuJykge1xuICAgICAgICAgIHRoaXMuZXhpdFRvb2xNb2RlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbnRlclBhbk1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3pvb20taW4nOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uem9vbUluKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnem9vbS1vdXQnOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uem9vbU91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Z1bGxzY3JlZW4nOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8udG9nZ2xlRnVsbHNjcmVlbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaE9wZW4oKSkge1xuICAgICAgICAgIHRoaXMuc2VhcmNoT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdzZWFyY2gnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xheWVycyc6XG4gICAgICAgIGlmICh0aGlzLmxheWVyc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubGF5ZXJzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdsYXllcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZ2VuZCc6XG4gICAgICAgIGlmICh0aGlzLmxlZ2VuZE9wZW4oKSkge1xuICAgICAgICAgIHRoaXMubGVnZW5kT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdsZWdlbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hlbHAnOlxuICAgICAgICB0aGlzLmhlbHBPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzd2lwZSc6XG4gICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMuem9vbVJlZigpPy5yZXNldEludGVyYWN0aW9uTW9kZSgpO1xuICAgICAgICB0aGlzLnNldE1hcEN1cnNvcihudWxsKTtcbiAgICAgICAgdGhpcy5zd2lwZUFjdGl2ZS51cGRhdGUoKHYpID0+ICF2KTtcbiAgICAgICAgaWYgKHRoaXMuc3dpcGVBY3RpdmUoKSkge1xuICAgICAgICAgIHRoaXMuZW5zdXJlU3dpcGVPdmVybGF5VmlzaWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWVhc3VyZS1kaXN0YW5jZSc6XG4gICAgICAgIHRoaXMuc3dpcGVBY3RpdmUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy56b29tUmVmKCk/LnJlc2V0SW50ZXJhY3Rpb25Nb2RlKCk7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVNb2RlKCkgPT09ICdkaXN0YW5jZScpIHtcbiAgICAgICAgICB0aGlzLmV4aXRUb29sTW9kZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdkaXN0YW5jZScpO1xuICAgICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdkaXN0YW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWVhc3VyZS1hcmVhJzpcbiAgICAgICAgdGhpcy5zd2lwZUFjdGl2ZS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnpvb21SZWYoKT8ucmVzZXRJbnRlcmFjdGlvbk1vZGUoKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZU1vZGUoKSA9PT0gJ2FyZWEnKSB7XG4gICAgICAgICAgdGhpcy5leGl0VG9vbE1vZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRvb2xNb2RlLnNldCgnYXJlYScpO1xuICAgICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdhcmVhJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzbmFwc2hvdCc6XG4gICAgICAgIHRoaXMuc25hcHNob3RSZWYoKT8uY2FwdHVyZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9vbGJhclRvZ2dsZShldmVudDoge1xuICAgIGFjdGlvbjogR2VvTWFwVG9vbGJhckFjdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmFjdGlvbi5pZCA9PT0gJ3RyYWZmaWMnKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0TGF5ZXJWaXNpYmlsaXR5KFxuICAgICAgICBHRU9fTUFQX1RSQUZGSUNfTEFZRVJfSUQsXG4gICAgICAgIGV2ZW50LmNoZWNrZWQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKHF1ZXJ5OiBHZW9NYXBTZWFyY2hRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoLmVtaXQocXVlcnkpO1xuICAgIGlmICghdGhpcy5kZW1vU2VhcmNoKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVtbyA9IHRoaXMuYnVpbGREZW1vU2VhcmNoUmVzdWx0cyhxdWVyeSk7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzLnNldChkZW1vKTtcbiAgICBjb25zdCBnZW9qc29uQ29sbGVjdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICBmZWF0dXJlczogZGVtb1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmdlb2pzb24pXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIG9iamVjdCA9PiAhIWl0ZW0pLFxuICAgIH07XG4gICAgaWYgKGdlb2pzb25Db2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyKCk/LnNldEhpZ2hsaWdodEZyb21HZW9Kc29uKGdlb2pzb25Db2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaFJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoUmVzdWx0cy5zZXQoW10pO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJjZWwuc2V0KG51bGwpO1xuICAgIHRoaXMucGFyY2VsT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY29udHJvbGxlcigpPy5jbGVhckhpZ2hsaWdodCgpO1xuICAgIHRoaXMuc2VhcmNoUmVzZXQuZW1pdCgpO1xuICB9XG5cbiAgb25QYXJjZWxDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJjZWxGcm9tU2VhcmNoLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RlZFBhcmNlbC5zZXQobnVsbCk7XG4gICAgdGhpcy5jb250cm9sbGVyKCk/LmNsZWFySGlnaGxpZ2h0KCk7XG4gIH1cblxuICBvblBhcmNlbEJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgZnJvbVNlYXJjaCA9IHRoaXMucGFyY2VsRnJvbVNlYXJjaCgpO1xuICAgIHRoaXMucGFyY2VsT3Blbi5zZXQoZmFsc2UpO1xuICAgIGlmIChmcm9tU2VhcmNoKSB7XG4gICAgICB0aGlzLnBhcmNlbEZyb21TZWFyY2guc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3BlblBhbmVsKCdzZWFyY2gnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFBhcmNlbC5zZXQobnVsbCk7XG4gICAgdGhpcy5jb250cm9sbGVyKCk/LmNsZWFySGlnaGxpZ2h0KCk7XG4gIH1cblxuICBvblJlc3VsdFNlbGVjdChpdGVtOiBHZW9NYXBTZWFyY2hSZXN1bHRJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5yZXN1bHRTZWxlY3QuZW1pdChpdGVtKTtcbiAgICBpZiAoaXRlbS5nZW9qc29uKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0SGlnaGxpZ2h0RnJvbUdlb0pzb24oaXRlbS5nZW9qc29uKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZXh0ZW50NDMyNikge1xuICAgICAgdGhpcy5jb250cm9sbGVyKCk/LmZpdExvbkxhdEV4dGVudChpdGVtLmV4dGVudDQzMjYpO1xuICAgIH1cbiAgICBpZiAoaXRlbS5wYXJjZWwpIHtcbiAgICAgIHRoaXMucGFyY2VsRnJvbVNlYXJjaC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUGFyY2VsLnNldChpdGVtLnBhcmNlbCk7XG4gICAgICB0aGlzLm9wZW5QYW5lbCgncGFyY2VsJyk7XG4gICAgfVxuICB9XG5cbiAgb25BZG1pbkFwcGx5KGtleXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiB2b2lkIHtcbiAgICB0aGlzLmFkbWluQXBwbHkuZW1pdChrZXlzKTtcbiAgICAvLyBEZW1vOiBmaXQgYSBzYW1wbGUgd2FyZCBiYm94IHdoZW4gYSBsZWFmIGlzIHNlbGVjdGVkLlxuICAgIGlmICh0aGlzLmRlbW9TZWFyY2goKSAmJiBrZXlzLnNvbWUoKGtleSkgPT4gU3RyaW5nKGtleSkuc3RhcnRzV2l0aCgneGEtJykpKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZml0TG9uTGF0RXh0ZW50KFsxMDguNDIsIDExLjkyLCAxMDguNSwgMTEuOThdLCB7XG4gICAgICAgIG1heFpvb206IDE0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25GaXRQcm92aW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZml0UHJvdmluY2UodGhpcy5wcm92aW5jZUV4dGVudCgpKTtcbiAgfVxuXG4gIG9uQWRtaW5DbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tUmVmKCk/LmZpdFByb3ZpbmNlKCk7XG4gIH1cblxuICAvKiogT3BlbiBvbmUgbGVmdCBjaHJvbWUgcG9wb3ZlcjsgY2xvc2UgdGhlIG90aGVycyB0byBhdm9pZCBzdGFja2VkIHNjcm9sbC4gKi9cbiAgcHJpdmF0ZSBvcGVuUGFuZWwoXG4gICAgcGFuZWw6ICdzZWFyY2gnIHwgJ2FkbWluJyB8ICdwYXJjZWwnIHwgJ2xheWVycycgfCAnbGVnZW5kJyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVBhbmVsc0V4Y2VwdChwYW5lbCk7XG4gICAgaWYgKHBhbmVsID09PSAnc2VhcmNoJykge1xuICAgICAgdGhpcy5zZWFyY2hPcGVuLnNldCh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHBhbmVsID09PSAnYWRtaW4nKSB7XG4gICAgICB0aGlzLmFkbWluRmlsdGVyT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChwYW5lbCA9PT0gJ3BhcmNlbCcpIHtcbiAgICAgIHRoaXMucGFyY2VsT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChwYW5lbCA9PT0gJ2xheWVycycpIHtcbiAgICAgIHRoaXMubGF5ZXJzT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGVnZW5kT3Blbi5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVBhbmVsc0V4Y2VwdChcbiAgICBrZWVwOiAnc2VhcmNoJyB8ICdhZG1pbicgfCAncGFyY2VsJyB8ICdsYXllcnMnIHwgJ2xlZ2VuZCcsXG4gICk6IHZvaWQge1xuICAgIGlmIChrZWVwICE9PSAnc2VhcmNoJyAmJiB0aGlzLnNlYXJjaE9wZW4oKSkge1xuICAgICAgdGhpcy5zZWFyY2hPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnYWRtaW4nICYmIHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCkpIHtcbiAgICAgIHRoaXMuYWRtaW5GaWx0ZXJPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAncGFyY2VsJyAmJiB0aGlzLnBhcmNlbE9wZW4oKSkge1xuICAgICAgdGhpcy5wYXJjZWxPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnbGF5ZXJzJyAmJiB0aGlzLmxheWVyc09wZW4oKSkge1xuICAgICAgdGhpcy5sYXllcnNPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnbGVnZW5kJyAmJiB0aGlzLmxlZ2VuZE9wZW4oKSkge1xuICAgICAgdGhpcy5sZWdlbmRPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnRlclBhbk1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy50b29sTW9kZS5zZXQoJ3BhbicpO1xuICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdub25lJyk7XG4gICAgdGhpcy5zd2lwZUFjdGl2ZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuem9vbVJlZigpPy5yZXNldEludGVyYWN0aW9uTW9kZSgpO1xuICAgIHRoaXMuYXBwbHlQYW5DdXJzb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhpdFRvb2xNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgdGhpcy5tZWFzdXJlTW9kZS5zZXQoJ25vbmUnKTtcbiAgICB0aGlzLnN3aXBlQWN0aXZlLnNldChmYWxzZSk7XG4gICAgdGhpcy56b29tUmVmKCk/LnJlc2V0SW50ZXJhY3Rpb25Nb2RlKCk7XG4gICAgdGhpcy5zZXRNYXBDdXJzb3IobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UGFuQ3Vyc29yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdwYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0TWFwQ3Vyc29yKCdncmFiJyk7XG4gIH1cblxuICBwcml2YXRlIHNldE1hcEN1cnNvcihjdXJzb3I6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuY29udHJvbGxlcigpPy5nZXRNYXAoKT8uZ2V0VGFyZ2V0RWxlbWVudCgpO1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gY3Vyc29yID8/ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kUGFuQ3Vyc29yKGN0cmw6IEdlb01hcENvbnRyb2xsZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGN0cmwuZ2V0TWFwKCk/LmdldFRhcmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsIHx8IHRoaXMucGFuQ3Vyc29yQm91bmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUGFuUG9pbnRlckRvd24pO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUGFuUG9pbnRlclVwKTtcbiAgICB0aGlzLnBhbkN1cnNvckJvdW5kID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kUGFuQ3Vyc29yKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5jb250cm9sbGVyKCk/LmdldE1hcCgpPy5nZXRUYXJnZXRFbGVtZW50KCk7XG4gICAgaWYgKCFlbCB8fCAhdGhpcy5wYW5DdXJzb3JCb3VuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25QYW5Qb2ludGVyRG93bik7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBhblBvaW50ZXJVcCk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgdGhpcy5vblBhblBvaW50ZXJVcCk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIHRoaXMucGFuQ3Vyc29yQm91bmQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZW1vU2VhcmNoUmVzdWx0cyhcbiAgICBxdWVyeTogR2VvTWFwU2VhcmNoUXVlcnksXG4gICk6IEdlb01hcFNlYXJjaFJlc3VsdEl0ZW1bXSB7XG4gICAgY29uc3QgcGFyY2VsTGF5ZXIgPSBHRU9fTUFQX0RFTU9fVEhFTUFUSUNfTEFZRVJTLmZpbmQoXG4gICAgICAobGF5ZXIpID0+IGxheWVyLmlkID09PSAnZGVtby1wYXJjZWwnICYmIGxheWVyLnR5cGUgPT09ICdnZW9qc29uJyxcbiAgICApO1xuICAgIGNvbnN0IGZlYXR1cmUgPVxuICAgICAgcGFyY2VsTGF5ZXIgJiYgcGFyY2VsTGF5ZXIudHlwZSA9PT0gJ2dlb2pzb24nXG4gICAgICAgID8gKHBhcmNlbExheWVyLmRhdGEgYXMgeyBmZWF0dXJlcz86IG9iamVjdFtdIH0pLmZlYXR1cmVzPy5bMF1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2V5d29yZCA9IE9iamVjdC52YWx1ZXMocXVlcnkudmFsdWVzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCBsYWJlbCA9IGtleXdvcmQgfHwgJ1Ro4butYSAxMiDigJQgVOG7nSA0NSc7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdkZW1vLXBhcmNlbC0xMicsXG4gICAgICAgIHRpdGxlOiBgVGjhu61hIDEyIC8gVOG7nSA0NWAsXG4gICAgICAgIHN1YnRpdGxlOiBsYWJlbCxcbiAgICAgICAgZXh0ZW50NDMyNjogWzEwOC40NSwgMTEuOTQsIDEwOC40NjUsIDExLjk1Ml0sXG4gICAgICAgIGdlb2pzb246IGZlYXR1cmUgPz8ge1xuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7IHBhcmNlbDogJzEyJywgc2hlZXQ6ICc0NScgfSxcbiAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsxMDguNDUsIDExLjk0XSxcbiAgICAgICAgICAgICAgICBbMTA4LjQ2NSwgMTEuOTRdLFxuICAgICAgICAgICAgICAgIFsxMDguNDY1LCAxMS45NTJdLFxuICAgICAgICAgICAgICAgIFsxMDguNDUsIDExLjk1Ml0sXG4gICAgICAgICAgICAgICAgWzEwOC40NSwgMTEuOTRdLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwYXJjZWw6IHsgLi4uR0VPX01BUF9ERU1PX1BBUkNFTF9ERVRBSUwgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlU3dpcGVPdmVybGF5VmlzaWJsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5tYW5hZ2VkTGF5ZXJzKCk7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbnlWaXNpYmxlID0gbGlzdC5zb21lKChsYXllcikgPT4gbGF5ZXIudmlzaWJsZSAhPT0gZmFsc2UpO1xuICAgIGlmIChhbnlWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSBsaXN0Lm1hcCgobGF5ZXIsIGluZGV4KSA9PlxuICAgICAgaW5kZXggPT09IDAgPyB7IC4uLmxheWVyLCB2aXNpYmxlOiB0cnVlIH0gOiBsYXllcixcbiAgICApO1xuICAgIHRoaXMubWFuYWdlZExheWVycy5zZXQobmV4dCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnZW8tbWFwLXNoZWxsXCI+XG4gIDxnZW8tbWFwXG4gICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX19tYXBcIlxuICAgIFtjZW50ZXJdPVwiY2VudGVyKClcIlxuICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgW2hlaWdodF09XCInMTAwJSdcIlxuICAgIFtiYXNlbWFwXT1cImJhc2VtYXAoKVwiXG4gICAgW2xheWVyc109XCJyZXNvbHZlZExheWVycygpXCJcbiAgICBbc2hvd01vdXNlUG9zaXRpb25dPVwic2hvd01vdXNlUG9zaXRpb24oKVwiXG4gICAgW3Nob3dab29tQ29udHJvbF09XCJmYWxzZVwiXG4gICAgKG1hcFJlYWR5KT1cIm9uTWFwUmVhZHkoJGV2ZW50KVwiXG4gICAgKG1hcENsaWNrKT1cIm9uTWFwQ2xpY2soJGV2ZW50KVwiXG4gIC8+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX2Nocm9tZS1sZWZ0XCI+XG4gICAgPGdlby1tYXAtdG9vbGJhclxuICAgICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX190b29sYmFyXCJcbiAgICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXIoKVwiXG4gICAgICBbYWN0aW9uc109XCJyZXNvbHZlZFRvb2xiYXJBY3Rpb25zKClcIlxuICAgICAgWyhjaGVja2VkTWFwKV09XCJjaGVja2VkTWFwXCJcbiAgICAgIChhY3Rpb25DbGljayk9XCJvblRvb2xiYXJBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAoYWN0aW9uVG9nZ2xlKT1cIm9uVG9vbGJhclRvZ2dsZSgkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX3BhbmVsc1wiPlxuICAgICAgPGdlby1tYXAtc2VhcmNoXG4gICAgICAgIFsob3BlbildPVwic2VhcmNoT3BlblwiXG4gICAgICAgIFtyZXN1bHRzXT1cInNlYXJjaFJlc3VsdHMoKVwiXG4gICAgICAgIChzZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIChyZXNldCk9XCJvblNlYXJjaFJlc2V0KClcIlxuICAgICAgICAocmVzdWx0U2VsZWN0KT1cIm9uUmVzdWx0U2VsZWN0KCRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxnZW8tbWFwLWFkbWluLWZpbHRlclxuICAgICAgICBbKG9wZW4pXT1cImFkbWluRmlsdGVyT3BlblwiXG4gICAgICAgIHRpdGxlPVwiQ2h1eeG7g24gduG7iyB0csOtXCJcbiAgICAgICAgW25vZGVzXT1cImFkbWluTm9kZXMoKVwiXG4gICAgICAgIFsoY2hlY2tlZEtleXMpXT1cImFkbWluQ2hlY2tlZEtleXNcIlxuICAgICAgICBbKGV4cGFuZGVkS2V5cyldPVwiYWRtaW5FeHBhbmRlZEtleXNcIlxuICAgICAgICAoYXBwbHkpPVwib25BZG1pbkFwcGx5KCRldmVudClcIlxuICAgICAgICAocmVzZXQpPVwiYWRtaW5DaGVja2VkS2V5cy5zZXQoW10pXCJcbiAgICAgICAgKGZpdFByb3ZpbmNlKT1cIm9uRml0UHJvdmluY2UoKVwiXG4gICAgICAgIChjbG9zZWQpPVwib25BZG1pbkNsb3NlZCgpXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1wYXJjZWwtcG9wdXBcbiAgICAgICAgWyhvcGVuKV09XCJwYXJjZWxPcGVuXCJcbiAgICAgICAgW3BhcmNlbF09XCJzZWxlY3RlZFBhcmNlbCgpXCJcbiAgICAgICAgW2F1ZGllbmNlXT1cInBhcmNlbEF1ZGllbmNlKClcIlxuICAgICAgICAoZXhwb3J0Q2xpY2spPVwicGFyY2VsRXhwb3J0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChiYWNrKT1cIm9uUGFyY2VsQmFjaygpXCJcbiAgICAgICAgKGNsb3NlZCk9XCJvblBhcmNlbENsb3NlZCgpXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1sYXllcnMtZHJhd2VyXG4gICAgICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXIoKVwiXG4gICAgICAgIFsob3BlbildPVwibGF5ZXJzT3BlblwiXG4gICAgICAgIFsobGF5ZXJzKV09XCJtYW5hZ2VkTGF5ZXJzXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1sZWdlbmRcbiAgICAgICAgWyhvcGVuKV09XCJsZWdlbmRPcGVuXCJcbiAgICAgICAgW2l0ZW1zXT1cImxlZ2VuZEl0ZW1zKClcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBIZWFkbGVzcyBicmlkZ2VzOiB6b29tL2Z1bGxzY3JlZW4gKyBzbmFwc2hvdCAoZHJpdmVuIGJ5IHRvb2xiYXIgYWN0aW9ucykuIC0tPlxuICA8Z2VvLW1hcC16b29tXG4gICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX196b29tLWJyaWRnZVwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICBbc2hvd05hdl09XCJzaG93TmF2KClcIlxuICAgIFtwcm92aW5jZUV4dGVudF09XCJwcm92aW5jZUV4dGVudCgpXCJcbiAgLz5cbiAgPGdlby1tYXAtc25hcHNob3RcbiAgICBjbGFzcz1cImdlby1tYXAtc2hlbGxfX3NuYXBzaG90LWJyaWRnZVwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgLz5cblxuICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1zaGVsbF9fdG9wLXJpZ2h0XCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2dlb01hcFNoZWxsVG9wUmlnaHRdXCIgLz5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX2JvdHRvbS1yaWdodFwiPlxuICAgIDxnZW8tbWFwLWJhc2VtYXAtc3dpdGNoZXJcbiAgICAgIFtvcHRpb25zXT1cImJhc2VtYXBPcHRpb25zKClcIlxuICAgICAgWyhzZWxlY3RlZElkKV09XCJiYXNlbWFwSWRcIlxuICAgICAgKGJhc2VtYXBDaGFuZ2UpPVwib25CYXNlbWFwQ2hhbmdlKCRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX19zdGF0dXNcIj5cbiAgICBAaWYgKGxvY2F0aW9uTGFiZWwoKSkge1xuICAgICAgPGdlby1tYXAtbG9jYXRpb24tY2hpcCBbbGFiZWxdPVwibG9jYXRpb25MYWJlbCgpXCIgLz5cbiAgICB9XG4gICAgPGdlby1tYXAtbWVhc3VyZVxuICAgICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICAgIFsobW9kZSldPVwibWVhc3VyZU1vZGVcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxnZW8tbWFwLXN3aXBlXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICBbKGFjdGl2ZSldPVwic3dpcGVBY3RpdmVcIlxuICAvPlxuXG4gIDxnZW8tbWFwLWhlbHAgWyhvcGVuKV09XCJoZWxwT3BlblwiIC8+XG48L2Rpdj5cbiJdfQ==