@carto/kepler.gl 0.0.73 → 0.0.75-alpha.deckv9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/dist/actions/action-wrapper.js +20 -48
  2. package/dist/actions/actions.js +10 -19
  3. package/dist/actions/identity-actions.js +8 -17
  4. package/dist/actions/index.js +7 -24
  5. package/dist/actions/map-state-actions.js +10 -19
  6. package/dist/actions/map-style-actions.js +20 -35
  7. package/dist/actions/provider-actions.js +26 -42
  8. package/dist/actions/ui-state-actions.js +42 -70
  9. package/dist/actions/vis-state-actions.js +102 -162
  10. package/dist/cloud-providers/index.js +8 -8
  11. package/dist/cloud-providers/provider.js +55 -94
  12. package/dist/components/bottom-widget.js +47 -48
  13. package/dist/components/common/action-panel.js +39 -38
  14. package/dist/components/common/animation-control/animation-control.js +40 -38
  15. package/dist/components/common/animation-control/animation-controller.js +47 -70
  16. package/dist/components/common/animation-control/animation-speed-slider.js +28 -38
  17. package/dist/components/common/animation-control/floating-time-display.js +56 -67
  18. package/dist/components/common/animation-control/playback-controls.js +64 -80
  19. package/dist/components/common/animation-control/speed-control.js +26 -24
  20. package/dist/components/common/checkbox.js +31 -52
  21. package/dist/components/common/color-legend.js +40 -72
  22. package/dist/components/common/data-table/button.js +29 -22
  23. package/dist/components/common/data-table/canvas.js +21 -10
  24. package/dist/components/common/data-table/cell-size.js +54 -58
  25. package/dist/components/common/data-table/grid.js +30 -31
  26. package/dist/components/common/data-table/index.js +91 -133
  27. package/dist/components/common/data-table/option-dropdown.js +29 -33
  28. package/dist/components/common/dataset-label.js +21 -13
  29. package/dist/components/common/error-boundary.js +25 -30
  30. package/dist/components/common/field-selector.js +35 -69
  31. package/dist/components/common/field-token.js +21 -16
  32. package/dist/components/common/file-uploader/file-drop.js +40 -55
  33. package/dist/components/common/file-uploader/file-upload-progress.js +32 -30
  34. package/dist/components/common/file-uploader/file-upload.js +52 -91
  35. package/dist/components/common/file-uploader/upload-button.js +31 -42
  36. package/dist/components/common/histogram-plot.js +32 -27
  37. package/dist/components/common/icons/add.js +27 -27
  38. package/dist/components/common/icons/anchor_window.js +3 -9
  39. package/dist/components/common/icons/arrow-down-alt.js +27 -27
  40. package/dist/components/common/icons/arrow-down-solid .js +27 -27
  41. package/dist/components/common/icons/arrow-down.js +27 -27
  42. package/dist/components/common/icons/arrow-left.js +27 -27
  43. package/dist/components/common/icons/arrow-right.js +27 -27
  44. package/dist/components/common/icons/arrow-up-alt.js +27 -27
  45. package/dist/components/common/icons/arrow-up-solid.js +27 -27
  46. package/dist/components/common/icons/arrow-up.js +27 -27
  47. package/dist/components/common/icons/base.js +38 -42
  48. package/dist/components/common/icons/bug.js +27 -27
  49. package/dist/components/common/icons/cancel.js +27 -27
  50. package/dist/components/common/icons/checkmark.js +27 -28
  51. package/dist/components/common/icons/chevron-right.js +27 -27
  52. package/dist/components/common/icons/clipboard.js +27 -27
  53. package/dist/components/common/icons/clock.js +27 -27
  54. package/dist/components/common/icons/close.js +27 -27
  55. package/dist/components/common/icons/code-alt.js +27 -28
  56. package/dist/components/common/icons/copy.js +27 -28
  57. package/dist/components/common/icons/crosshairs.js +27 -28
  58. package/dist/components/common/icons/cube-3d.js +27 -27
  59. package/dist/components/common/icons/cursor-click.js +27 -27
  60. package/dist/components/common/icons/data-table.js +27 -27
  61. package/dist/components/common/icons/db.js +27 -27
  62. package/dist/components/common/icons/delete.js +27 -27
  63. package/dist/components/common/icons/docs.js +27 -27
  64. package/dist/components/common/icons/drag-n-drop.js +27 -27
  65. package/dist/components/common/icons/draw-polygon.js +27 -27
  66. package/dist/components/common/icons/email.js +27 -27
  67. package/dist/components/common/icons/expand.js +27 -27
  68. package/dist/components/common/icons/eye-seen.js +27 -27
  69. package/dist/components/common/icons/eye-unseen.js +27 -27
  70. package/dist/components/common/icons/file-type.js +23 -16
  71. package/dist/components/common/icons/file.js +27 -27
  72. package/dist/components/common/icons/files.js +24 -26
  73. package/dist/components/common/icons/filter-funnel.js +27 -27
  74. package/dist/components/common/icons/free-window.js +3 -9
  75. package/dist/components/common/icons/gear.js +27 -27
  76. package/dist/components/common/icons/hash.js +27 -27
  77. package/dist/components/common/icons/histogram.js +24 -25
  78. package/dist/components/common/icons/index.js +63 -138
  79. package/dist/components/common/icons/info.js +27 -28
  80. package/dist/components/common/icons/layers.js +27 -27
  81. package/dist/components/common/icons/left-arrow.js +27 -28
  82. package/dist/components/common/icons/legend.js +27 -27
  83. package/dist/components/common/icons/line-chart.js +27 -27
  84. package/dist/components/common/icons/login.js +27 -27
  85. package/dist/components/common/icons/logout.js +27 -27
  86. package/dist/components/common/icons/map-icon.js +27 -28
  87. package/dist/components/common/icons/map.js +27 -28
  88. package/dist/components/common/icons/messages.js +27 -27
  89. package/dist/components/common/icons/minus.js +27 -27
  90. package/dist/components/common/icons/pause.js +27 -27
  91. package/dist/components/common/icons/picture.js +24 -26
  92. package/dist/components/common/icons/pin.js +27 -27
  93. package/dist/components/common/icons/play.js +27 -27
  94. package/dist/components/common/icons/polygon.js +27 -27
  95. package/dist/components/common/icons/rectangle.js +27 -27
  96. package/dist/components/common/icons/reduce.js +27 -27
  97. package/dist/components/common/icons/reset.js +27 -27
  98. package/dist/components/common/icons/rocket.js +27 -27
  99. package/dist/components/common/icons/save.js +27 -27
  100. package/dist/components/common/icons/save2.js +27 -27
  101. package/dist/components/common/icons/search.js +27 -27
  102. package/dist/components/common/icons/settings.js +27 -27
  103. package/dist/components/common/icons/share.js +27 -27
  104. package/dist/components/common/icons/split.js +27 -27
  105. package/dist/components/common/icons/square-select.js +27 -27
  106. package/dist/components/common/icons/swap-horizontal.js +27 -28
  107. package/dist/components/common/icons/table.js +27 -27
  108. package/dist/components/common/icons/trash.js +27 -27
  109. package/dist/components/common/icons/upload.js +27 -27
  110. package/dist/components/common/icons/vert-dots.js +27 -27
  111. package/dist/components/common/icons/vert-three-dots.js +27 -27
  112. package/dist/components/common/icons/warning.js +27 -28
  113. package/dist/components/common/image-preview.js +36 -29
  114. package/dist/components/common/info-helper.js +26 -25
  115. package/dist/components/common/item-selector/accessor.js +3 -5
  116. package/dist/components/common/item-selector/chickleted-input.js +41 -43
  117. package/dist/components/common/item-selector/dropdown-list.js +44 -74
  118. package/dist/components/common/item-selector/item-selector-submenu.js +29 -38
  119. package/dist/components/common/item-selector/item-selector.js +36 -84
  120. package/dist/components/common/item-selector/typeahead.js +37 -83
  121. package/dist/components/common/line-chart.js +39 -36
  122. package/dist/components/common/loading-spinner.js +33 -25
  123. package/dist/components/common/logo.js +24 -22
  124. package/dist/components/common/map-layer-selector.js +23 -16
  125. package/dist/components/common/modal.js +36 -61
  126. package/dist/components/common/portaled.js +56 -97
  127. package/dist/components/common/progress-bar.js +29 -20
  128. package/dist/components/common/range-brush.js +63 -104
  129. package/dist/components/common/range-plot.js +47 -52
  130. package/dist/components/common/range-slider.js +52 -78
  131. package/dist/components/common/slider/mouse-event.js +11 -37
  132. package/dist/components/common/slider/slider-bar-handle.js +31 -39
  133. package/dist/components/common/slider/slider-handle.js +35 -44
  134. package/dist/components/common/slider/slider.js +55 -82
  135. package/dist/components/common/styled-components.js +64 -169
  136. package/dist/components/common/switch.js +22 -16
  137. package/dist/components/common/time-range-slider-time-title.js +24 -19
  138. package/dist/components/common/time-range-slider.js +41 -38
  139. package/dist/components/common/time-slider-marker.js +36 -41
  140. package/dist/components/common/toolbar-item.js +22 -16
  141. package/dist/components/common/toolbar.js +21 -10
  142. package/dist/components/common/vertical-toolbar.js +21 -10
  143. package/dist/components/container.js +49 -70
  144. package/dist/components/context.js +6 -10
  145. package/dist/components/editor/constants.js +6 -8
  146. package/dist/components/editor/editor.js +40 -72
  147. package/dist/components/editor/feature-action-panel.js +35 -43
  148. package/dist/components/editor/feature-styles.js +35 -40
  149. package/dist/components/editor/handle-style.js +35 -37
  150. package/dist/components/filters/components.js +21 -10
  151. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +14 -25
  152. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +14 -21
  153. package/dist/components/filters/filter-panels/new-filter-panel.js +13 -23
  154. package/dist/components/filters/filter-panels/polygon-filter-panel.js +13 -25
  155. package/dist/components/filters/filter-panels/range-filter-panel.js +14 -21
  156. package/dist/components/filters/filter-panels/single-select-filter-panel.js +14 -21
  157. package/dist/components/filters/filter-panels/time-range-filter-panel.js +14 -23
  158. package/dist/components/filters/index.js +11 -17
  159. package/dist/components/filters/multi-select-filter.js +3 -9
  160. package/dist/components/filters/polygon-filter.js +8 -18
  161. package/dist/components/filters/range-filter.js +3 -8
  162. package/dist/components/filters/single-select-filter.js +3 -9
  163. package/dist/components/filters/time-range-filter.js +7 -18
  164. package/dist/components/filters/time-widget.js +41 -51
  165. package/dist/components/geocoder/geocoder.js +95 -128
  166. package/dist/components/geocoder-panel.js +37 -62
  167. package/dist/components/index.js +356 -498
  168. package/dist/components/injector.js +42 -58
  169. package/dist/components/kepler-gl.js +65 -158
  170. package/dist/components/map/coordinate-info.js +4 -13
  171. package/dist/components/map/layer-hover-info.js +40 -48
  172. package/dist/components/map/layer-selector-panel.js +17 -30
  173. package/dist/components/map/locale-panel.js +13 -27
  174. package/dist/components/map/map-control-panel.js +27 -24
  175. package/dist/components/map/map-control-toolbar.js +21 -11
  176. package/dist/components/map/map-control-tooltip.js +4 -11
  177. package/dist/components/map/map-control.js +26 -27
  178. package/dist/components/map/map-draw-panel.js +12 -29
  179. package/dist/components/map/map-legend-panel.js +17 -34
  180. package/dist/components/map/map-legend.js +52 -70
  181. package/dist/components/map/map-popover.js +41 -57
  182. package/dist/components/map/split-map-button.js +13 -25
  183. package/dist/components/map/toggle-3d-button.js +10 -21
  184. package/dist/components/map-container.js +98 -145
  185. package/dist/components/maps-layout.js +24 -26
  186. package/dist/components/modal-container.js +60 -112
  187. package/dist/components/modals/add-map-style-modal.js +37 -67
  188. package/dist/components/modals/cloud-tile.js +36 -36
  189. package/dist/components/modals/data-table-modal.js +51 -81
  190. package/dist/components/modals/delete-data-modal.js +24 -20
  191. package/dist/components/modals/error-display.js +3 -10
  192. package/dist/components/modals/export-data-modal.js +37 -54
  193. package/dist/components/modals/export-image-modal.js +31 -28
  194. package/dist/components/modals/export-map-modal/components.js +27 -27
  195. package/dist/components/modals/export-map-modal/export-html-map.js +27 -27
  196. package/dist/components/modals/export-map-modal/export-json-map.js +22 -22
  197. package/dist/components/modals/export-map-modal/export-map-modal.js +20 -40
  198. package/dist/components/modals/image-modal-container.js +9 -16
  199. package/dist/components/modals/load-data-modal.js +29 -33
  200. package/dist/components/modals/load-storage-map.js +42 -77
  201. package/dist/components/modals/loading-dialog.js +24 -18
  202. package/dist/components/modals/modal-dialog.js +3 -7
  203. package/dist/components/modals/modal-tabs.js +29 -29
  204. package/dist/components/modals/overwrite-map-modal.js +29 -28
  205. package/dist/components/modals/provider-modal-container.js +27 -27
  206. package/dist/components/modals/save-map-modal.js +43 -48
  207. package/dist/components/modals/share-map-modal.js +42 -53
  208. package/dist/components/modals/status-panel.js +24 -25
  209. package/dist/components/modals/storage-map-viewer.js +30 -43
  210. package/dist/components/notification-panel/notification-item.js +33 -47
  211. package/dist/components/notification-panel.js +30 -36
  212. package/dist/components/performance.js +11 -36
  213. package/dist/components/plot-container.js +42 -72
  214. package/dist/components/side-panel/cloud-storage-dropdown.js +4 -10
  215. package/dist/components/side-panel/common/dataset-info.js +20 -13
  216. package/dist/components/side-panel/common/dataset-tag.js +21 -12
  217. package/dist/components/side-panel/common/dataset-title.js +37 -52
  218. package/dist/components/side-panel/common/source-data-catalog.js +26 -22
  219. package/dist/components/side-panel/common/source-data-selector.js +34 -40
  220. package/dist/components/side-panel/custom-panel.js +5 -9
  221. package/dist/components/side-panel/filter-manager.js +18 -29
  222. package/dist/components/side-panel/filter-panel/filter-panel-header.js +30 -30
  223. package/dist/components/side-panel/filter-panel/filter-panel.js +36 -55
  224. package/dist/components/side-panel/interaction-manager.js +5 -12
  225. package/dist/components/side-panel/interaction-panel/brush-config.js +23 -19
  226. package/dist/components/side-panel/interaction-panel/interaction-panel.js +36 -59
  227. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +34 -74
  228. package/dist/components/side-panel/interaction-panel/tooltip-config.js +28 -40
  229. package/dist/components/side-panel/layer-manager.js +51 -82
  230. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +3 -10
  231. package/dist/components/side-panel/layer-panel/color-palette.js +27 -23
  232. package/dist/components/side-panel/layer-panel/color-range-selector.js +52 -98
  233. package/dist/components/side-panel/layer-panel/color-selector.js +36 -67
  234. package/dist/components/side-panel/layer-panel/column-selector.js +26 -25
  235. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +2 -6
  236. package/dist/components/side-panel/layer-panel/custom-palette.js +37 -71
  237. package/dist/components/side-panel/layer-panel/custom-picker.js +32 -45
  238. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +8 -16
  239. package/dist/components/side-panel/layer-panel/hex-column-config.js +12 -34
  240. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +2 -10
  241. package/dist/components/side-panel/layer-panel/layer-column-config.js +31 -27
  242. package/dist/components/side-panel/layer-panel/layer-config-group.js +46 -80
  243. package/dist/components/side-panel/layer-panel/layer-configurator.js +162 -250
  244. package/dist/components/side-panel/layer-panel/layer-panel-header.js +52 -66
  245. package/dist/components/side-panel/layer-panel/layer-panel.js +33 -54
  246. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +28 -22
  247. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +22 -18
  248. package/dist/components/side-panel/layer-panel/layer-type-selector.js +29 -32
  249. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +35 -40
  250. package/dist/components/side-panel/layer-panel/single-color-palette.js +32 -42
  251. package/dist/components/side-panel/layer-panel/text-label-panel.js +31 -42
  252. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +39 -52
  253. package/dist/components/side-panel/layer-panel/vis-config-slider.js +10 -19
  254. package/dist/components/side-panel/layer-panel/vis-config-switch.js +28 -29
  255. package/dist/components/side-panel/map-manager.js +32 -46
  256. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +28 -31
  257. package/dist/components/side-panel/map-style-panel/map-style-selector.js +26 -24
  258. package/dist/components/side-panel/panel-dropdown.js +28 -35
  259. package/dist/components/side-panel/panel-header-action.js +38 -43
  260. package/dist/components/side-panel/panel-header.js +54 -92
  261. package/dist/components/side-panel/panel-tab.js +24 -20
  262. package/dist/components/side-panel/panel-title.js +21 -10
  263. package/dist/components/side-panel/panel-toggle.js +26 -23
  264. package/dist/components/side-panel/side-bar.js +37 -53
  265. package/dist/components/side-panel.js +56 -65
  266. package/dist/connect/keplergl-connect.js +5 -14
  267. package/dist/connect/with-local-selector.js +33 -38
  268. package/dist/constants/action-types.js +5 -6
  269. package/dist/constants/color-palette.js +12 -23
  270. package/dist/constants/color-ranges.js +32 -31
  271. package/dist/constants/custom-color-ranges.js +9 -14
  272. package/dist/constants/default-settings.js +154 -239
  273. package/dist/constants/index.js +95 -103
  274. package/dist/constants/keyevent.js +3 -7
  275. package/dist/constants/tooltip.js +7 -10
  276. package/dist/constants/user-feedbacks.js +5 -6
  277. package/dist/constants/user-guides.js +12 -20
  278. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +29 -32
  279. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +10 -43
  280. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +54 -75
  281. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +29 -32
  282. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +29 -30
  283. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +29 -30
  284. package/dist/deckgl-layers/layer-utils/cluster-utils.js +10 -21
  285. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +75 -132
  286. package/dist/deckgl-layers/layer-utils/shader-utils.js +1 -5
  287. package/dist/deckgl-layers/line-layer/line-layer.js +27 -34
  288. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +26 -30
  289. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +33 -39
  290. package/dist/index.js +4 -23
  291. package/dist/layers/aggregation-layer.js +63 -97
  292. package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
  293. package/dist/layers/arc-layer/arc-layer.js +48 -73
  294. package/dist/layers/base-layer.js +257 -406
  295. package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
  296. package/dist/layers/cluster-layer/cluster-layer.js +33 -44
  297. package/dist/layers/default-layer-icon.js +27 -27
  298. package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
  299. package/dist/layers/geojson-layer/geojson-layer.js +54 -87
  300. package/dist/layers/geojson-layer/geojson-utils.js +35 -47
  301. package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
  302. package/dist/layers/grid-layer/grid-layer.js +30 -41
  303. package/dist/layers/grid-layer/grid-utils.js +6 -9
  304. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
  305. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +48 -80
  306. package/dist/layers/h3-hexagon-layer/h3-utils.js +10 -21
  307. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
  308. package/dist/layers/heatmap-layer/heatmap-layer.js +45 -72
  309. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
  310. package/dist/layers/hexagon-layer/hexagon-layer.js +30 -42
  311. package/dist/layers/hexagon-layer/hexagon-utils.js +3 -15
  312. package/dist/layers/icon-layer/icon-info-modal.js +23 -26
  313. package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
  314. package/dist/layers/icon-layer/icon-layer.js +59 -97
  315. package/dist/layers/index.js +38 -39
  316. package/dist/layers/layer-factory.js +38 -42
  317. package/dist/layers/layer-text-label.js +7 -17
  318. package/dist/layers/layer-update.js +3 -14
  319. package/dist/layers/line-layer/line-layer-icon.js +27 -27
  320. package/dist/layers/line-layer/line-layer.js +46 -66
  321. package/dist/layers/mapbox-utils.js +38 -51
  322. package/dist/layers/mapboxgl-layer.js +43 -58
  323. package/dist/layers/point-layer/point-layer-icon.js +27 -27
  324. package/dist/layers/point-layer/point-layer.js +57 -90
  325. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +41 -73
  326. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
  327. package/dist/layers/s2-geometry-layer/s2-utils.js +5 -11
  328. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +21 -15
  329. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
  330. package/dist/layers/scenegraph-layer/scenegraph-layer.js +52 -75
  331. package/dist/layers/trip-layer/trip-info-modal.js +21 -16
  332. package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
  333. package/dist/layers/trip-layer/trip-layer.js +51 -93
  334. package/dist/layers/trip-layer/trip-utils.js +16 -39
  335. package/dist/layers/types.js +3 -6
  336. package/dist/localization/en.js +22 -11
  337. package/dist/localization/formatted-message.js +5 -10
  338. package/dist/localization/index.js +7 -13
  339. package/dist/localization/locales.js +7 -12
  340. package/dist/middleware/index.js +2 -5
  341. package/dist/processors/data-processor.js +113 -177
  342. package/dist/processors/file-handler.js +200 -276
  343. package/dist/processors/index.js +33 -35
  344. package/dist/reducers/combined-updaters.js +35 -46
  345. package/dist/reducers/composer-helpers.js +28 -27
  346. package/dist/reducers/composers.js +25 -12
  347. package/dist/reducers/core.js +13 -46
  348. package/dist/reducers/index.js +24 -38
  349. package/dist/reducers/map-state-updaters.js +53 -65
  350. package/dist/reducers/map-state.js +31 -26
  351. package/dist/reducers/map-style-updaters.js +92 -136
  352. package/dist/reducers/map-style.js +31 -26
  353. package/dist/reducers/provider-state-updaters.js +92 -167
  354. package/dist/reducers/provider-state.js +32 -25
  355. package/dist/reducers/root.js +44 -50
  356. package/dist/reducers/ui-state-updaters.js +102 -202
  357. package/dist/reducers/ui-state.js +32 -26
  358. package/dist/reducers/vis-state-merger.js +102 -166
  359. package/dist/reducers/vis-state-selectors.js +5 -10
  360. package/dist/reducers/vis-state-updaters.js +386 -663
  361. package/dist/reducers/vis-state.js +32 -25
  362. package/dist/schemas/dataset-schema.js +36 -56
  363. package/dist/schemas/index.js +38 -45
  364. package/dist/schemas/map-state-schema.js +28 -24
  365. package/dist/schemas/map-style-schema.js +34 -48
  366. package/dist/schemas/schema-manager.js +44 -62
  367. package/dist/schemas/schema-utils.js +11 -15
  368. package/dist/schemas/schema.js +32 -27
  369. package/dist/schemas/versions.js +5 -9
  370. package/dist/schemas/vis-state-schema.js +109 -309
  371. package/dist/styles/base.js +367 -640
  372. package/dist/styles/index.js +1 -5
  373. package/dist/styles/media-breakpoints.js +21 -9
  374. package/dist/tasks/tasks.js +22 -50
  375. package/dist/templates/export-map-html.js +3 -6
  376. package/dist/utils/aggregate-utils.js +23 -27
  377. package/dist/utils/color-utils.js +36 -38
  378. package/dist/utils/custom-scales.js +1 -7
  379. package/dist/utils/data-scale-utils.js +11 -20
  380. package/dist/utils/data-utils.js +78 -137
  381. package/dist/utils/dataset-utils.js +71 -88
  382. package/dist/utils/dom-to-image.js +15 -93
  383. package/dist/utils/dom-utils.js +34 -116
  384. package/dist/utils/export-utils.js +65 -102
  385. package/dist/utils/filter-utils.js +170 -320
  386. package/dist/utils/gl-utils.js +39 -23
  387. package/dist/utils/gpu-filter-utils.js +46 -59
  388. package/dist/utils/index.js +68 -80
  389. package/dist/utils/interaction-utils.js +26 -50
  390. package/dist/utils/layer-utils.js +58 -63
  391. package/dist/utils/locale-utils.js +23 -21
  392. package/dist/utils/map-info-utils.js +2 -3
  393. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +72 -71
  394. package/dist/utils/map-style-utils/mapbox-utils.js +3 -5
  395. package/dist/utils/mapbox-utils.js +2 -5
  396. package/dist/utils/notifications-utils.js +36 -35
  397. package/dist/utils/observe-dimensions.js +36 -41
  398. package/dist/utils/projection-utils.js +9 -20
  399. package/dist/utils/searcher-utils.js +1 -4
  400. package/dist/utils/split-map-utils.js +36 -32
  401. package/dist/utils/table-utils/data-container-utils.js +27 -23
  402. package/dist/utils/table-utils/data-row.js +2 -13
  403. package/dist/utils/table-utils/index.js +1 -2
  404. package/dist/utils/table-utils/indexed-data-container.js +65 -84
  405. package/dist/utils/table-utils/kepler-table.js +83 -126
  406. package/dist/utils/table-utils/row-data-container.js +62 -87
  407. package/dist/utils/utils.js +51 -69
  408. package/package.json +4 -3
  409. package/src/components/kepler-gl.d.ts +0 -1
  410. package/src/components/kepler-gl.js +0 -7
  411. package/src/components/map-container.js +0 -3
  412. package/src/components/modal-container.d.ts +0 -1
  413. package/src/components/modal-container.js +0 -2
  414. package/src/components/modals/add-map-style-modal.js +0 -3
  415. package/src/components/side-panel/layer-panel/layer-configurator.js +11 -9
  416. package/src/layers/base-layer.js +1 -1
  417. package/src/utils/gl-utils.js +16 -15
  418. package/CHANGELOG.md +0 -948
@@ -1,72 +1,63 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.pointVisConfigs = exports.pointOptionalColumns = exports.pointRequiredColumns = exports.pointPosAccessor = void 0;
9
-
7
+ exports.pointVisConfigs = exports.pointRequiredColumns = exports.pointPosAccessor = exports.pointOptionalColumns = exports["default"] = void 0;
10
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
-
14
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
-
16
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
-
18
- var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
19
-
20
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
-
22
12
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
-
13
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
24
14
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
-
15
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
26
16
  var _extensions = require("@deck.gl/extensions");
27
-
28
17
  var _layers = require("@deck.gl/layers");
29
-
30
18
  var _baseLayer = _interopRequireDefault(require("../base-layer"));
31
-
32
19
  var _colorUtils = require("../../utils/color-utils");
33
-
34
20
  var _layerUtils = require("../../utils/layer-utils");
35
-
36
21
  var _datasetUtils = require("../../utils/dataset-utils");
37
-
38
22
  var _pointLayerIcon = _interopRequireDefault(require("./point-layer-icon"));
39
-
40
23
  var _defaultSettings = require("../../constants/default-settings");
41
-
42
24
  var _layerTextLabel = require("../layer-text-label");
43
-
44
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
45
-
46
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
47
-
48
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
49
-
50
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
51
-
52
- var pointPosAccessor = function pointPosAccessor(_ref) {
25
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
27
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
28
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // Copyright (c) 2022 Uber Technologies, Inc.
29
+ //
30
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
31
+ // of this software and associated documentation files (the "Software"), to deal
32
+ // in the Software without restriction, including without limitation the rights
33
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
34
+ // copies of the Software, and to permit persons to whom the Software is
35
+ // furnished to do so, subject to the following conditions:
36
+ //
37
+ // The above copyright notice and this permission notice shall be included in
38
+ // all copies or substantial portions of the Software.
39
+ //
40
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
43
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
44
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
45
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
46
+ // THE SOFTWARE.
47
+ var pointPosAccessor = exports.pointPosAccessor = function pointPosAccessor(_ref) {
53
48
  var lat = _ref.lat,
54
- lng = _ref.lng,
55
- altitude = _ref.altitude;
49
+ lng = _ref.lng,
50
+ altitude = _ref.altitude;
56
51
  return function (dc) {
57
52
  return function (d) {
58
53
  return [dc.valueAt(d.index, lng.fieldIdx), dc.valueAt(d.index, lat.fieldIdx), altitude && altitude.fieldIdx > -1 ? dc.valueAt(d.index, altitude.fieldIdx) : 0];
59
54
  };
60
55
  };
61
56
  };
62
-
63
- exports.pointPosAccessor = pointPosAccessor;
64
- var pointRequiredColumns = ['lat', 'lng'];
65
- exports.pointRequiredColumns = pointRequiredColumns;
66
- var pointOptionalColumns = ['altitude'];
67
- exports.pointOptionalColumns = pointOptionalColumns;
57
+ var pointRequiredColumns = exports.pointRequiredColumns = ['lat', 'lng'];
58
+ var pointOptionalColumns = exports.pointOptionalColumns = ['altitude'];
68
59
  var brushingExtension = new _extensions.BrushingExtension();
69
- var pointVisConfigs = {
60
+ var pointVisConfigs = exports.pointVisConfigs = {
70
61
  radius: 'radius',
71
62
  customMarkers: 'customMarkers',
72
63
  customMarkersUrl: 'customMarkersUrl',
@@ -85,28 +76,18 @@ var pointVisConfigs = {
85
76
  property: 'filled'
86
77
  }
87
78
  };
88
- exports.pointVisConfigs = pointVisConfigs;
89
-
90
- var PointLayer = /*#__PURE__*/function (_Layer) {
79
+ var PointLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
91
80
  (0, _inherits2["default"])(PointLayer, _Layer);
92
-
93
- var _super = _createSuper(PointLayer);
94
-
95
81
  function PointLayer(props) {
96
82
  var _this;
97
-
98
83
  (0, _classCallCheck2["default"])(this, PointLayer);
99
- _this = _super.call(this, props);
100
-
84
+ _this = _callSuper(this, PointLayer, [props]);
101
85
  _this.registerVisConfig(pointVisConfigs);
102
-
103
86
  _this.getPositionAccessor = function (dataContainer) {
104
87
  return pointPosAccessor(_this.config.columns)(dataContainer);
105
88
  };
106
-
107
89
  return _this;
108
90
  }
109
-
110
91
  (0, _createClass2["default"])(PointLayer, [{
111
92
  key: "type",
112
93
  get: function get() {
@@ -217,14 +198,12 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
217
198
  key: "setInitialLayerConfig",
218
199
  value: function setInitialLayerConfig(dataset) {
219
200
  var defaultColorField = (0, _datasetUtils.findDefaultColorField)(dataset);
220
-
221
201
  if (defaultColorField) {
222
202
  this.updateLayerConfig({
223
203
  colorField: defaultColorField
224
204
  });
225
205
  this.updateLayerVisualChannel(dataset, 'color');
226
206
  }
227
-
228
207
  return this;
229
208
  }
230
209
  }, {
@@ -245,14 +224,14 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
245
224
  value: function calculateDataAttribute(_ref2, getPosition) {
246
225
  var filteredIndex = _ref2.filteredIndex;
247
226
  var data = [];
248
-
249
227
  for (var i = 0; i < filteredIndex.length; i++) {
250
228
  var index = filteredIndex[i];
251
229
  var pos = getPosition({
252
230
  index: index
253
- }); // if doesn't have point lat or lng, do not add the point
254
- // deck.gl can't handle position = null
231
+ });
255
232
 
233
+ // if doesn't have point lat or lng, do not add the point
234
+ // deck.gl can't handle position = null
256
235
  if (pos.every(Number.isFinite)) {
257
236
  data.push({
258
237
  position: pos,
@@ -260,7 +239,6 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
260
239
  });
261
240
  }
262
241
  }
263
-
264
242
  return data;
265
243
  }
266
244
  }, {
@@ -268,14 +246,13 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
268
246
  value: function formatLayerData(datasets, oldLayerData) {
269
247
  var textLabel = this.config.textLabel;
270
248
  var _datasets$this$config = datasets[this.config.dataId],
271
- gpuFilter = _datasets$this$config.gpuFilter,
272
- dataContainer = _datasets$this$config.dataContainer;
273
-
249
+ gpuFilter = _datasets$this$config.gpuFilter,
250
+ dataContainer = _datasets$this$config.dataContainer;
274
251
  var _this$updateData = this.updateData(datasets, oldLayerData),
275
- data = _this$updateData.data;
276
-
277
- var getPosition = this.getPositionAccessor(dataContainer); // get all distinct characters in the text labels
252
+ data = _this$updateData.data;
253
+ var getPosition = this.getPositionAccessor(dataContainer);
278
254
 
255
+ // get all distinct characters in the text labels
279
256
  var textLabels = (0, _layerTextLabel.formatTextLabelData)({
280
257
  textLabel: textLabel,
281
258
  dataContainer: dataContainer
@@ -291,7 +268,6 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
291
268
  }, accessors);
292
269
  }
293
270
  /* eslint-enable complexity */
294
-
295
271
  }, {
296
272
  key: "updateLayerMeta",
297
273
  value: function updateLayerMeta(dataContainer) {
@@ -305,33 +281,30 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
305
281
  key: "isLayerHovered",
306
282
  value: function isLayerHovered(objectInfo) {
307
283
  var _objectInfo$layer, _objectInfo$layer$pro, _objectInfo$layer2, _objectInfo$layer2$pr;
308
-
309
284
  return (objectInfo === null || objectInfo === void 0 ? void 0 : objectInfo.picked) && (objectInfo === null || objectInfo === void 0 ? void 0 : (_objectInfo$layer = objectInfo.layer) === null || _objectInfo$layer === void 0 ? void 0 : (_objectInfo$layer$pro = _objectInfo$layer.props) === null || _objectInfo$layer$pro === void 0 ? void 0 : _objectInfo$layer$pro.id) === this.id || (objectInfo === null || objectInfo === void 0 ? void 0 : (_objectInfo$layer2 = objectInfo.layer) === null || _objectInfo$layer2 === void 0 ? void 0 : (_objectInfo$layer2$pr = _objectInfo$layer2.props) === null || _objectInfo$layer2$pr === void 0 ? void 0 : _objectInfo$layer2$pr.id) === "".concat(this.id, "-icon");
310
- } // eslint-disable-next-line complexity, max-statements
285
+ }
311
286
 
287
+ // eslint-disable-next-line complexity, max-statements
312
288
  }, {
313
289
  key: "renderLayer",
314
290
  value: function renderLayer(opts) {
315
291
  var _this$config$columns$;
316
-
317
292
  var data = opts.data,
318
- gpuFilter = opts.gpuFilter,
319
- objectHovered = opts.objectHovered,
320
- interactionConfig = opts.interactionConfig;
293
+ gpuFilter = opts.gpuFilter,
294
+ objectHovered = opts.objectHovered,
295
+ interactionConfig = opts.interactionConfig;
321
296
  var _this$config$visConfi = this.config.visConfig,
322
- customMarkers = _this$config$visConfi.customMarkers,
323
- customMarkersUrl = _this$config$visConfi.customMarkersUrl,
324
- customMarkersRange = _this$config$visConfi.customMarkersRange;
297
+ customMarkers = _this$config$visConfi.customMarkers,
298
+ customMarkersUrl = _this$config$visConfi.customMarkersUrl,
299
+ customMarkersRange = _this$config$visConfi.customMarkersRange;
325
300
  var radiusScale = this.getRadiusScale();
326
301
  var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
327
302
  var brushingProps = this.getBrushingExtensionProps(interactionConfig);
328
303
  var extensions = [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [brushingExtension]);
329
-
330
304
  var updateTriggers = _objectSpread({
331
305
  getPosition: this.config.columns,
332
306
  getFilterValue: gpuFilter.filterValueUpdateTriggers
333
307
  }, this.getVisualChannelUpdateTriggers());
334
-
335
308
  var sharedProps = _objectSpread({
336
309
  getFilterValue: data.getFilterValue,
337
310
  extensions: extensions,
@@ -339,7 +312,6 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
339
312
  maskId: defaultLayerProps.maskId,
340
313
  visible: defaultLayerProps.visible
341
314
  }, brushingProps);
342
-
343
315
  var hoveredObject = this.hasHoveredObject(objectHovered);
344
316
  var textLabelLayer = this.renderTextLabelLayer({
345
317
  getPosition: data.getPosition,
@@ -349,18 +321,15 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
349
321
  getRadius: data.getRadius,
350
322
  updateTriggers: updateTriggers
351
323
  }, opts);
352
-
353
324
  var commonLayerProps = _objectSpread(_objectSpread({}, defaultLayerProps), {}, {
354
325
  parameters: {
355
326
  // circles will be flat on the map when the altitude column is not used
356
327
  depthTest: ((_this$config$columns$ = this.config.columns.altitude) === null || _this$config$columns$ === void 0 ? void 0 : _this$config$columns$.fieldIdx) > -1
357
328
  }
358
329
  });
359
-
360
330
  var customMarkersField = this.config.customMarkersField;
361
331
  var customMarkersConfigured = customMarkers && Boolean(customMarkersUrl || customMarkersField && customMarkersRange);
362
332
  var customMarkersMisConfigured = customMarkers && !customMarkersConfigured;
363
-
364
333
  if (customMarkersConfigured) {
365
334
  var maxIconSize = this.getMaxMarkerSize();
366
335
  var useMask = Boolean(this.config.visConfig.filled);
@@ -405,7 +374,6 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
405
374
  getColor: this.config.highlightColor
406
375
  }))] : []), (0, _toConsumableArray2["default"])(textLabelLayer));
407
376
  }
408
-
409
377
  var scatterPlotLayerProps = {
410
378
  stroked: this.config.visConfig.outline,
411
379
  filled: this.config.visConfig.filled,
@@ -431,26 +399,27 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
431
399
  key: "findDefaultLayerProps",
432
400
  value: function findDefaultLayerProps(_ref3) {
433
401
  var _ref3$fieldPairs = _ref3.fieldPairs,
434
- fieldPairs = _ref3$fieldPairs === void 0 ? [] : _ref3$fieldPairs;
435
- var props = []; // Make layer for each pair
402
+ fieldPairs = _ref3$fieldPairs === void 0 ? [] : _ref3$fieldPairs;
403
+ var props = [];
436
404
 
405
+ // Make layer for each pair
437
406
  fieldPairs.forEach(function (pair) {
438
407
  var latField = pair.pair.lat;
439
408
  var lngField = pair.pair.lng;
440
409
  var layerName = pair.defaultName;
441
410
  var prop = {
442
411
  label: layerName.length ? layerName : 'Point'
443
- }; // default layer color for begintrip and dropoff point
412
+ };
444
413
 
414
+ // default layer color for begintrip and dropoff point
445
415
  if (latField.value in _defaultSettings.DEFAULT_LAYER_COLOR) {
446
416
  prop.color = (0, _colorUtils.hexToRgb)(_defaultSettings.DEFAULT_LAYER_COLOR[latField.value]);
447
- } // set the first layer to be visible
448
-
417
+ }
449
418
 
419
+ // set the first layer to be visible
450
420
  if (props.length === 0) {
451
421
  prop.isVisible = true;
452
422
  }
453
-
454
423
  prop.columns = {
455
424
  lat: latField,
456
425
  lng: lngField,
@@ -469,6 +438,4 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
469
438
  }]);
470
439
  return PointLayer;
471
440
  }(_baseLayer["default"]);
472
-
473
- exports["default"] = PointLayer;
474
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcG9pbnQtbGF5ZXIvcG9pbnQtbGF5ZXIuanMiXSwibmFtZXMiOlsicG9pbnRQb3NBY2Nlc3NvciIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJwb2ludFJlcXVpcmVkQ29sdW1ucyIsInBvaW50T3B0aW9uYWxDb2x1bW5zIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImN1c3RvbU1hcmtlcnMiLCJjdXN0b21NYXJrZXJzVXJsIiwiY3VzdG9tTWFya2Vyc1JhbmdlIiwib3BhY2l0eSIsIm91dGxpbmUiLCJ0aGlja25lc3MiLCJzdHJva2VDb2xvciIsImNvbG9yUmFuZ2UiLCJzdHJva2VDb2xvclJhbmdlIiwicmFkaXVzUmFuZ2UiLCJmaWxsZWQiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJwcm9wZXJ0eSIsIlBvaW50TGF5ZXIiLCJwcm9wcyIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImRhdGFDb250YWluZXIiLCJjb25maWciLCJjb2x1bW5zIiwiUG9pbnRMYXllckljb24iLCJkZWZhdWx0UG9pbnRDb2x1bW5QYWlycyIsImNvbG9yIiwiYWNjZXNzb3IiLCJjb25kaXRpb24iLCJ2aXNDb25maWciLCJrZXkiLCJmaWVsZCIsInNjYWxlIiwiZG9tYWluIiwicmFuZ2UiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJzaXplIiwiZml4ZWQiLCJjdXN0b21NYXJrZXIiLCJzdXBwb3J0ZWRGaWVsZFR5cGVzIiwicm90YXRpb24iLCJpZGVudGl0eSIsIm51bGxWYWx1ZSIsInJvdGF0aW9uRmllbGQiLCJkYXRhc2V0IiwiZGVmYXVsdENvbG9yRmllbGQiLCJ1cGRhdGVMYXllckNvbmZpZyIsImNvbG9yRmllbGQiLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiY3VzdG9tTWFya2Vyc0ZpZWxkIiwiY3VzdG9tTWFya2Vyc1NjYWxlIiwiZ2V0UG9zaXRpb24iLCJmaWx0ZXJlZEluZGV4IiwiZGF0YSIsImkiLCJsZW5ndGgiLCJwb3MiLCJldmVyeSIsIk51bWJlciIsImlzRmluaXRlIiwicHVzaCIsInBvc2l0aW9uIiwiZGF0YXNldHMiLCJvbGRMYXllckRhdGEiLCJ0ZXh0TGFiZWwiLCJkYXRhSWQiLCJncHVGaWx0ZXIiLCJ1cGRhdGVEYXRhIiwidGV4dExhYmVscyIsImFjY2Vzc29ycyIsImdldEF0dHJpYnV0ZUFjY2Vzc29ycyIsImdldEZpbHRlclZhbHVlIiwiZmlsdGVyVmFsdWVBY2Nlc3NvciIsImJvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsInVwZGF0ZU1ldGEiLCJvYmplY3RJbmZvIiwicGlja2VkIiwibGF5ZXIiLCJpZCIsIm9wdHMiLCJvYmplY3RIb3ZlcmVkIiwiaW50ZXJhY3Rpb25Db25maWciLCJyYWRpdXNTY2FsZSIsImdldFJhZGl1c1NjYWxlIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJicnVzaGluZ1Byb3BzIiwiZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyIsImV4dGVuc2lvbnMiLCJ1cGRhdGVUcmlnZ2VycyIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMiLCJzaGFyZWRQcm9wcyIsImZpbHRlclJhbmdlIiwibWFza0lkIiwidmlzaWJsZSIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwidGV4dExhYmVsTGF5ZXIiLCJyZW5kZXJUZXh0TGFiZWxMYXllciIsImdldFJhZGl1cyIsImNvbW1vbkxheWVyUHJvcHMiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQiLCJCb29sZWFuIiwiY3VzdG9tTWFya2Vyc01pc0NvbmZpZ3VyZWQiLCJtYXhJY29uU2l6ZSIsImdldE1heE1hcmtlclNpemUiLCJ1c2VNYXNrIiwiaWNvbkxheWVyUHJvcHMiLCJnZXRJY29uIiwiZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yIiwiZ2V0SWNvblVybCIsImdldFNpemUiLCJnZXRBbmdsZSIsImdldFJvdGF0aW9uIiwic2l6ZVNjYWxlIiwic2l6ZVVuaXRzIiwibG9hZE9wdGlvbnMiLCJpbWFnZSIsImltYWdlYml0bWFwIiwicmVzaXplV2lkdGgiLCJyZXNpemVIZWlnaHQiLCJyZXNpemVRdWFsaXR5IiwiSWNvbkxheWVyIiwiZ2V0Q29sb3IiLCJnZXRGaWxsQ29sb3IiLCJVTktOT1dOX0NPTE9SIiwiZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcyIsImhpZ2hsaWdodENvbG9yIiwic2NhdHRlclBsb3RMYXllclByb3BzIiwic3Ryb2tlZCIsImxpbmVXaWR0aFNjYWxlIiwicmFkaXVzTWF4UGl4ZWxzIiwiU2NhdHRlcnBsb3RMYXllciIsInJhZGl1c1VuaXRzIiwibGluZVdpZHRoVW5pdHMiLCJnZXRMaW5lQ29sb3IiLCJmaWVsZFBhaXJzIiwiZm9yRWFjaCIsInBhaXIiLCJsYXRGaWVsZCIsImxuZ0ZpZWxkIiwibGF5ZXJOYW1lIiwiZGVmYXVsdE5hbWUiLCJwcm9wIiwidmFsdWUiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwiaXNWaXNpYmxlIiwib3B0aW9uYWwiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUI7QUFBQSxNQUFFQyxHQUFGLFFBQUVBLEdBQUY7QUFBQSxNQUFPQyxHQUFQLFFBQU9BLEdBQVA7QUFBQSxNQUFZQyxRQUFa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eUIsQ0FTekI7O0FBQ0EsWUFBSUYsUUFBUSxDQUFDSyxLQUFULElBQWtCQyxvQ0FBdEIsRUFBMkM7QUFDekNGLFVBQUFBLElBQUksQ0FBQzdILEtBQUwsR0FBYSwwQkFBUytILHFDQUFvQk4sUUFBUSxDQUFDSyxLQUE3QixDQUFULENBQWI7QUFDRCxTQVp3QixDQWN6Qjs7O0FBQ0EsWUFBSXRJLEtBQUssQ0FBQ3lDLE1BQU4sS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEI0RixVQUFBQSxJQUFJLENBQUNHLFNBQUwsR0FBaUIsSUFBakI7QUFDRDs7QUFFREgsUUFBQUEsSUFBSSxDQUFDaEksT0FBTCxHQUFlO0FBQ2JuQyxVQUFBQSxHQUFHLEVBQUUrSixRQURRO0FBRWI5SixVQUFBQSxHQUFHLEVBQUUrSixRQUZRO0FBR2I5SixVQUFBQSxRQUFRLEVBQUU7QUFBQ2tLLFlBQUFBLEtBQUssRUFBRSxJQUFSO0FBQWM3SixZQUFBQSxRQUFRLEVBQUUsQ0FBQyxDQUF6QjtBQUE0QmdLLFlBQUFBLFFBQVEsRUFBRTtBQUF0QztBQUhHLFNBQWY7QUFNQXpJLFFBQUFBLEtBQUssQ0FBQzhDLElBQU4sQ0FBV3VGLElBQVg7QUFDRCxPQTFCRDtBQTRCQSxhQUFPO0FBQUNySSxRQUFBQSxLQUFLLEVBQUxBO0FBQUQsT0FBUDtBQUNEOzs7RUExSXFDMEkscUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge0JydXNoaW5nRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7U2NhdHRlcnBsb3RMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcbmltcG9ydCB7SWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge25lZ2F0ZUFjY2Vzc29yfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge2ZpbmREZWZhdWx0Q29sb3JGaWVsZH0gZnJvbSAndXRpbHMvZGF0YXNldC11dGlscyc7XG5pbXBvcnQgUG9pbnRMYXllckljb24gZnJvbSAnLi9wb2ludC1sYXllci1pY29uJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9DT0xPUiwgQ0hBTk5FTF9TQ0FMRVMsIFVOS05PV05fQ09MT1J9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtmb3JtYXRUZXh0TGFiZWxEYXRhfSBmcm9tICcuLi9sYXllci10ZXh0LWxhYmVsJztcblxuZXhwb3J0IGNvbnN0IHBvaW50UG9zQWNjZXNzb3IgPSAoe2xhdCwgbG5nLCBhbHRpdHVkZX0pID0+IGRjID0+IGQgPT4gW1xuICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxuZy5maWVsZElkeCksXG4gIGRjLnZhbHVlQXQoZC5pbmRleCwgbGF0LmZpZWxkSWR4KSxcbiAgYWx0aXR1ZGUgJiYgYWx0aXR1ZGUuZmllbGRJZHggPiAtMSA/IGRjLnZhbHVlQXQoZC5pbmRleCwgYWx0aXR1ZGUuZmllbGRJZHgpIDogMFxuXTtcblxuZXhwb3J0IGNvbnN0IHBvaW50UmVxdWlyZWRDb2x1bW5zID0gWydsYXQnLCAnbG5nJ107XG5leHBvcnQgY29uc3QgcG9pbnRPcHRpb25hbENvbHVtbnMgPSBbJ2FsdGl0dWRlJ107XG5cbmNvbnN0IGJydXNoaW5nRXh0ZW5zaW9uID0gbmV3IEJydXNoaW5nRXh0ZW5zaW9uKCk7XG5cbmV4cG9ydCBjb25zdCBwb2ludFZpc0NvbmZpZ3MgPSB7XG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIGN1c3RvbU1hcmtlcnM6ICdjdXN0b21NYXJrZXJzJyxcbiAgY3VzdG9tTWFya2Vyc1VybDogJ2N1c3RvbU1hcmtlcnNVcmwnLFxuICBjdXN0b21NYXJrZXJzUmFuZ2U6ICdjdXN0b21NYXJrZXJzUmFuZ2UnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG91dGxpbmU6ICdvdXRsaW5lJyxcbiAgdGhpY2tuZXNzOiAndGhpY2tuZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcicsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJyxcbiAgZmlsbGVkOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGxhYmVsOiAnbGF5ZXIuZmlsbENvbG9yJyxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgcHJvcGVydHk6ICdmaWxsZWQnXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhwb2ludFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IGRhdGFDb250YWluZXIgPT5cbiAgICAgIHBvaW50UG9zQWNjZXNzb3IodGhpcy5jb25maWcuY29sdW1ucykoZGF0YUNvbnRhaW5lcik7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3BvaW50JztcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gUG9pbnRMYXllckljb247XG4gIH1cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBwb2ludFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHBvaW50T3B0aW9uYWxDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcywgJ3JhZGl1cyddO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmZpbGxlZCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGtleTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdzdHJva2VDb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzdHJva2VDb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc3Ryb2tlQ29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRMaW5lQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3IgfHwgY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3JhZGl1cycsXG4gICAgICAgIHJhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAncmFkaXVzJyxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRSYWRpdXMnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDFcbiAgICAgIH0sXG4gICAgICBjdXN0b21NYXJrZXJzOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY3VzdG9tTWFya2VycycsXG4gICAgICAgIGtleTogJ2N1c3RvbU1hcmtlcnMnLFxuICAgICAgICBmaWVsZDogJ2N1c3RvbU1hcmtlcnNGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY3VzdG9tTWFya2Vyc1NjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnY3VzdG9tTWFya2Vyc0RvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY3VzdG9tTWFya2Vyc1JhbmdlJyxcbiAgICAgICAgZml4ZWQ6ICdjdXN0b21NYXJrZXJzVXJsJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldEljb25VcmwnLFxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzOiBbJ3N0cmluZyddLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmwsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuY3VzdG9tTWFya2Vyc1xuICAgICAgfSxcbiAgICAgIHJvdGF0aW9uOiB7XG4gICAgICAgIHByb3BlcnR5OiAncm90YXRpb24nLFxuICAgICAgICBrZXk6ICdyb3RhdGlvbicsXG4gICAgICAgIGZpZWxkOiAncm90YXRpb25GaWVsZCcsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5LFxuICAgICAgICBhY2Nlc3NvcjogJ2dldFJvdGF0aW9uJyxcbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlczogWydmbG9hdCcsICdpbnRlZ2VyJywgJ3JlYWwnLCAnbnVtYmVyJ10sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gMCxcbiAgICAgICAgbnVsbFZhbHVlOiAwLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcucm90YXRpb25GaWVsZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldCkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2xvckZpZWxkID0gZmluZERlZmF1bHRDb2xvckZpZWxkKGRhdGFzZXQpO1xuXG4gICAgaWYgKGRlZmF1bHRDb2xvckZpZWxkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgY29sb3JGaWVsZDogZGVmYXVsdENvbG9yRmllbGRcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgJ2NvbG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW119KSB7XG4gICAgY29uc3QgcHJvcHMgPSBbXTtcblxuICAgIC8vIE1ha2UgbGF5ZXIgZm9yIGVhY2ggcGFpclxuICAgIGZpZWxkUGFpcnMuZm9yRWFjaChwYWlyID0+IHtcbiAgICAgIGNvbnN0IGxhdEZpZWxkID0gcGFpci5wYWlyLmxhdDtcbiAgICAgIGNvbnN0IGxuZ0ZpZWxkID0gcGFpci5wYWlyLmxuZztcbiAgICAgIGNvbnN0IGxheWVyTmFtZSA9IHBhaXIuZGVmYXVsdE5hbWU7XG5cbiAgICAgIGNvbnN0IHByb3AgPSB7XG4gICAgICAgIGxhYmVsOiBsYXllck5hbWUubGVuZ3RoID8gbGF5ZXJOYW1lIDogJ1BvaW50J1xuICAgICAgfTtcblxuICAgICAgLy8gZGVmYXVsdCBsYXllciBjb2xvciBmb3IgYmVnaW50cmlwIGFuZCBkcm9wb2ZmIHBvaW50XG4gICAgICBpZiAobGF0RmllbGQudmFsdWUgaW4gREVGQVVMVF9MQVlFUl9DT0xPUikge1xuICAgICAgICBwcm9wLmNvbG9yID0gaGV4VG9SZ2IoREVGQVVMVF9MQVlFUl9DT0xPUltsYXRGaWVsZC52YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGZpcnN0IGxheWVyIHRvIGJlIHZpc2libGVcbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvcC5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9wLmNvbHVtbnMgPSB7XG4gICAgICAgIGxhdDogbGF0RmllbGQsXG4gICAgICAgIGxuZzogbG5nRmllbGQsXG4gICAgICAgIGFsdGl0dWRlOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9O1xuXG4gICAgICBwcm9wcy5wdXNoKHByb3ApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtwcm9wc307XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMpLFxuXG4gICAgICAvLyBhZGQgc3Ryb2tlIGNvbG9yIHZpc3VhbCBjaGFubmVsXG4gICAgICBzdHJva2VDb2xvckZpZWxkOiBudWxsLFxuICAgICAgc3Ryb2tlQ29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdxdWFudGlsZScsXG5cbiAgICAgIGN1c3RvbU1hcmtlcnNGaWVsZDogbnVsbCxcbiAgICAgIGN1c3RvbU1hcmtlcnNTY2FsZTogJ29yZGluYWwnXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoe2ZpbHRlcmVkSW5kZXh9LCBnZXRQb3NpdGlvbikge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJlZEluZGV4W2ldO1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2luZGV4fSk7XG5cbiAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBwb2ludFxuICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPSBudWxsXG4gICAgICBpZiAocG9zLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgY29uc3Qge3RleHRMYWJlbH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7Z3B1RmlsdGVyLCBkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF07XG4gICAgY29uc3Qge2RhdGF9ID0gdGhpcy51cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuXG4gICAgLy8gZ2V0IGFsbCBkaXN0aW5jdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0IGxhYmVsc1xuICAgIGNvbnN0IHRleHRMYWJlbHMgPSBmb3JtYXRUZXh0TGFiZWxEYXRhKHt0ZXh0TGFiZWwsIGRhdGFDb250YWluZXJ9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IHRoaXMuZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQ29udGFpbmVyfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZUFjY2Vzc29yKGRhdGFDb250YWluZXIpKCksXG4gICAgICB0ZXh0TGFiZWxzLFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lcikge1xuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykge1xuICAgIHJldHVybiAoXG4gICAgICAob2JqZWN0SW5mbz8ucGlja2VkICYmIG9iamVjdEluZm8/LmxheWVyPy5wcm9wcz8uaWQgPT09IHRoaXMuaWQpIHx8XG4gICAgICBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSBgJHt0aGlzLmlkfS1pY29uYFxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eSwgbWF4LXN0YXRlbWVudHNcbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHtkYXRhLCBncHVGaWx0ZXIsIG9iamVjdEhvdmVyZWQsIGludGVyYWN0aW9uQ29uZmlnfSA9IG9wdHM7XG4gICAgY29uc3Qge2N1c3RvbU1hcmtlcnMsIGN1c3RvbU1hcmtlcnNVcmwsIGN1c3RvbU1hcmtlcnNSYW5nZX0gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICBjb25zdCByYWRpdXNTY2FsZSA9IHRoaXMuZ2V0UmFkaXVzU2NhbGUoKTtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG4gICAgY29uc3QgYnJ1c2hpbmdQcm9wcyA9IHRoaXMuZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsuLi5kZWZhdWx0TGF5ZXJQcm9wcy5leHRlbnNpb25zLCBicnVzaGluZ0V4dGVuc2lvbl07XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgLi4udGhpcy5nZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKVxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZWRQcm9wcyA9IHtcbiAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIGZpbHRlclJhbmdlOiBkZWZhdWx0TGF5ZXJQcm9wcy5maWx0ZXJSYW5nZSxcbiAgICAgIG1hc2tJZDogZGVmYXVsdExheWVyUHJvcHMubWFza0lkLFxuICAgICAgdmlzaWJsZTogZGVmYXVsdExheWVyUHJvcHMudmlzaWJsZSxcbiAgICAgIC4uLmJydXNoaW5nUHJvcHNcbiAgICB9O1xuICAgIGNvbnN0IGhvdmVyZWRPYmplY3QgPSB0aGlzLmhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SG92ZXJlZCk7XG5cbiAgICBjb25zdCB0ZXh0TGFiZWxMYXllciA9IHRoaXMucmVuZGVyVGV4dExhYmVsTGF5ZXIoXG4gICAgICB7XG4gICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICBzaGFyZWRQcm9wcyxcbiAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyBzY2FsaW5nIGJ5IGhhbGYgaGVyZSBhbmQgZWxzZXdoZXJlXG4gICAgICAgIHJhZGl1c1NjYWxlOiBjdXN0b21NYXJrZXJzID8gcmFkaXVzU2NhbGUgLyAyIDogcmFkaXVzU2NhbGUsXG4gICAgICAgIGdldFJhZGl1czogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgICB9LFxuICAgICAgb3B0c1xuICAgICk7XG4gICAgY29uc3QgY29tbW9uTGF5ZXJQcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHRMYXllclByb3BzLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAvLyBjaXJjbGVzIHdpbGwgYmUgZmxhdCBvbiB0aGUgbWFwIHdoZW4gdGhlIGFsdGl0dWRlIGNvbHVtbiBpcyBub3QgdXNlZFxuICAgICAgICBkZXB0aFRlc3Q6IHRoaXMuY29uZmlnLmNvbHVtbnMuYWx0aXR1ZGU/LmZpZWxkSWR4ID4gLTFcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY3VzdG9tTWFya2Vyc0ZpZWxkID0gdGhpcy5jb25maWcuY3VzdG9tTWFya2Vyc0ZpZWxkO1xuICAgIGNvbnN0IGN1c3RvbU1hcmtlcnNDb25maWd1cmVkID1cbiAgICAgIGN1c3RvbU1hcmtlcnMgJiYgQm9vbGVhbihjdXN0b21NYXJrZXJzVXJsIHx8IChjdXN0b21NYXJrZXJzRmllbGQgJiYgY3VzdG9tTWFya2Vyc1JhbmdlKSk7XG4gICAgY29uc3QgY3VzdG9tTWFya2Vyc01pc0NvbmZpZ3VyZWQgPSBjdXN0b21NYXJrZXJzICYmICFjdXN0b21NYXJrZXJzQ29uZmlndXJlZDtcblxuICAgIGlmIChjdXN0b21NYXJrZXJzQ29uZmlndXJlZCkge1xuICAgICAgY29uc3QgbWF4SWNvblNpemUgPSB0aGlzLmdldE1heE1hcmtlclNpemUoKTtcbiAgICAgIGNvbnN0IHVzZU1hc2sgPSBCb29sZWFuKHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQpO1xuICAgICAgY29uc3QgaWNvbkxheWVyUHJvcHMgPSB7XG4gICAgICAgIGdldEljb246IHRoaXMuZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yKGRhdGEuZ2V0SWNvblVybCwgdXNlTWFzayksXG4gICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICBnZXRTaXplOiBkYXRhLmdldFJhZGl1cyxcbiAgICAgICAgZ2V0QW5nbGU6IG5lZ2F0ZUFjY2Vzc29yKGRhdGEuZ2V0Um90YXRpb24pLFxuICAgICAgICBzaXplU2NhbGU6IHJhZGl1c1NjYWxlLFxuICAgICAgICBzaXplVW5pdHM6ICdwaXhlbHMnLFxuICAgICAgICBsb2FkT3B0aW9uczoge1xuICAgICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2ViaXRtYXAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbWFnZWJpdG1hcDoge1xuICAgICAgICAgICAgcmVzaXplV2lkdGg6IG1heEljb25TaXplLFxuICAgICAgICAgICAgcmVzaXplSGVpZ2h0OiBtYXhJY29uU2l6ZSxcbiAgICAgICAgICAgIHJlc2l6ZVF1YWxpdHk6ICdoaWdoJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IEljb25MYXllcih7XG4gICAgICAgICAgLi4uY29tbW9uTGF5ZXJQcm9wcyxcbiAgICAgICAgICAuLi5pY29uTGF5ZXJQcm9wcyxcbiAgICAgICAgICBpZDogYCR7ZGVmYXVsdExheWVyUHJvcHMuaWR9LWljb25gLFxuICAgICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgICBnZXRDb2xvcjogdGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZCA/IGRhdGEuZ2V0RmlsbENvbG9yIDogVU5LTk9XTl9DT0xPUixcbiAgICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgICAgZ2V0RmlsdGVyVmFsdWU6IHVwZGF0ZVRyaWdnZXJzLmdldEZpbHRlclZhbHVlLFxuICAgICAgICAgICAgZ2V0Q29sb3I6IHsuLi51cGRhdGVUcmlnZ2Vycy5nZXRGaWxsQ29sb3IsIGZpbGxlZDogdGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZH0sXG4gICAgICAgICAgICBnZXRJY29uOiB7Li4udXBkYXRlVHJpZ2dlcnMuZ2V0SWNvblVybCwgbWF4SWNvblNpemUsIHVzZU1hc2t9LFxuICAgICAgICAgICAgZ2V0U2l6ZTogdXBkYXRlVHJpZ2dlcnMuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgZ2V0QW5nbGU6IHVwZGF0ZVRyaWdnZXJzLmdldFJvdGF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uKGhvdmVyZWRPYmplY3RcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgbmV3IEljb25MYXllcih7XG4gICAgICAgICAgICAgICAgLi4uaWNvbkxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCksXG4gICAgICAgICAgICAgICAgaWQ6IGAke2RlZmF1bHRMYXllclByb3BzLmlkfS1pY29uLWhvdmVyZWRgLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtob3ZlcmVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgICBnZXRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3JcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4udGV4dExhYmVsTGF5ZXJcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhdHRlclBsb3RMYXllclByb3BzID0ge1xuICAgICAgc3Ryb2tlZDogdGhpcy5jb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICBmaWxsZWQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQsXG4gICAgICBsaW5lV2lkdGhTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcbiAgICAgIC8vIFRPRE86IGludmVudCBiZXR0ZXIgd2F5IHRvIHJlbmRlciBzb21ldGhpbmcgd2hlbiBjdXN0b21NYXJrZXJzIGFyZSBub3QgeWV0IGNvbmZpZ3VyZWRcbiAgICAgIHJhZGl1c1NjYWxlOiBjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCA/IHJhZGl1c1NjYWxlIC8gMiA6IHJhZGl1c1NjYWxlLFxuICAgICAgcmFkaXVzTWF4UGl4ZWxzOiA1MDBcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTY2F0dGVycGxvdExheWVyKHtcbiAgICAgICAgLi4uYnJ1c2hpbmdQcm9wcyxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uY29tbW9uTGF5ZXJQcm9wcyxcbiAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICByYWRpdXNVbml0czogJ3BpeGVscycsXG4gICAgICAgIGxpbmVXaWR0aFVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICAgIH0pLFxuICAgICAgLy8gaG92ZXIgbGF5ZXJcbiAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSxcbiAgICAgICAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICAgICAgICBkYXRhOiBbaG92ZXJlZE9iamVjdF0sXG4gICAgICAgICAgICAgIGdldExpbmVDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldFJhZGl1czogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSksXG4gICAgICAvLyB0ZXh0IGxhYmVsIGxheWVyXG4gICAgICAuLi50ZXh0TGFiZWxMYXllclxuICAgIF07XG4gIH1cbn1cbiJdfQ==
441
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0ZW5zaW9ucyIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiX2Jhc2VMYXllciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29sb3JVdGlscyIsIl9sYXllclV0aWxzIiwiX2RhdGFzZXRVdGlscyIsIl9wb2ludExheWVySWNvbiIsIl9kZWZhdWx0U2V0dGluZ3MiLCJfbGF5ZXJUZXh0TGFiZWwiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsInBvaW50UG9zQWNjZXNzb3IiLCJleHBvcnRzIiwiX3JlZiIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJwb2ludFJlcXVpcmVkQ29sdW1ucyIsInBvaW50T3B0aW9uYWxDb2x1bW5zIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImN1c3RvbU1hcmtlcnMiLCJjdXN0b21NYXJrZXJzVXJsIiwiY3VzdG9tTWFya2Vyc1JhbmdlIiwib3BhY2l0eSIsIm91dGxpbmUiLCJ0aGlja25lc3MiLCJzdHJva2VDb2xvciIsImNvbG9yUmFuZ2UiLCJzdHJva2VDb2xvclJhbmdlIiwicmFkaXVzUmFuZ2UiLCJmaWxsZWQiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJwcm9wZXJ0eSIsIlBvaW50TGF5ZXIiLCJfTGF5ZXIiLCJfaW5oZXJpdHMyIiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJkYXRhQ29udGFpbmVyIiwiY29uZmlnIiwiY29sdW1ucyIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJQb2ludExheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIl9nZXQyIiwiY29sb3IiLCJhY2Nlc3NvciIsImNvbmRpdGlvbiIsInZpc0NvbmZpZyIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInNpemUiLCJmaXhlZCIsImN1c3RvbU1hcmtlciIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJyb3RhdGlvbiIsImlkZW50aXR5IiwibnVsbFZhbHVlIiwicm90YXRpb25GaWVsZCIsInZhbHVlIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwiZGF0YXNldCIsImRlZmF1bHRDb2xvckZpZWxkIiwiZmluZERlZmF1bHRDb2xvckZpZWxkIiwidXBkYXRlTGF5ZXJDb25maWciLCJjb2xvckZpZWxkIiwidXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsIiwiZ2V0RGVmYXVsdExheWVyQ29uZmlnIiwidW5kZWZpbmVkIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JTY2FsZSIsImN1c3RvbU1hcmtlcnNGaWVsZCIsImN1c3RvbU1hcmtlcnNTY2FsZSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJfcmVmMiIsImdldFBvc2l0aW9uIiwiZmlsdGVyZWRJbmRleCIsImRhdGEiLCJpIiwicG9zIiwiZXZlcnkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInBvc2l0aW9uIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZGF0YXNldHMiLCJvbGRMYXllckRhdGEiLCJ0ZXh0TGFiZWwiLCJfZGF0YXNldHMkdGhpcyRjb25maWciLCJkYXRhSWQiLCJncHVGaWx0ZXIiLCJfdGhpcyR1cGRhdGVEYXRhIiwidXBkYXRlRGF0YSIsInRleHRMYWJlbHMiLCJmb3JtYXRUZXh0TGFiZWxEYXRhIiwiYWNjZXNzb3JzIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiZ2V0RmlsdGVyVmFsdWUiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwidXBkYXRlTGF5ZXJNZXRhIiwiYm91bmRzIiwiZ2V0UG9pbnRzQm91bmRzIiwidXBkYXRlTWV0YSIsImlzTGF5ZXJIb3ZlcmVkIiwib2JqZWN0SW5mbyIsIl9vYmplY3RJbmZvJGxheWVyIiwiX29iamVjdEluZm8kbGF5ZXIkcHJvIiwiX29iamVjdEluZm8kbGF5ZXIyIiwiX29iamVjdEluZm8kbGF5ZXIyJHByIiwicGlja2VkIiwibGF5ZXIiLCJpZCIsInJlbmRlckxheWVyIiwib3B0cyIsIl90aGlzJGNvbmZpZyRjb2x1bW5zJCIsIm9iamVjdEhvdmVyZWQiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIl90aGlzJGNvbmZpZyR2aXNDb25maSIsInJhZGl1c1NjYWxlIiwiZ2V0UmFkaXVzU2NhbGUiLCJkZWZhdWx0TGF5ZXJQcm9wcyIsImdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyIsImJydXNoaW5nUHJvcHMiLCJnZXRCcnVzaGluZ0V4dGVuc2lvblByb3BzIiwiZXh0ZW5zaW9ucyIsInVwZGF0ZVRyaWdnZXJzIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsInNoYXJlZFByb3BzIiwiZmlsdGVyUmFuZ2UiLCJtYXNrSWQiLCJ2aXNpYmxlIiwiaG92ZXJlZE9iamVjdCIsImhhc0hvdmVyZWRPYmplY3QiLCJ0ZXh0TGFiZWxMYXllciIsInJlbmRlclRleHRMYWJlbExheWVyIiwiZ2V0UmFkaXVzIiwiY29tbW9uTGF5ZXJQcm9wcyIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJjdXN0b21NYXJrZXJzQ29uZmlndXJlZCIsImN1c3RvbU1hcmtlcnNNaXNDb25maWd1cmVkIiwibWF4SWNvblNpemUiLCJnZXRNYXhNYXJrZXJTaXplIiwidXNlTWFzayIsImljb25MYXllclByb3BzIiwiZ2V0SWNvbiIsImdldEN1c3RvbU1hcmtlckljb25BY2Nlc3NvciIsImdldEljb25VcmwiLCJnZXRTaXplIiwiZ2V0QW5nbGUiLCJuZWdhdGVBY2Nlc3NvciIsImdldFJvdGF0aW9uIiwic2l6ZVNjYWxlIiwic2l6ZVVuaXRzIiwibG9hZE9wdGlvbnMiLCJpbWFnZSIsImltYWdlYml0bWFwIiwicmVzaXplV2lkdGgiLCJyZXNpemVIZWlnaHQiLCJyZXNpemVRdWFsaXR5IiwiSWNvbkxheWVyIiwiZ2V0Q29sb3IiLCJnZXRGaWxsQ29sb3IiLCJVTktOT1dOX0NPTE9SIiwiZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcyIsImhpZ2hsaWdodENvbG9yIiwic2NhdHRlclBsb3RMYXllclByb3BzIiwic3Ryb2tlZCIsImxpbmVXaWR0aFNjYWxlIiwicmFkaXVzTWF4UGl4ZWxzIiwiU2NhdHRlcnBsb3RMYXllciIsInJhZGl1c1VuaXRzIiwibGluZVdpZHRoVW5pdHMiLCJnZXRMaW5lQ29sb3IiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJfcmVmMyIsIl9yZWYzJGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwicGFpciIsImxhdEZpZWxkIiwibG5nRmllbGQiLCJsYXllck5hbWUiLCJkZWZhdWx0TmFtZSIsInByb3AiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwiaGV4VG9SZ2IiLCJpc1Zpc2libGUiLCJvcHRpb25hbCIsIkxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xheWVycy9wb2ludC1sYXllci9wb2ludC1sYXllci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge0JydXNoaW5nRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7U2NhdHRlcnBsb3RMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcbmltcG9ydCB7SWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge25lZ2F0ZUFjY2Vzc29yfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge2ZpbmREZWZhdWx0Q29sb3JGaWVsZH0gZnJvbSAndXRpbHMvZGF0YXNldC11dGlscyc7XG5pbXBvcnQgUG9pbnRMYXllckljb24gZnJvbSAnLi9wb2ludC1sYXllci1pY29uJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9DT0xPUiwgQ0hBTk5FTF9TQ0FMRVMsIFVOS05PV05fQ09MT1J9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtmb3JtYXRUZXh0TGFiZWxEYXRhfSBmcm9tICcuLi9sYXllci10ZXh0LWxhYmVsJztcblxuZXhwb3J0IGNvbnN0IHBvaW50UG9zQWNjZXNzb3IgPSAoe2xhdCwgbG5nLCBhbHRpdHVkZX0pID0+IGRjID0+IGQgPT4gW1xuICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxuZy5maWVsZElkeCksXG4gIGRjLnZhbHVlQXQoZC5pbmRleCwgbGF0LmZpZWxkSWR4KSxcbiAgYWx0aXR1ZGUgJiYgYWx0aXR1ZGUuZmllbGRJZHggPiAtMSA/IGRjLnZhbHVlQXQoZC5pbmRleCwgYWx0aXR1ZGUuZmllbGRJZHgpIDogMFxuXTtcblxuZXhwb3J0IGNvbnN0IHBvaW50UmVxdWlyZWRDb2x1bW5zID0gWydsYXQnLCAnbG5nJ107XG5leHBvcnQgY29uc3QgcG9pbnRPcHRpb25hbENvbHVtbnMgPSBbJ2FsdGl0dWRlJ107XG5cbmNvbnN0IGJydXNoaW5nRXh0ZW5zaW9uID0gbmV3IEJydXNoaW5nRXh0ZW5zaW9uKCk7XG5cbmV4cG9ydCBjb25zdCBwb2ludFZpc0NvbmZpZ3MgPSB7XG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIGN1c3RvbU1hcmtlcnM6ICdjdXN0b21NYXJrZXJzJyxcbiAgY3VzdG9tTWFya2Vyc1VybDogJ2N1c3RvbU1hcmtlcnNVcmwnLFxuICBjdXN0b21NYXJrZXJzUmFuZ2U6ICdjdXN0b21NYXJrZXJzUmFuZ2UnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG91dGxpbmU6ICdvdXRsaW5lJyxcbiAgdGhpY2tuZXNzOiAndGhpY2tuZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcicsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJyxcbiAgZmlsbGVkOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGxhYmVsOiAnbGF5ZXIuZmlsbENvbG9yJyxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgcHJvcGVydHk6ICdmaWxsZWQnXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhwb2ludFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IGRhdGFDb250YWluZXIgPT5cbiAgICAgIHBvaW50UG9zQWNjZXNzb3IodGhpcy5jb25maWcuY29sdW1ucykoZGF0YUNvbnRhaW5lcik7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3BvaW50JztcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gUG9pbnRMYXllckljb247XG4gIH1cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBwb2ludFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHBvaW50T3B0aW9uYWxDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcywgJ3JhZGl1cyddO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmZpbGxlZCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGtleTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdzdHJva2VDb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzdHJva2VDb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc3Ryb2tlQ29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRMaW5lQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3IgfHwgY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3JhZGl1cycsXG4gICAgICAgIHJhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAncmFkaXVzJyxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRSYWRpdXMnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDFcbiAgICAgIH0sXG4gICAgICBjdXN0b21NYXJrZXJzOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY3VzdG9tTWFya2VycycsXG4gICAgICAgIGtleTogJ2N1c3RvbU1hcmtlcnMnLFxuICAgICAgICBmaWVsZDogJ2N1c3RvbU1hcmtlcnNGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY3VzdG9tTWFya2Vyc1NjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnY3VzdG9tTWFya2Vyc0RvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY3VzdG9tTWFya2Vyc1JhbmdlJyxcbiAgICAgICAgZml4ZWQ6ICdjdXN0b21NYXJrZXJzVXJsJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldEljb25VcmwnLFxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzOiBbJ3N0cmluZyddLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmwsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuY3VzdG9tTWFya2Vyc1xuICAgICAgfSxcbiAgICAgIHJvdGF0aW9uOiB7XG4gICAgICAgIHByb3BlcnR5OiAncm90YXRpb24nLFxuICAgICAgICBrZXk6ICdyb3RhdGlvbicsXG4gICAgICAgIGZpZWxkOiAncm90YXRpb25GaWVsZCcsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5LFxuICAgICAgICBhY2Nlc3NvcjogJ2dldFJvdGF0aW9uJyxcbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlczogWydmbG9hdCcsICdpbnRlZ2VyJywgJ3JlYWwnLCAnbnVtYmVyJ10sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gMCxcbiAgICAgICAgbnVsbFZhbHVlOiAwLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcucm90YXRpb25GaWVsZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldCkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2xvckZpZWxkID0gZmluZERlZmF1bHRDb2xvckZpZWxkKGRhdGFzZXQpO1xuXG4gICAgaWYgKGRlZmF1bHRDb2xvckZpZWxkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgY29sb3JGaWVsZDogZGVmYXVsdENvbG9yRmllbGRcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgJ2NvbG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW119KSB7XG4gICAgY29uc3QgcHJvcHMgPSBbXTtcblxuICAgIC8vIE1ha2UgbGF5ZXIgZm9yIGVhY2ggcGFpclxuICAgIGZpZWxkUGFpcnMuZm9yRWFjaChwYWlyID0+IHtcbiAgICAgIGNvbnN0IGxhdEZpZWxkID0gcGFpci5wYWlyLmxhdDtcbiAgICAgIGNvbnN0IGxuZ0ZpZWxkID0gcGFpci5wYWlyLmxuZztcbiAgICAgIGNvbnN0IGxheWVyTmFtZSA9IHBhaXIuZGVmYXVsdE5hbWU7XG5cbiAgICAgIGNvbnN0IHByb3AgPSB7XG4gICAgICAgIGxhYmVsOiBsYXllck5hbWUubGVuZ3RoID8gbGF5ZXJOYW1lIDogJ1BvaW50J1xuICAgICAgfTtcblxuICAgICAgLy8gZGVmYXVsdCBsYXllciBjb2xvciBmb3IgYmVnaW50cmlwIGFuZCBkcm9wb2ZmIHBvaW50XG4gICAgICBpZiAobGF0RmllbGQudmFsdWUgaW4gREVGQVVMVF9MQVlFUl9DT0xPUikge1xuICAgICAgICBwcm9wLmNvbG9yID0gaGV4VG9SZ2IoREVGQVVMVF9MQVlFUl9DT0xPUltsYXRGaWVsZC52YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGZpcnN0IGxheWVyIHRvIGJlIHZpc2libGVcbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvcC5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9wLmNvbHVtbnMgPSB7XG4gICAgICAgIGxhdDogbGF0RmllbGQsXG4gICAgICAgIGxuZzogbG5nRmllbGQsXG4gICAgICAgIGFsdGl0dWRlOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9O1xuXG4gICAgICBwcm9wcy5wdXNoKHByb3ApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtwcm9wc307XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMpLFxuXG4gICAgICAvLyBhZGQgc3Ryb2tlIGNvbG9yIHZpc3VhbCBjaGFubmVsXG4gICAgICBzdHJva2VDb2xvckZpZWxkOiBudWxsLFxuICAgICAgc3Ryb2tlQ29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdxdWFudGlsZScsXG5cbiAgICAgIGN1c3RvbU1hcmtlcnNGaWVsZDogbnVsbCxcbiAgICAgIGN1c3RvbU1hcmtlcnNTY2FsZTogJ29yZGluYWwnXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoe2ZpbHRlcmVkSW5kZXh9LCBnZXRQb3NpdGlvbikge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJlZEluZGV4W2ldO1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2luZGV4fSk7XG5cbiAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBwb2ludFxuICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPSBudWxsXG4gICAgICBpZiAocG9zLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgY29uc3Qge3RleHRMYWJlbH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7Z3B1RmlsdGVyLCBkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF07XG4gICAgY29uc3Qge2RhdGF9ID0gdGhpcy51cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuXG4gICAgLy8gZ2V0IGFsbCBkaXN0aW5jdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0IGxhYmVsc1xuICAgIGNvbnN0IHRleHRMYWJlbHMgPSBmb3JtYXRUZXh0TGFiZWxEYXRhKHt0ZXh0TGFiZWwsIGRhdGFDb250YWluZXJ9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IHRoaXMuZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQ29udGFpbmVyfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YSxcbiAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZUFjY2Vzc29yKGRhdGFDb250YWluZXIpKCksXG4gICAgICB0ZXh0TGFiZWxzLFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cblxuICB1cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lcikge1xuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yKGRhdGFDb250YWluZXIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykge1xuICAgIHJldHVybiAoXG4gICAgICAob2JqZWN0SW5mbz8ucGlja2VkICYmIG9iamVjdEluZm8/LmxheWVyPy5wcm9wcz8uaWQgPT09IHRoaXMuaWQpIHx8XG4gICAgICBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSBgJHt0aGlzLmlkfS1pY29uYFxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eSwgbWF4LXN0YXRlbWVudHNcbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHtkYXRhLCBncHVGaWx0ZXIsIG9iamVjdEhvdmVyZWQsIGludGVyYWN0aW9uQ29uZmlnfSA9IG9wdHM7XG4gICAgY29uc3Qge2N1c3RvbU1hcmtlcnMsIGN1c3RvbU1hcmtlcnNVcmwsIGN1c3RvbU1hcmtlcnNSYW5nZX0gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICBjb25zdCByYWRpdXNTY2FsZSA9IHRoaXMuZ2V0UmFkaXVzU2NhbGUoKTtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG4gICAgY29uc3QgYnJ1c2hpbmdQcm9wcyA9IHRoaXMuZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsuLi5kZWZhdWx0TGF5ZXJQcm9wcy5leHRlbnNpb25zLCBicnVzaGluZ0V4dGVuc2lvbl07XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgLi4udGhpcy5nZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKVxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZWRQcm9wcyA9IHtcbiAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIGZpbHRlclJhbmdlOiBkZWZhdWx0TGF5ZXJQcm9wcy5maWx0ZXJSYW5nZSxcbiAgICAgIG1hc2tJZDogZGVmYXVsdExheWVyUHJvcHMubWFza0lkLFxuICAgICAgdmlzaWJsZTogZGVmYXVsdExheWVyUHJvcHMudmlzaWJsZSxcbiAgICAgIC4uLmJydXNoaW5nUHJvcHNcbiAgICB9O1xuICAgIGNvbnN0IGhvdmVyZWRPYmplY3QgPSB0aGlzLmhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SG92ZXJlZCk7XG5cbiAgICBjb25zdCB0ZXh0TGFiZWxMYXllciA9IHRoaXMucmVuZGVyVGV4dExhYmVsTGF5ZXIoXG4gICAgICB7XG4gICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICBzaGFyZWRQcm9wcyxcbiAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyBzY2FsaW5nIGJ5IGhhbGYgaGVyZSBhbmQgZWxzZXdoZXJlXG4gICAgICAgIHJhZGl1c1NjYWxlOiBjdXN0b21NYXJrZXJzID8gcmFkaXVzU2NhbGUgLyAyIDogcmFkaXVzU2NhbGUsXG4gICAgICAgIGdldFJhZGl1czogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgICB9LFxuICAgICAgb3B0c1xuICAgICk7XG4gICAgY29uc3QgY29tbW9uTGF5ZXJQcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHRMYXllclByb3BzLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAvLyBjaXJjbGVzIHdpbGwgYmUgZmxhdCBvbiB0aGUgbWFwIHdoZW4gdGhlIGFsdGl0dWRlIGNvbHVtbiBpcyBub3QgdXNlZFxuICAgICAgICBkZXB0aFRlc3Q6IHRoaXMuY29uZmlnLmNvbHVtbnMuYWx0aXR1ZGU/LmZpZWxkSWR4ID4gLTFcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY3VzdG9tTWFya2Vyc0ZpZWxkID0gdGhpcy5jb25maWcuY3VzdG9tTWFya2Vyc0ZpZWxkO1xuICAgIGNvbnN0IGN1c3RvbU1hcmtlcnNDb25maWd1cmVkID1cbiAgICAgIGN1c3RvbU1hcmtlcnMgJiYgQm9vbGVhbihjdXN0b21NYXJrZXJzVXJsIHx8IChjdXN0b21NYXJrZXJzRmllbGQgJiYgY3VzdG9tTWFya2Vyc1JhbmdlKSk7XG4gICAgY29uc3QgY3VzdG9tTWFya2Vyc01pc0NvbmZpZ3VyZWQgPSBjdXN0b21NYXJrZXJzICYmICFjdXN0b21NYXJrZXJzQ29uZmlndXJlZDtcblxuICAgIGlmIChjdXN0b21NYXJrZXJzQ29uZmlndXJlZCkge1xuICAgICAgY29uc3QgbWF4SWNvblNpemUgPSB0aGlzLmdldE1heE1hcmtlclNpemUoKTtcbiAgICAgIGNvbnN0IHVzZU1hc2sgPSBCb29sZWFuKHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQpO1xuICAgICAgY29uc3QgaWNvbkxheWVyUHJvcHMgPSB7XG4gICAgICAgIGdldEljb246IHRoaXMuZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yKGRhdGEuZ2V0SWNvblVybCwgdXNlTWFzayksXG4gICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uLFxuICAgICAgICBnZXRTaXplOiBkYXRhLmdldFJhZGl1cyxcbiAgICAgICAgZ2V0QW5nbGU6IG5lZ2F0ZUFjY2Vzc29yKGRhdGEuZ2V0Um90YXRpb24pLFxuICAgICAgICBzaXplU2NhbGU6IHJhZGl1c1NjYWxlLFxuICAgICAgICBzaXplVW5pdHM6ICdwaXhlbHMnLFxuICAgICAgICBsb2FkT3B0aW9uczoge1xuICAgICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2ViaXRtYXAnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbWFnZWJpdG1hcDoge1xuICAgICAgICAgICAgcmVzaXplV2lkdGg6IG1heEljb25TaXplLFxuICAgICAgICAgICAgcmVzaXplSGVpZ2h0OiBtYXhJY29uU2l6ZSxcbiAgICAgICAgICAgIHJlc2l6ZVF1YWxpdHk6ICdoaWdoJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IEljb25MYXllcih7XG4gICAgICAgICAgLi4uY29tbW9uTGF5ZXJQcm9wcyxcbiAgICAgICAgICAuLi5pY29uTGF5ZXJQcm9wcyxcbiAgICAgICAgICBpZDogYCR7ZGVmYXVsdExheWVyUHJvcHMuaWR9LWljb25gLFxuICAgICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgICBnZXRDb2xvcjogdGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZCA/IGRhdGEuZ2V0RmlsbENvbG9yIDogVU5LTk9XTl9DT0xPUixcbiAgICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgICAgZ2V0RmlsdGVyVmFsdWU6IHVwZGF0ZVRyaWdnZXJzLmdldEZpbHRlclZhbHVlLFxuICAgICAgICAgICAgZ2V0Q29sb3I6IHsuLi51cGRhdGVUcmlnZ2Vycy5nZXRGaWxsQ29sb3IsIGZpbGxlZDogdGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZH0sXG4gICAgICAgICAgICBnZXRJY29uOiB7Li4udXBkYXRlVHJpZ2dlcnMuZ2V0SWNvblVybCwgbWF4SWNvblNpemUsIHVzZU1hc2t9LFxuICAgICAgICAgICAgZ2V0U2l6ZTogdXBkYXRlVHJpZ2dlcnMuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgZ2V0QW5nbGU6IHVwZGF0ZVRyaWdnZXJzLmdldFJvdGF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uKGhvdmVyZWRPYmplY3RcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgbmV3IEljb25MYXllcih7XG4gICAgICAgICAgICAgICAgLi4uaWNvbkxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCksXG4gICAgICAgICAgICAgICAgaWQ6IGAke2RlZmF1bHRMYXllclByb3BzLmlkfS1pY29uLWhvdmVyZWRgLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtob3ZlcmVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgICBnZXRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3JcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4udGV4dExhYmVsTGF5ZXJcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhdHRlclBsb3RMYXllclByb3BzID0ge1xuICAgICAgc3Ryb2tlZDogdGhpcy5jb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICBmaWxsZWQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQsXG4gICAgICBsaW5lV2lkdGhTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcbiAgICAgIC8vIFRPRE86IGludmVudCBiZXR0ZXIgd2F5IHRvIHJlbmRlciBzb21ldGhpbmcgd2hlbiBjdXN0b21NYXJrZXJzIGFyZSBub3QgeWV0IGNvbmZpZ3VyZWRcbiAgICAgIHJhZGl1c1NjYWxlOiBjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCA/IHJhZGl1c1NjYWxlIC8gMiA6IHJhZGl1c1NjYWxlLFxuICAgICAgcmFkaXVzTWF4UGl4ZWxzOiA1MDBcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTY2F0dGVycGxvdExheWVyKHtcbiAgICAgICAgLi4uYnJ1c2hpbmdQcm9wcyxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uY29tbW9uTGF5ZXJQcm9wcyxcbiAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICByYWRpdXNVbml0czogJ3BpeGVscycsXG4gICAgICAgIGxpbmVXaWR0aFVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICAgIH0pLFxuICAgICAgLy8gaG92ZXIgbGF5ZXJcbiAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSxcbiAgICAgICAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICAgICAgICBkYXRhOiBbaG92ZXJlZE9iamVjdF0sXG4gICAgICAgICAgICAgIGdldExpbmVDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldFJhZGl1czogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSksXG4gICAgICAvLyB0ZXh0IGxhYmVsIGxheWVyXG4gICAgICAuLi50ZXh0TGFiZWxMYXllclxuICAgIF07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUNBLElB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