@carto/kepler.gl 0.0.86-alpha.deck9.1 → 0.0.86

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 (423) hide show
  1. package/dist/actions/action-wrapper.js +41 -36
  2. package/dist/actions/actions.js +21 -15
  3. package/dist/actions/identity-actions.js +20 -14
  4. package/dist/actions/index.js +16 -16
  5. package/dist/actions/map-state-actions.js +18 -12
  6. package/dist/actions/map-style-actions.js +46 -30
  7. package/dist/actions/provider-actions.js +73 -49
  8. package/dist/actions/ui-state-actions.js +113 -73
  9. package/dist/actions/vis-state-actions.js +148 -152
  10. package/dist/cloud-providers/index.js +7 -6
  11. package/dist/cloud-providers/provider.js +279 -189
  12. package/dist/components/bottom-widget.js +117 -105
  13. package/dist/components/common/action-panel.js +74 -122
  14. package/dist/components/common/animation-control/animation-control.js +54 -69
  15. package/dist/components/common/animation-control/animation-controller.js +160 -134
  16. package/dist/components/common/animation-control/animation-speed-slider.js +54 -47
  17. package/dist/components/common/animation-control/floating-time-display.js +100 -120
  18. package/dist/components/common/animation-control/playback-controls.js +144 -147
  19. package/dist/components/common/animation-control/speed-control.js +23 -31
  20. package/dist/components/common/checkbox.js +70 -56
  21. package/dist/components/common/color-legend.js +110 -83
  22. package/dist/components/common/data-table/button.js +23 -31
  23. package/dist/components/common/data-table/canvas.js +5 -11
  24. package/dist/components/common/data-table/cell-size.js +61 -51
  25. package/dist/components/common/data-table/grid.js +59 -40
  26. package/dist/components/common/data-table/index.js +348 -464
  27. package/dist/components/common/data-table/option-dropdown.js +33 -50
  28. package/dist/components/common/dataset-label.js +13 -17
  29. package/dist/components/common/error-boundary.js +45 -27
  30. package/dist/components/common/field-selector.js +139 -99
  31. package/dist/components/common/field-token.js +9 -24
  32. package/dist/components/common/file-uploader/file-drop.js +115 -96
  33. package/dist/components/common/file-uploader/file-upload-progress.js +45 -68
  34. package/dist/components/common/file-uploader/file-upload.js +187 -215
  35. package/dist/components/common/file-uploader/upload-button.js +22 -35
  36. package/dist/components/common/histogram-plot.js +58 -47
  37. package/dist/components/common/icons/add.js +27 -14
  38. package/dist/components/common/icons/anchor_window.js +18 -16
  39. package/dist/components/common/icons/arrow-down-alt.js +27 -14
  40. package/dist/components/common/icons/arrow-down-solid.js +27 -14
  41. package/dist/components/common/icons/arrow-down.js +27 -14
  42. package/dist/components/common/icons/arrow-left.js +30 -17
  43. package/dist/components/common/icons/arrow-right.js +27 -14
  44. package/dist/components/common/icons/arrow-up-alt.js +28 -15
  45. package/dist/components/common/icons/arrow-up-solid.js +27 -14
  46. package/dist/components/common/icons/arrow-up.js +27 -14
  47. package/dist/components/common/icons/base.js +57 -39
  48. package/dist/components/common/icons/bug.js +29 -16
  49. package/dist/components/common/icons/cancel.js +27 -14
  50. package/dist/components/common/icons/checkmark.js +31 -18
  51. package/dist/components/common/icons/chevron-right.js +33 -20
  52. package/dist/components/common/icons/clipboard.js +28 -15
  53. package/dist/components/common/icons/clock.js +29 -16
  54. package/dist/components/common/icons/close.js +32 -19
  55. package/dist/components/common/icons/code-alt.js +29 -16
  56. package/dist/components/common/icons/copy.js +31 -18
  57. package/dist/components/common/icons/crosshairs.js +29 -16
  58. package/dist/components/common/icons/cube-3d.js +31 -18
  59. package/dist/components/common/icons/cursor-click.js +31 -18
  60. package/dist/components/common/icons/data-table.js +28 -15
  61. package/dist/components/common/icons/db.js +28 -15
  62. package/dist/components/common/icons/delete.js +29 -16
  63. package/dist/components/common/icons/docs.js +43 -30
  64. package/dist/components/common/icons/drag-n-drop.js +29 -16
  65. package/dist/components/common/icons/draw-polygon.js +46 -33
  66. package/dist/components/common/icons/email.js +31 -18
  67. package/dist/components/common/icons/expand.js +29 -16
  68. package/dist/components/common/icons/eye-seen.js +29 -16
  69. package/dist/components/common/icons/eye-unseen.js +29 -16
  70. package/dist/components/common/icons/file-type.js +19 -35
  71. package/dist/components/common/icons/file.js +27 -14
  72. package/dist/components/common/icons/files.js +26 -14
  73. package/dist/components/common/icons/filter-funnel.js +27 -14
  74. package/dist/components/common/icons/free-window.js +18 -16
  75. package/dist/components/common/icons/gear.js +29 -16
  76. package/dist/components/common/icons/hash.js +27 -14
  77. package/dist/components/common/icons/histogram.js +27 -15
  78. package/dist/components/common/icons/index.js +156 -156
  79. package/dist/components/common/icons/info.js +38 -25
  80. package/dist/components/common/icons/layers.js +27 -14
  81. package/dist/components/common/icons/left-arrow.js +29 -16
  82. package/dist/components/common/icons/legend.js +27 -14
  83. package/dist/components/common/icons/line-chart.js +27 -14
  84. package/dist/components/common/icons/login.js +30 -17
  85. package/dist/components/common/icons/logout.js +29 -16
  86. package/dist/components/common/icons/map-icon.js +32 -18
  87. package/dist/components/common/icons/map.js +32 -18
  88. package/dist/components/common/icons/messages.js +27 -14
  89. package/dist/components/common/icons/minus.js +27 -14
  90. package/dist/components/common/icons/order-by-dataset.js +17 -15
  91. package/dist/components/common/icons/order-by-list.js +9 -7
  92. package/dist/components/common/icons/pause.js +27 -14
  93. package/dist/components/common/icons/picture.js +26 -14
  94. package/dist/components/common/icons/pin.js +30 -17
  95. package/dist/components/common/icons/play.js +27 -14
  96. package/dist/components/common/icons/polygon.js +48 -35
  97. package/dist/components/common/icons/rectangle.js +49 -36
  98. package/dist/components/common/icons/reduce.js +30 -17
  99. package/dist/components/common/icons/reset.js +27 -14
  100. package/dist/components/common/icons/rocket.js +27 -14
  101. package/dist/components/common/icons/save.js +29 -16
  102. package/dist/components/common/icons/save2.js +33 -20
  103. package/dist/components/common/icons/search.js +29 -16
  104. package/dist/components/common/icons/settings.js +29 -16
  105. package/dist/components/common/icons/share.js +27 -14
  106. package/dist/components/common/icons/split.js +55 -42
  107. package/dist/components/common/icons/square-select.js +29 -16
  108. package/dist/components/common/icons/swap-horizontal.js +31 -18
  109. package/dist/components/common/icons/table.js +27 -14
  110. package/dist/components/common/icons/trash.js +29 -16
  111. package/dist/components/common/icons/upload.js +27 -14
  112. package/dist/components/common/icons/vert-dots.js +65 -52
  113. package/dist/components/common/icons/vert-three-dots.js +40 -27
  114. package/dist/components/common/icons/warning.js +39 -26
  115. package/dist/components/common/image-preview.js +33 -71
  116. package/dist/components/common/info-helper.js +29 -36
  117. package/dist/components/common/item-selector/accessor.js +13 -7
  118. package/dist/components/common/item-selector/chickleted-input.js +56 -72
  119. package/dist/components/common/item-selector/dropdown-list.js +214 -182
  120. package/dist/components/common/item-selector/item-selector-submenu.js +55 -34
  121. package/dist/components/common/item-selector/item-selector.js +194 -183
  122. package/dist/components/common/item-selector/typeahead.js +248 -236
  123. package/dist/components/common/line-chart.js +58 -80
  124. package/dist/components/common/loading-spinner.js +31 -46
  125. package/dist/components/common/logo.js +48 -61
  126. package/dist/components/common/map-layer-selector.js +25 -31
  127. package/dist/components/common/modal.js +106 -167
  128. package/dist/components/common/portaled.js +189 -169
  129. package/dist/components/common/progress-bar.js +24 -27
  130. package/dist/components/common/range-brush.js +215 -176
  131. package/dist/components/common/range-plot.js +63 -52
  132. package/dist/components/common/range-slider.js +231 -206
  133. package/dist/components/common/slider/mouse-event.js +66 -59
  134. package/dist/components/common/slider/slider-bar-handle.js +61 -51
  135. package/dist/components/common/slider/slider-handle.js +102 -127
  136. package/dist/components/common/slider/slider.js +162 -143
  137. package/dist/components/common/styled-components.js +256 -518
  138. package/dist/components/common/switch.js +11 -11
  139. package/dist/components/common/time-range-slider-time-title.js +32 -49
  140. package/dist/components/common/time-range-slider.js +45 -56
  141. package/dist/components/common/time-slider-marker.js +52 -71
  142. package/dist/components/common/tippy-tooltip.js +59 -89
  143. package/dist/components/common/toolbar-item.js +45 -53
  144. package/dist/components/common/toolbar.js +18 -24
  145. package/dist/components/common/vertical-toolbar.js +6 -13
  146. package/dist/components/container.js +119 -87
  147. package/dist/components/context.js +8 -6
  148. package/dist/components/editor/constants.js +4 -4
  149. package/dist/components/editor/editor.js +157 -122
  150. package/dist/components/editor/feature-action-panel.js +59 -52
  151. package/dist/components/editor/feature-styles.js +29 -46
  152. package/dist/components/editor/handle-style.js +29 -38
  153. package/dist/components/filters/components.js +4 -8
  154. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +43 -33
  155. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +21 -20
  156. package/dist/components/filters/filter-panels/new-filter-panel.js +31 -24
  157. package/dist/components/filters/filter-panels/polygon-filter-panel.js +31 -26
  158. package/dist/components/filters/filter-panels/range-filter-panel.js +21 -20
  159. package/dist/components/filters/filter-panels/single-select-filter-panel.js +21 -20
  160. package/dist/components/filters/filter-panels/time-range-filter-panel.js +31 -28
  161. package/dist/components/filters/index.js +10 -10
  162. package/dist/components/filters/multi-select-filter.js +9 -11
  163. package/dist/components/filters/polygon-filter.js +41 -26
  164. package/dist/components/filters/range-filter.js +7 -9
  165. package/dist/components/filters/single-select-filter.js +13 -11
  166. package/dist/components/filters/time-range-filter.js +14 -16
  167. package/dist/components/filters/time-widget.js +84 -125
  168. package/dist/components/geocoder/geocoder.js +177 -158
  169. package/dist/components/geocoder-panel.js +87 -66
  170. package/dist/components/index.js +329 -328
  171. package/dist/components/injector.js +63 -44
  172. package/dist/components/kepler-gl.js +361 -325
  173. package/dist/components/map/coordinate-info.js +16 -18
  174. package/dist/components/map/layer-hover-info.js +86 -108
  175. package/dist/components/map/layer-selector-panel.js +48 -50
  176. package/dist/components/map/locale-panel.js +44 -38
  177. package/dist/components/map/map-control-panel.js +47 -70
  178. package/dist/components/map/map-control-toolbar.js +6 -9
  179. package/dist/components/map/map-control-tooltip.js +8 -10
  180. package/dist/components/map/map-control.js +27 -35
  181. package/dist/components/map/map-draw-panel.js +48 -38
  182. package/dist/components/map/map-legend-panel.js +50 -47
  183. package/dist/components/map/map-legend.js +116 -133
  184. package/dist/components/map/map-popover.js +100 -155
  185. package/dist/components/map/split-map-button.js +34 -30
  186. package/dist/components/map/toggle-3d-button.js +27 -25
  187. package/dist/components/map-container.js +359 -313
  188. package/dist/components/maps-layout.js +26 -16
  189. package/dist/components/modal-container.js +355 -359
  190. package/dist/components/modals/add-map-style-modal.js +194 -233
  191. package/dist/components/modals/cloud-tile.js +67 -96
  192. package/dist/components/modals/data-table-modal.js +152 -155
  193. package/dist/components/modals/delete-data-modal.js +20 -20
  194. package/dist/components/modals/error-display.js +7 -9
  195. package/dist/components/modals/export-data-modal.js +140 -118
  196. package/dist/components/modals/export-image-modal.js +69 -82
  197. package/dist/components/modals/export-map-modal/components.js +18 -20
  198. package/dist/components/modals/export-map-modal/export-html-map.js +74 -82
  199. package/dist/components/modals/export-map-modal/export-json-map.js +45 -65
  200. package/dist/components/modals/export-map-modal/export-map-modal.js +47 -42
  201. package/dist/components/modals/image-modal-container.js +21 -20
  202. package/dist/components/modals/load-data-modal.js +30 -28
  203. package/dist/components/modals/load-storage-map.js +178 -277
  204. package/dist/components/modals/loading-dialog.js +19 -41
  205. package/dist/components/modals/modal-dialog.js +6 -4
  206. package/dist/components/modals/modal-tabs.js +48 -83
  207. package/dist/components/modals/overwrite-map-modal.js +30 -41
  208. package/dist/components/modals/provider-modal-container.js +42 -23
  209. package/dist/components/modals/save-map-modal.js +83 -107
  210. package/dist/components/modals/share-map-modal.js +95 -101
  211. package/dist/components/modals/status-panel.js +43 -63
  212. package/dist/components/modals/storage-map-viewer.js +70 -133
  213. package/dist/components/notification-panel/notification-item.js +97 -94
  214. package/dist/components/notification-panel.js +43 -35
  215. package/dist/components/performance.js +53 -49
  216. package/dist/components/plot-container.js +169 -151
  217. package/dist/components/side-panel/cloud-storage-dropdown.js +15 -13
  218. package/dist/components/side-panel/common/dataset-info.js +12 -16
  219. package/dist/components/side-panel/common/dataset-tag.js +27 -48
  220. package/dist/components/side-panel/common/dataset-title.js +116 -119
  221. package/dist/components/side-panel/common/source-data-catalog.js +32 -31
  222. package/dist/components/side-panel/common/source-data-selector.js +77 -52
  223. package/dist/components/side-panel/custom-panel.js +8 -6
  224. package/dist/components/side-panel/filter-manager.js +62 -48
  225. package/dist/components/side-panel/filter-panel/filter-panel-header.js +25 -35
  226. package/dist/components/side-panel/filter-panel/filter-panel.js +64 -46
  227. package/dist/components/side-panel/interaction-manager.js +18 -20
  228. package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
  229. package/dist/components/side-panel/interaction-panel/interaction-panel.js +95 -76
  230. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +143 -118
  231. package/dist/components/side-panel/interaction-panel/tooltip-config.js +76 -95
  232. package/dist/components/side-panel/layer-manager.js +115 -105
  233. package/dist/components/side-panel/layer-panel/add-layer-button.js +54 -92
  234. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +5 -5
  235. package/dist/components/side-panel/layer-panel/color-palette.js +37 -50
  236. package/dist/components/side-panel/layer-panel/color-range-selector.js +207 -196
  237. package/dist/components/side-panel/layer-panel/color-selector.js +110 -104
  238. package/dist/components/side-panel/layer-panel/column-selector.js +22 -34
  239. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +4 -4
  240. package/dist/components/side-panel/layer-panel/custom-palette.js +205 -248
  241. package/dist/components/side-panel/layer-panel/custom-picker.js +69 -51
  242. package/dist/components/side-panel/layer-panel/dataset-layer-group.js +42 -37
  243. package/dist/components/side-panel/layer-panel/dataset-layer-section.js +27 -31
  244. package/dist/components/side-panel/layer-panel/dataset-section.js +35 -45
  245. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +13 -14
  246. package/dist/components/side-panel/layer-panel/hex-column-config.js +55 -32
  247. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +5 -5
  248. package/dist/components/side-panel/layer-panel/layer-column-config.js +46 -42
  249. package/dist/components/side-panel/layer-panel/layer-config-group.js +144 -178
  250. package/dist/components/side-panel/layer-panel/layer-configurator.js +830 -826
  251. package/dist/components/side-panel/layer-panel/layer-list.js +94 -101
  252. package/dist/components/side-panel/layer-panel/layer-panel-header.js +82 -124
  253. package/dist/components/side-panel/layer-panel/layer-panel.js +105 -111
  254. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +58 -67
  255. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +32 -47
  256. package/dist/components/side-panel/layer-panel/layer-type-selector.js +41 -30
  257. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +43 -42
  258. package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +57 -55
  259. package/dist/components/side-panel/layer-panel/single-color-palette.js +33 -48
  260. package/dist/components/side-panel/layer-panel/text-label-panel.js +116 -81
  261. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +102 -88
  262. package/dist/components/side-panel/layer-panel/vis-config-slider.js +85 -99
  263. package/dist/components/side-panel/layer-panel/vis-config-switch.js +29 -38
  264. package/dist/components/side-panel/map-manager.js +89 -70
  265. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +60 -72
  266. package/dist/components/side-panel/map-style-panel/map-style-selector.js +42 -64
  267. package/dist/components/side-panel/panel-dropdown.js +37 -21
  268. package/dist/components/side-panel/panel-header-action.js +65 -60
  269. package/dist/components/side-panel/panel-header.js +184 -165
  270. package/dist/components/side-panel/panel-tab.js +29 -35
  271. package/dist/components/side-panel/panel-title.js +18 -15
  272. package/dist/components/side-panel/panel-toggle.js +31 -30
  273. package/dist/components/side-panel/side-bar.js +91 -100
  274. package/dist/components/side-panel.js +123 -108
  275. package/dist/connect/keplergl-connect.js +26 -17
  276. package/dist/connect/with-local-selector.js +63 -31
  277. package/dist/constants/action-types.js +115 -113
  278. package/dist/constants/color-palette.js +16 -14
  279. package/dist/constants/color-ranges.js +28 -23
  280. package/dist/constants/custom-color-ranges.js +12 -12
  281. package/dist/constants/default-settings.js +254 -323
  282. package/dist/constants/index.js +63 -63
  283. package/dist/constants/keyevent.js +4 -4
  284. package/dist/constants/tooltip.js +5 -5
  285. package/dist/constants/user-feedbacks.js +5 -9
  286. package/dist/constants/user-guides.js +10 -10
  287. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +63 -37
  288. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +56 -52
  289. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +168 -165
  290. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +43 -24
  291. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +40 -27
  292. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +40 -27
  293. package/dist/deckgl-layers/layer-utils/cluster-utils.js +68 -60
  294. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +282 -276
  295. package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
  296. package/dist/deckgl-layers/line-layer/line-layer.js +70 -62
  297. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +51 -37
  298. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +85 -65
  299. package/dist/index.js +16 -15
  300. package/dist/layers/aggregation-layer.js +331 -299
  301. package/dist/layers/arc-layer/arc-layer-icon.js +41 -27
  302. package/dist/layers/arc-layer/arc-layer.js +201 -174
  303. package/dist/layers/base-layer.js +1544 -1371
  304. package/dist/layers/cluster-layer/cluster-layer-icon.js +44 -30
  305. package/dist/layers/cluster-layer/cluster-layer.js +103 -89
  306. package/dist/layers/default-layer-icon.js +53 -39
  307. package/dist/layers/geojson-layer/geojson-layer-icon.js +55 -42
  308. package/dist/layers/geojson-layer/geojson-layer.js +353 -292
  309. package/dist/layers/geojson-layer/geojson-utils.js +36 -31
  310. package/dist/layers/grid-layer/grid-layer-icon.js +100 -87
  311. package/dist/layers/grid-layer/grid-layer.js +61 -51
  312. package/dist/layers/grid-layer/grid-utils.js +9 -13
  313. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +35 -21
  314. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +260 -225
  315. package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
  316. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +52 -39
  317. package/dist/layers/heatmap-layer/heatmap-layer.js +171 -140
  318. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +64 -51
  319. package/dist/layers/hexagon-layer/hexagon-layer.js +63 -49
  320. package/dist/layers/hexagon-layer/hexagon-utils.js +14 -15
  321. package/dist/layers/icon-layer/icon-info-modal.js +75 -82
  322. package/dist/layers/icon-layer/icon-layer-icon.js +37 -24
  323. package/dist/layers/icon-layer/icon-layer.js +303 -274
  324. package/dist/layers/index.js +29 -43
  325. package/dist/layers/layer-factory.js +41 -25
  326. package/dist/layers/layer-text-label.js +23 -21
  327. package/dist/layers/layer-update.js +18 -16
  328. package/dist/layers/line-layer/line-layer-icon.js +43 -30
  329. package/dist/layers/line-layer/line-layer.js +142 -123
  330. package/dist/layers/mapbox-utils.js +62 -61
  331. package/dist/layers/mapboxgl-layer.js +169 -124
  332. package/dist/layers/point-layer/point-layer-icon.js +59 -45
  333. package/dist/layers/point-layer/point-layer.js +386 -355
  334. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +238 -208
  335. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +35 -21
  336. package/dist/layers/s2-geometry-layer/s2-utils.js +8 -9
  337. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +25 -24
  338. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +115 -102
  339. package/dist/layers/scenegraph-layer/scenegraph-layer.js +172 -148
  340. package/dist/layers/trip-layer/trip-info-modal.js +30 -50
  341. package/dist/layers/trip-layer/trip-layer-icon.js +53 -40
  342. package/dist/layers/trip-layer/trip-layer.js +307 -239
  343. package/dist/layers/trip-layer/trip-utils.js +50 -34
  344. package/dist/layers/types.js +2 -2
  345. package/dist/localization/formatted-message.js +10 -8
  346. package/dist/localization/index.js +7 -7
  347. package/dist/localization/locales.js +9 -6
  348. package/dist/localization/messages.js +10 -13
  349. package/dist/localization/translations/ca.js +13 -11
  350. package/dist/localization/translations/cn.js +13 -11
  351. package/dist/localization/translations/en.js +13 -11
  352. package/dist/localization/translations/es.js +13 -11
  353. package/dist/localization/translations/fi.js +13 -11
  354. package/dist/localization/translations/ja.js +13 -11
  355. package/dist/localization/translations/pt.js +13 -11
  356. package/dist/localization/translations/ru.js +13 -11
  357. package/dist/middleware/index.js +5 -3
  358. package/dist/processors/data-processor.js +201 -164
  359. package/dist/processors/file-handler.js +233 -111
  360. package/dist/processors/index.js +4 -4
  361. package/dist/reducers/combined-updaters.js +41 -41
  362. package/dist/reducers/composer-helpers.js +45 -20
  363. package/dist/reducers/composers.js +8 -9
  364. package/dist/reducers/core.js +35 -31
  365. package/dist/reducers/index.js +22 -21
  366. package/dist/reducers/map-state-updaters.js +47 -65
  367. package/dist/reducers/map-state.js +15 -23
  368. package/dist/reducers/map-style-updaters.js +159 -233
  369. package/dist/reducers/map-style.js +16 -30
  370. package/dist/reducers/provider-state-updaters.js +229 -217
  371. package/dist/reducers/provider-state.js +17 -29
  372. package/dist/reducers/root.js +58 -86
  373. package/dist/reducers/ui-state-updaters.js +218 -337
  374. package/dist/reducers/ui-state.js +16 -45
  375. package/dist/reducers/vis-state-merger.js +209 -205
  376. package/dist/reducers/vis-state-selectors.js +19 -5
  377. package/dist/reducers/vis-state-updaters.js +876 -1003
  378. package/dist/reducers/vis-state.js +16 -75
  379. package/dist/schemas/dataset-schema.js +108 -84
  380. package/dist/schemas/index.js +29 -28
  381. package/dist/schemas/map-state-schema.js +18 -21
  382. package/dist/schemas/map-style-schema.js +55 -47
  383. package/dist/schemas/schema-manager.js +161 -147
  384. package/dist/schemas/schema-utils.js +9 -8
  385. package/dist/schemas/schema.js +87 -72
  386. package/dist/schemas/versions.js +3 -3
  387. package/dist/schemas/vis-state-schema.js +583 -441
  388. package/dist/styles/base.js +1021 -1217
  389. package/dist/styles/index.js +3 -3
  390. package/dist/styles/media-breakpoints.js +18 -23
  391. package/dist/tasks/tasks.js +39 -36
  392. package/dist/templates/export-map-html.js +4 -233
  393. package/dist/utils/aggregate-utils.js +16 -13
  394. package/dist/utils/color-utils.js +37 -29
  395. package/dist/utils/custom-scales.js +3 -3
  396. package/dist/utils/data-scale-utils.js +13 -6
  397. package/dist/utils/data-utils.js +83 -60
  398. package/dist/utils/dataset-utils.js +77 -48
  399. package/dist/utils/dom-to-image.js +163 -108
  400. package/dist/utils/dom-utils.js +105 -88
  401. package/dist/utils/export-utils.js +103 -116
  402. package/dist/utils/filter-utils.js +374 -379
  403. package/dist/utils/gl-utils.js +15 -16
  404. package/dist/utils/gpu-filter-utils.js +73 -54
  405. package/dist/utils/index.js +48 -47
  406. package/dist/utils/interaction-utils.js +46 -53
  407. package/dist/utils/layer-utils.js +78 -89
  408. package/dist/utils/locale-utils.js +16 -24
  409. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +76 -67
  410. package/dist/utils/map-style-utils/mapbox-utils.js +3 -4
  411. package/dist/utils/mapbox-utils.js +4 -3
  412. package/dist/utils/notifications-utils.js +38 -33
  413. package/dist/utils/observe-dimensions.js +54 -42
  414. package/dist/utils/projection-utils.js +11 -14
  415. package/dist/utils/split-map-utils.js +33 -30
  416. package/dist/utils/table-utils/data-container-utils.js +14 -15
  417. package/dist/utils/table-utils/data-row.js +65 -58
  418. package/dist/utils/table-utils/index.js +2 -2
  419. package/dist/utils/table-utils/indexed-data-container.js +173 -105
  420. package/dist/utils/table-utils/kepler-table.js +386 -362
  421. package/dist/utils/table-utils/row-data-container.js +164 -99
  422. package/dist/utils/utils.js +30 -29
  423. package/package.json +1 -1
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports.default = exports.DECK_AGGREGATION_MAP = void 0;
7
+ exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports["default"] = exports.DECK_AGGREGATION_MAP = void 0;
8
8
  exports.getAggregatedData = getAggregatedData;
9
9
  exports.getDimensionScale = getDimensionScale;
10
10
  exports.getDimensionSortedBins = getDimensionSortedBins;
@@ -13,11 +13,15 @@ exports.getGetValue = getGetValue;
13
13
  exports.getScaleFunctor = getScaleFunctor;
14
14
  exports.getValueFunc = getValueFunc;
15
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
18
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
16
19
  var _aggregationLayers = require("@deck.gl/aggregation-layers");
17
20
  var _window = require("global/window");
18
21
  var _aggregateUtils = require("../../utils/aggregate-utils");
19
22
  var _defaultSettings = require("../../constants/default-settings");
20
- // Copyright (c) 2022 Uber Technologies, Inc.
23
+ 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; }
24
+ 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; } // Copyright (c) 2022 Uber Technologies, Inc.
21
25
  //
22
26
  // Permission is hereby granted, free of charge, to any person obtaining a copy
23
27
  // of this software and associated documentation files (the "Software"), to deal
@@ -36,78 +40,64 @@ var _defaultSettings = require("../../constants/default-settings");
36
40
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37
41
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
38
42
  // THE SOFTWARE.
39
-
40
- /* eslint-disable guard-for-in */
41
-
42
- /* @ts-expect-error BinSorter has been removed in deck.gl 9.1 so this entire file will no longer work */
43
-
44
- const DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = {
43
+ /* eslint-disable guard-for-in */ /* @ts-expect-error BinSorter has been removed in deck.gl 9.1 so this entire file will no longer work */
44
+ var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = {
45
45
  SUM: _defaultSettings.AGGREGATION_TYPES.sum,
46
46
  MEAN: _defaultSettings.AGGREGATION_TYPES.average,
47
47
  MIN: _defaultSettings.AGGREGATION_TYPES.minimum,
48
48
  MAX: _defaultSettings.AGGREGATION_TYPES.maximum
49
49
  };
50
50
  function getValueFunc(aggregation, accessor) {
51
- const op = aggregation.toUpperCase();
51
+ var op = aggregation.toUpperCase();
52
52
  if (!aggregation || !DECK_AGGREGATION_MAP[aggregation.toUpperCase()]) {
53
- _window.console.warn(`Aggregation ${aggregation} is not supported`);
53
+ _window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
54
54
  }
55
- const keplerOp = DECK_AGGREGATION_MAP[op || 'SUM'];
56
- return pts => (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
55
+ var keplerOp = DECK_AGGREGATION_MAP[op || 'SUM'];
56
+ return function (pts) {
57
+ return (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
58
+ };
57
59
  }
58
60
  function getScaleFunctor(scaleType) {
59
61
  if (!scaleType || !_defaultSettings.SCALE_FUNC[scaleType]) {
60
- _window.console.warn(`Scale ${scaleType} is not supported`);
62
+ _window.console.warn("Scale ".concat(scaleType, " is not supported"));
61
63
  }
62
64
  return _defaultSettings.SCALE_FUNC[scaleType] || _defaultSettings.SCALE_FUNC.quantize;
63
65
  }
64
66
  function nop() {}
65
67
  function getGetValue(step, props, dimensionUpdater) {
66
- const {
67
- key
68
- } = dimensionUpdater;
69
- const {
70
- value,
71
- weight,
72
- aggregation
73
- } = step.triggers;
74
- let getValue = props[value.prop];
68
+ var key = dimensionUpdater.key;
69
+ var _step$triggers = step.triggers,
70
+ value = _step$triggers.value,
71
+ weight = _step$triggers.weight,
72
+ aggregation = _step$triggers.aggregation;
73
+ var getValue = props[value.prop];
75
74
  if (getValue === null) {
76
75
  // If `getValue` is not provided from props, build it with aggregation and weight.
77
76
  getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
78
77
  }
79
78
  if (getValue) {
80
79
  this._setDimensionState(key, {
81
- getValue
80
+ getValue: getValue
82
81
  });
83
82
  }
84
83
  }
85
84
  function getDimensionSortedBins(step, props, dimensionUpdater) {
86
- const {
87
- key
88
- } = dimensionUpdater;
89
- const {
90
- getValue
91
- } = this.state.dimensions[key];
92
- const sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
93
- getValue,
85
+ var key = dimensionUpdater.key;
86
+ var getValue = this.state.dimensions[key].getValue;
87
+ var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
88
+ getValue: getValue,
94
89
  filterData: props._filterData
95
90
  });
96
91
  this._setDimensionState(key, {
97
- sortedBins
92
+ sortedBins: sortedBins
98
93
  });
99
94
  }
100
95
  function getDimensionValueDomain(step, props, dimensionUpdater) {
101
- const {
102
- key
103
- } = dimensionUpdater;
104
- const {
105
- triggers: {
106
- lowerPercentile,
107
- upperPercentile,
108
- scaleType
109
- }
110
- } = step;
96
+ var key = dimensionUpdater.key;
97
+ var _step$triggers2 = step.triggers,
98
+ lowerPercentile = _step$triggers2.lowerPercentile,
99
+ upperPercentile = _step$triggers2.upperPercentile,
100
+ scaleType = _step$triggers2.scaleType;
111
101
  if (!this.state.dimensions[key].sortedBins) {
112
102
  // the previous step should set sortedBins, if not, something went wrong
113
103
  return;
@@ -115,42 +105,37 @@ function getDimensionValueDomain(step, props, dimensionUpdater) {
115
105
 
116
106
  // for log and sqrt scale, returns linear domain by default
117
107
  // TODO: support other scale function domain in bin sorter
118
- const valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
108
+ var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
119
109
  this._setDimensionState(key, {
120
110
  // By default sortedBins order by ascending frecuency but if we've an ordinal scale we want to order by descending frecuency
121
111
  valueDomain: props[scaleType.prop] === _defaultSettings.SCALE_TYPES.ordinal ? valueDomain.reverse() : valueDomain
122
112
  });
123
113
  }
124
114
  function getDimensionScale(step, props, dimensionUpdater) {
125
- const {
126
- key
127
- } = dimensionUpdater;
128
- const {
129
- domain,
130
- range,
131
- scaleType
132
- } = step.triggers;
133
- const {
134
- onSet
135
- } = step;
115
+ var key = dimensionUpdater.key;
116
+ var _step$triggers3 = step.triggers,
117
+ domain = _step$triggers3.domain,
118
+ range = _step$triggers3.range,
119
+ scaleType = _step$triggers3.scaleType;
120
+ var onSet = step.onSet;
136
121
  if (!this.state.dimensions[key].valueDomain) {
137
122
  // the previous step should set valueDomain, if not, something went wrong
138
123
  return;
139
124
  }
140
- const dimensionRange = props[range.prop];
141
- const dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
142
- const scaleTypeProp = scaleType && props[scaleType.prop];
143
- const scaleFunctor = getScaleFunctor(scaleTypeProp)();
144
- const scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
145
- if (typeof onSet === 'object' && typeof props[onSet.props] === 'function') {
125
+ var dimensionRange = props[range.prop];
126
+ var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
127
+ var scaleTypeProp = scaleType && props[scaleType.prop];
128
+ var scaleFunctor = getScaleFunctor(scaleTypeProp)();
129
+ var scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
130
+ if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
146
131
  props[onSet.props](this.state.dimensions[key].valueDomain);
147
132
  }
148
133
  this._setDimensionState(key, {
149
- scaleFunc
134
+ scaleFunc: scaleFunc
150
135
  });
151
136
  }
152
137
  function normalizeResult() {
153
- let result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
138
+ var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
154
139
  // support previous hexagonAggregator API
155
140
  if (result.hexagons) {
156
141
  return Object.assign({
@@ -164,21 +149,17 @@ function normalizeResult() {
164
149
  return result;
165
150
  }
166
151
  function getAggregatedData(step, props, aggregation, aggregationParams) {
167
- const {
168
- triggers: {
169
- aggregator: aggr
170
- }
171
- } = step;
172
- const aggregator = props[aggr.prop];
152
+ var aggr = step.triggers.aggregator;
153
+ var aggregator = props[aggr.prop];
173
154
 
174
155
  // result should contain a data array and other props
175
156
  // result = {data: [], ...other props}
176
- const result = aggregator(props, aggregationParams);
157
+ var result = aggregator(props, aggregationParams);
177
158
  this.setState({
178
159
  layerData: normalizeResult(result)
179
160
  });
180
161
  }
181
- const defaultAggregation = exports.defaultAggregation = {
162
+ var defaultAggregation = exports.defaultAggregation = {
182
163
  key: 'position',
183
164
  updateSteps: [{
184
165
  key: 'aggregate',
@@ -198,17 +179,15 @@ const defaultAggregation = exports.defaultAggregation = {
198
179
  }]
199
180
  };
200
181
  function getSubLayerAccessor(dimensionState, dimension, layerProps) {
201
- return cell => {
202
- const {
203
- sortedBins,
204
- scaleFunc
205
- } = dimensionState;
206
- const bin = sortedBins.binMap[cell.index];
182
+ return function (cell) {
183
+ var sortedBins = dimensionState.sortedBins,
184
+ scaleFunc = dimensionState.scaleFunc;
185
+ var bin = sortedBins.binMap[cell.index];
207
186
  if (bin && bin.counts === 0) {
208
187
  // no points left in bin after filtering
209
188
  return dimension.nullValue;
210
189
  }
211
- const cv = bin && bin.value;
190
+ var cv = bin && bin.value;
212
191
  // const domain = scaleFunc.domain();
213
192
 
214
193
  // const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
@@ -218,16 +197,14 @@ function getSubLayerAccessor(dimensionState, dimension, layerProps) {
218
197
  return scaleFunc(cv);
219
198
  };
220
199
  }
221
- const defaultColorDimension = exports.defaultColorDimension = {
200
+ var defaultColorDimension = exports.defaultColorDimension = {
222
201
  key: 'fillColor',
223
202
  accessor: 'getFillColor',
224
- getPickingInfo: (dimensionState, cell) => {
225
- const {
226
- sortedBins
227
- } = dimensionState;
228
- const colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
203
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
204
+ var sortedBins = dimensionState.sortedBins;
205
+ var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
229
206
  return {
230
- colorValue
207
+ colorValue: colorValue
231
208
  };
232
209
  },
233
210
  nullValue: [0, 0, 0, 0],
@@ -288,18 +265,16 @@ const defaultColorDimension = exports.defaultColorDimension = {
288
265
  },
289
266
  updater: getDimensionScale
290
267
  }],
291
- getSubLayerAccessor
268
+ getSubLayerAccessor: getSubLayerAccessor
292
269
  };
293
- const defaultElevationDimension = exports.defaultElevationDimension = {
270
+ var defaultElevationDimension = exports.defaultElevationDimension = {
294
271
  key: 'elevation',
295
272
  accessor: 'getElevation',
296
- getPickingInfo: (dimensionState, cell) => {
297
- const {
298
- sortedBins
299
- } = dimensionState;
300
- const elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
273
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
274
+ var sortedBins = dimensionState.sortedBins;
275
+ var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
301
276
  return {
302
- elevationValue
277
+ elevationValue: elevationValue
303
278
  };
304
279
  },
305
280
  nullValue: -1,
@@ -360,16 +335,14 @@ const defaultElevationDimension = exports.defaultElevationDimension = {
360
335
  },
361
336
  updater: getDimensionScale
362
337
  }],
363
- getSubLayerAccessor
338
+ getSubLayerAccessor: getSubLayerAccessor
364
339
  };
365
- const defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
366
- class CPUAggregator {
367
- constructor() {
368
- let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
369
- (0, _defineProperty2.default)(this, "state", void 0);
370
- (0, _defineProperty2.default)(this, "dimensionUpdaters", void 0);
371
- (0, _defineProperty2.default)(this, "aggregationUpdater", void 0);
372
- this.state = {
340
+ var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
341
+ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
342
+ function CPUAggregator() {
343
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
344
+ (0, _classCallCheck2["default"])(this, CPUAggregator);
345
+ this.state = _objectSpread({
373
346
  layerData: {},
374
347
  dimensions: {
375
348
  // color: {
@@ -384,201 +357,234 @@ class CPUAggregator {
384
357
  // sortedBins: null,
385
358
  // scaleFunc: nop
386
359
  // }
387
- },
388
- ...opts.initialState
389
- };
360
+ }
361
+ }, opts.initialState);
390
362
  this.dimensionUpdaters = {};
391
363
  this.aggregationUpdater = opts.aggregation || defaultAggregation;
392
- this._addDimension(opts.dimensions || defaultDimensions);
393
- }
394
- static defaultDimensions() {
395
- return defaultDimensions;
364
+ this._addDimension(opts.dimensions || _defaultDimensions);
396
365
  }
397
- updateAllDimensions(props) {
398
- let dimensionChanges = [];
399
- // update all dimensions
400
- for (const dim in this.dimensionUpdaters) {
401
- const updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
402
- dimensionChanges = dimensionChanges.concat(updaters);
366
+ return (0, _createClass2["default"])(CPUAggregator, [{
367
+ key: "updateAllDimensions",
368
+ value: function updateAllDimensions(props) {
369
+ var dimensionChanges = [];
370
+ // update all dimensions
371
+ for (var dim in this.dimensionUpdaters) {
372
+ var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
373
+ dimensionChanges = dimensionChanges.concat(updaters);
374
+ }
375
+ dimensionChanges.forEach(function (f) {
376
+ return typeof f === 'function' && f();
377
+ });
403
378
  }
404
- dimensionChanges.forEach(f => typeof f === 'function' && f());
405
- }
406
- updateAggregation(props, aggregationParams) {
407
- const updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
408
- updaters.forEach(f => typeof f === 'function' && f(aggregationParams));
409
- }
410
- updateState(opts, aggregationParams) {
411
- const {
412
- oldProps,
413
- props,
414
- changeFlags
415
- } = opts;
416
- let dimensionChanges = [];
417
- if (changeFlags.dataChanged) {
418
- // if data changed update everything
419
- this.updateAggregation(props, aggregationParams);
420
- this.updateAllDimensions(props);
421
- return this.state;
379
+ }, {
380
+ key: "updateAggregation",
381
+ value: function updateAggregation(props, aggregationParams) {
382
+ var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
383
+ updaters.forEach(function (f) {
384
+ return typeof f === 'function' && f(aggregationParams);
385
+ });
422
386
  }
423
- const aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
424
- if (aggregationChanges && aggregationChanges.length) {
425
- // get aggregatedData
426
- aggregationChanges.forEach(f => typeof f === 'function' && f(aggregationParams));
427
- this.updateAllDimensions(props);
428
- } else {
429
- // only update dimensions
430
- dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
431
- dimensionChanges.forEach(f => typeof f === 'function' && f());
387
+ }, {
388
+ key: "updateState",
389
+ value: function updateState(opts, aggregationParams) {
390
+ var oldProps = opts.oldProps,
391
+ props = opts.props,
392
+ changeFlags = opts.changeFlags;
393
+ var dimensionChanges = [];
394
+ if (changeFlags.dataChanged) {
395
+ // if data changed update everything
396
+ this.updateAggregation(props, aggregationParams);
397
+ this.updateAllDimensions(props);
398
+ return this.state;
399
+ }
400
+ var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
401
+ if (aggregationChanges && aggregationChanges.length) {
402
+ // get aggregatedData
403
+ aggregationChanges.forEach(function (f) {
404
+ return typeof f === 'function' && f(aggregationParams);
405
+ });
406
+ this.updateAllDimensions(props);
407
+ } else {
408
+ // only update dimensions
409
+ dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
410
+ dimensionChanges.forEach(function (f) {
411
+ return typeof f === 'function' && f();
412
+ });
413
+ }
414
+ return this.state;
432
415
  }
433
- return this.state;
434
- }
435
416
 
436
- // Update private state
437
- setState(updateObject) {
438
- this.state = Object.assign({}, this.state, updateObject);
439
- }
417
+ // Update private state
418
+ }, {
419
+ key: "setState",
420
+ value: function setState(updateObject) {
421
+ this.state = Object.assign({}, this.state, updateObject);
422
+ }
440
423
 
441
- // Update private state.dimensions
442
- _setDimensionState(key, updateObject) {
443
- this.setState({
444
- dimensions: Object.assign({}, this.state.dimensions, {
445
- [key]: Object.assign({}, this.state.dimensions[key], updateObject)
446
- })
447
- });
448
- }
449
- _addAggregation(aggregation) {
450
- this.aggregationUpdater = aggregation;
451
- }
452
- _addDimension() {
453
- let dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
454
- dimensions.forEach(dimension => {
455
- const {
456
- key
457
- } = dimension;
458
- this.dimensionUpdaters[key] = dimension;
459
- });
460
- }
461
- _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
462
- // whether need to update current dimension step
463
- // dimension step is the value, domain, scaleFunction of each dimension
464
- // each step is an object with properties links to layer prop and whether the prop is
465
- // controlled by updateTriggers
466
- return Object.values(dimensionStep.triggers).some(item => {
467
- if (item.updateTrigger) {
468
- // check based on updateTriggers change first
469
- return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
424
+ // Update private state.dimensions
425
+ }, {
426
+ key: "_setDimensionState",
427
+ value: function _setDimensionState(key, updateObject) {
428
+ this.setState({
429
+ dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
430
+ });
431
+ }
432
+ }, {
433
+ key: "_addAggregation",
434
+ value: function _addAggregation(aggregation) {
435
+ this.aggregationUpdater = aggregation;
436
+ }
437
+ }, {
438
+ key: "_addDimension",
439
+ value: function _addDimension() {
440
+ var _this = this;
441
+ var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
442
+ dimensions.forEach(function (dimension) {
443
+ var key = dimension.key;
444
+ _this.dimensionUpdaters[key] = dimension;
445
+ });
446
+ }
447
+ }, {
448
+ key: "_needUpdateStep",
449
+ value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
450
+ // whether need to update current dimension step
451
+ // dimension step is the value, domain, scaleFunction of each dimension
452
+ // each step is an object with properties links to layer prop and whether the prop is
453
+ // controlled by updateTriggers
454
+ return Object.values(dimensionStep.triggers).some(function (item) {
455
+ if (item.updateTrigger) {
456
+ // check based on updateTriggers change first
457
+ return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
458
+ }
459
+ // fallback to direct comparison
460
+ return oldProps[item.prop] !== props[item.prop];
461
+ });
462
+ }
463
+ }, {
464
+ key: "_accumulateUpdaters",
465
+ value: function _accumulateUpdaters(step, props, dimension) {
466
+ var updaters = [];
467
+ for (var i = step; i < dimension.updateSteps.length; i++) {
468
+ var updater = dimension.updateSteps[i].updater;
469
+ if (typeof updater === 'function') {
470
+ updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
471
+ }
470
472
  }
471
- // fallback to direct comparison
472
- return oldProps[item.prop] !== props[item.prop];
473
- });
474
- }
475
- _accumulateUpdaters(step, props, dimension) {
476
- const updaters = [];
477
- for (let i = step; i < dimension.updateSteps.length; i++) {
478
- const updater = dimension.updateSteps[i].updater;
479
- if (typeof updater === 'function') {
480
- updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
473
+ return updaters;
474
+ }
475
+ }, {
476
+ key: "_getAllUpdaters",
477
+ value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
478
+ var _this2 = this;
479
+ var updaters = [];
480
+ var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
481
+ return _this2._needUpdateStep(step, oldProps, props, changeFlags);
482
+ });
483
+ if (needUpdateStep > -1) {
484
+ updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
481
485
  }
486
+ return updaters;
482
487
  }
483
- return updaters;
484
- }
485
- _getAllUpdaters(dimension, oldProps, props, changeFlags) {
486
- let updaters = [];
487
- const needUpdateStep = dimension.updateSteps.findIndex(step => this._needUpdateStep(step, oldProps, props, changeFlags));
488
- if (needUpdateStep > -1) {
489
- updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
488
+ }, {
489
+ key: "_getAggregationChanges",
490
+ value: function _getAggregationChanges(oldProps, props, changeFlags) {
491
+ var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
492
+ return updaters.length ? updaters : null;
490
493
  }
491
- return updaters;
492
- }
493
- _getAggregationChanges(oldProps, props, changeFlags) {
494
- const updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
495
- return updaters.length ? updaters : null;
496
- }
497
- _getDimensionChanges(oldProps, props, changeFlags) {
498
- let updaters = [];
494
+ }, {
495
+ key: "_getDimensionChanges",
496
+ value: function _getDimensionChanges(oldProps, props, changeFlags) {
497
+ var updaters = [];
499
498
 
500
- // get dimension to be updated
501
- for (const key in this.dimensionUpdaters) {
502
- // return the first triggered updater for each dimension
503
- const dimension = this.dimensionUpdaters[key];
504
- const dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
505
- updaters = updaters.concat(dimensionUpdaters);
499
+ // get dimension to be updated
500
+ for (var key in this.dimensionUpdaters) {
501
+ // return the first triggered updater for each dimension
502
+ var dimension = this.dimensionUpdaters[key];
503
+ var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
504
+ updaters = updaters.concat(dimensionUpdaters);
505
+ }
506
+ return updaters.length ? updaters : null;
506
507
  }
507
- return updaters.length ? updaters : null;
508
- }
509
- getUpdateTriggers(props) {
510
- const _updateTriggers = props.updateTriggers || {};
511
- const updateTriggers = {};
512
- for (const key in this.dimensionUpdaters) {
513
- const {
514
- accessor,
515
- updateSteps
516
- } = this.dimensionUpdaters[key];
517
- // fold dimension triggers into each accessor
518
- updateTriggers[accessor] = {};
519
- updateSteps.forEach(step => {
520
- Object.values(step.triggers || []).forEach(_ref => {
521
- let {
522
- prop,
523
- updateTrigger
524
- } = _ref;
525
- if (updateTrigger) {
526
- // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
527
- // and updateTriggers is passed in from layer prop
528
- // fold the updateTriggers into accessor
529
- const fromProp = _updateTriggers[updateTrigger];
530
- if (typeof fromProp === 'object' && !Array.isArray(fromProp)) {
531
- // if updateTrigger is an object spread it
532
- Object.assign(updateTriggers[accessor], fromProp);
533
- } else if (fromProp !== undefined) {
534
- updateTriggers[accessor][prop] = fromProp;
508
+ }, {
509
+ key: "getUpdateTriggers",
510
+ value: function getUpdateTriggers(props) {
511
+ var _this3 = this;
512
+ var _updateTriggers = props.updateTriggers || {};
513
+ var updateTriggers = {};
514
+ var _loop = function _loop() {
515
+ var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
516
+ accessor = _this3$dimensionUpdat.accessor,
517
+ updateSteps = _this3$dimensionUpdat.updateSteps;
518
+ // fold dimension triggers into each accessor
519
+ updateTriggers[accessor] = {};
520
+ updateSteps.forEach(function (step) {
521
+ Object.values(step.triggers || []).forEach(function (_ref) {
522
+ var prop = _ref.prop,
523
+ updateTrigger = _ref.updateTrigger;
524
+ if (updateTrigger) {
525
+ // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
526
+ // and updateTriggers is passed in from layer prop
527
+ // fold the updateTriggers into accessor
528
+ var fromProp = _updateTriggers[updateTrigger];
529
+ if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
530
+ // if updateTrigger is an object spread it
531
+ Object.assign(updateTriggers[accessor], fromProp);
532
+ } else if (fromProp !== undefined) {
533
+ updateTriggers[accessor][prop] = fromProp;
534
+ }
535
+ } else {
536
+ // if prop is not based on updateTrigger
537
+ updateTriggers[accessor][prop] = props[prop];
535
538
  }
536
- } else {
537
- // if prop is not based on updateTrigger
538
- updateTriggers[accessor][prop] = props[prop];
539
- }
539
+ });
540
540
  });
541
- });
541
+ };
542
+ for (var key in this.dimensionUpdaters) {
543
+ _loop();
544
+ }
545
+ return updateTriggers;
542
546
  }
543
- return updateTriggers;
544
- }
545
- getPickingInfo(_ref2, layerProps) {
546
- let {
547
- info
548
- } = _ref2;
549
- const isPicked = info.picked && info.index > -1;
550
- let object = null;
551
- if (isPicked) {
552
- const cell = this.state.layerData.data[info.index];
553
- let binInfo = {};
554
- for (const key in this.dimensionUpdaters) {
555
- const {
556
- getPickingInfo
557
- } = this.dimensionUpdaters[key];
558
- if (typeof getPickingInfo === 'function') {
559
- binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[key], cell, layerProps));
547
+ }, {
548
+ key: "getPickingInfo",
549
+ value: function getPickingInfo(_ref2, layerProps) {
550
+ var info = _ref2.info;
551
+ var isPicked = info.picked && info.index > -1;
552
+ var object = null;
553
+ if (isPicked) {
554
+ var cell = this.state.layerData.data[info.index];
555
+ var binInfo = {};
556
+ for (var key in this.dimensionUpdaters) {
557
+ var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
558
+ if (typeof _getPickingInfo === 'function') {
559
+ binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
560
+ }
560
561
  }
562
+ object = Object.assign(binInfo, cell, {
563
+ points: cell.filteredPoints || cell.points
564
+ });
561
565
  }
562
- object = Object.assign(binInfo, cell, {
563
- points: cell.filteredPoints || cell.points
566
+
567
+ // add bin and to info
568
+ return Object.assign(info, {
569
+ picked: Boolean(object),
570
+ // override object with picked cell
571
+ object: object
564
572
  });
565
573
  }
566
-
567
- // add bin and to info
568
- return Object.assign(info, {
569
- picked: Boolean(object),
570
- // override object with picked cell
571
- object
572
- });
573
- }
574
- getAccessor(dimensionKey, layerProps) {
575
- if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
576
- return nop;
574
+ }, {
575
+ key: "getAccessor",
576
+ value: function getAccessor(dimensionKey, layerProps) {
577
+ if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
578
+ return nop;
579
+ }
580
+ return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
577
581
  }
578
- return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
579
- }
580
- }
581
- exports.default = CPUAggregator;
582
- (0, _defineProperty2.default)(CPUAggregator, "getDimensionScale", void 0);
582
+ }], [{
583
+ key: "defaultDimensions",
584
+ value: function defaultDimensions() {
585
+ return _defaultDimensions;
586
+ }
587
+ }]);
588
+ }();
583
589
  CPUAggregator.getDimensionScale = getDimensionScale;
584
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJERUNLX0FHR1JFR0FUSU9OX01BUCIsImV4cG9ydHMiLCJTVU0iLCJBR0dSRUdBVElPTl9UWVBFUyIsInN1bSIsIk1FQU4iLCJhdmVyYWdlIiwiTUlOIiwibWluaW11bSIsIk1BWCIsIm1heGltdW0iLCJnZXRWYWx1ZUZ1bmMiLCJhZ2dyZWdhdGlvbiIsImFjY2Vzc29yIiwib3AiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwia2VwbGVyT3AiLCJwdHMiLCJhZ2dyZWdhdGUiLCJtYXAiLCJnZXRTY2FsZUZ1bmN0b3IiLCJzY2FsZVR5cGUiLCJTQ0FMRV9GVU5DIiwicXVhbnRpemUiLCJub3AiLCJnZXRHZXRWYWx1ZSIsInN0ZXAiLCJwcm9wcyIsImRpbWVuc2lvblVwZGF0ZXIiLCJrZXkiLCJ2YWx1ZSIsIndlaWdodCIsInRyaWdnZXJzIiwiZ2V0VmFsdWUiLCJwcm9wIiwiX3NldERpbWVuc2lvblN0YXRlIiwiZ2V0RGltZW5zaW9uU29ydGVkQmlucyIsInN0YXRlIiwiZGltZW5zaW9ucyIsInNvcnRlZEJpbnMiLCJCaW5Tb3J0ZXIiLCJsYXllckRhdGEiLCJkYXRhIiwiZmlsdGVyRGF0YSIsIl9maWx0ZXJEYXRhIiwiZ2V0RGltZW5zaW9uVmFsdWVEb21haW4iLCJsb3dlclBlcmNlbnRpbGUiLCJ1cHBlclBlcmNlbnRpbGUiLCJ2YWx1ZURvbWFpbiIsImdldFZhbHVlRG9tYWluQnlTY2FsZSIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsInJldmVyc2UiLCJnZXREaW1lbnNpb25TY2FsZSIsImRvbWFpbiIsInJhbmdlIiwib25TZXQiLCJkaW1lbnNpb25SYW5nZSIsImRpbWVuc2lvbkRvbWFpbiIsInNjYWxlVHlwZVByb3AiLCJzY2FsZUZ1bmN0b3IiLCJzY2FsZUZ1bmMiLCJzbGljZSIsImxlbmd0aCIsInVua25vd24iLCJVTktOT1dOX0NPTE9SIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdncmVnYXRvciIsImFnZ3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJ1cGRhdGVBbGxEaW1lbnNpb25zIiwiZGltZW5zaW9uQ2hhbmdlcyIsImRpbSIsInVwZGF0ZXJzIiwiX2FjY3VtdWxhdGVVcGRhdGVycyIsImNvbmNhdCIsImZvckVhY2giLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl9uZWVkVXBkYXRlU3RlcCIsImRpbWVuc2lvblN0ZXAiLCJ2YWx1ZXMiLCJzb21lIiwiaXRlbSIsInVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCIsImFsbCIsImkiLCJwdXNoIiwiYmluZCIsIl9nZXRBbGxVcGRhdGVycyIsIm5lZWRVcGRhdGVTdGVwIiwiZmluZEluZGV4IiwiZ2V0VXBkYXRlVHJpZ2dlcnMiLCJfdXBkYXRlVHJpZ2dlcnMiLCJ1cGRhdGVUcmlnZ2VycyIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB0eXBlIHtBZ2dyZWdhdGlvbk9wZXJhdGlvbn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmluU29ydGVyIGhhcyBiZWVuIHJlbW92ZWQgaW4gZGVjay5nbCA5LjEgc28gdGhpcyBlbnRpcmUgZmlsZSB3aWxsIG5vIGxvbmdlciB3b3JrICovXG5pbXBvcnQge19CaW5Tb3J0ZXIgYXMgQmluU29ydGVyfSBmcm9tICdAZGVjay5nbC9hZ2dyZWdhdGlvbi1sYXllcnMnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1RZUEVTLFxuICBTQ0FMRV9GVU5DLFxuICBTQ0FMRV9UWVBFUyxcbiAgVU5LTk9XTl9DT0xPUlxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge1JHQkFDb2xvciwgVmFsdWVPZn0gZnJvbSAnLi4vLi4vcmVkdWNlcnMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVA6IFBhcnRpYWw8UmVjb3JkPFxuICBBZ2dyZWdhdGlvbk9wZXJhdGlvbixcbiAgVmFsdWVPZjx0eXBlb2YgQUdHUkVHQVRJT05fVFlQRVM+XG4+PiA9IHtcbiAgU1VNOiBBR0dSRUdBVElPTl9UWVBFUy5zdW0sXG4gIE1FQU46IEFHR1JFR0FUSU9OX1RZUEVTLmF2ZXJhZ2UsXG4gIE1JTjogQUdHUkVHQVRJT05fVFlQRVMubWluaW11bSxcbiAgTUFYOiBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGdW5jKGFnZ3JlZ2F0aW9uLCBhY2Nlc3Nvcikge1xuICBjb25zdCBvcDogQWdncmVnYXRpb25PcGVyYXRpb24gPSBhZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWFnZ3JlZ2F0aW9uIHx8ICFERUNLX0FHR1JFR0FUSU9OX01BUFthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcCB8fCAnU1VNJ107XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQStETyxNQUFNSSxvQkFHWCxHQUFBQyxPQUFBLENBQUFELG9CQUFBLEdBQUc7RUFDSEUsR0FBRyxFQUFFQyxrQ0FBaUIsQ0FBQ0MsR0FBRztFQUMxQkMsSUFBSSxFQUFFRixrQ0FBaUIsQ0FBQ0csT0FBTztFQUMvQkMsR0FBRyxFQUFFSixrQ0FBaUIsQ0FBQ0ssT0FBTztFQUM5QkMsR0FBRyxFQUFFTixrQ0FBaUIsQ0FBQ087QUFDekIsQ0FBQztBQUVNLFNBQVNDLFlBQVlBLENBQUNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFO0VBQ2xELE1BQU1DLEVBQXdCLEdBQUdGLFdBQVcsQ0FBQ0csV0FBVyxDQUFD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
590
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJvcCIsInRvVXBwZXJDYXNlIiwiQ29uc29sZSIsIndhcm4iLCJjb25jYXQiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJyZXZlcnNlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJfc3RlcCR0cmlnZ2VyczMiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZVR5cGVQcm9wIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwic2xpY2UiLCJ1bmtub3duIiwiVU5LTk9XTl9DT0xPUiIsIl90eXBlb2YyIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdnciIsImFnZ3JlZ2F0b3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwib3B0cyIsIl9jbGFzc0NhbGxDaGVjazIiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJfY3JlYXRlQ2xhc3MyIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl90aGlzIiwiX25lZWRVcGRhdGVTdGVwIiwiZGltZW5zaW9uU3RlcCIsInZhbHVlcyIsInNvbWUiLCJpdGVtIiwidXBkYXRlVHJpZ2dlcnNDaGFuZ2VkIiwiYWxsIiwiaSIsImJpbmQiLCJfZ2V0QWxsVXBkYXRlcnMiLCJfdGhpczIiLCJuZWVkVXBkYXRlU3RlcCIsImZpbmRJbmRleCIsImdldFVwZGF0ZVRyaWdnZXJzIiwiX3RoaXMzIiwiX3VwZGF0ZVRyaWdnZXJzIiwidXBkYXRlVHJpZ2dlcnMiLCJfbG9vcCIsIl90aGlzMyRkaW1lbnNpb25VcGRhdCIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB0eXBlIHtBZ2dyZWdhdGlvbk9wZXJhdGlvbn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmluU29ydGVyIGhhcyBiZWVuIHJlbW92ZWQgaW4gZGVjay5nbCA5LjEgc28gdGhpcyBlbnRpcmUgZmlsZSB3aWxsIG5vIGxvbmdlciB3b3JrICovXG5pbXBvcnQge19CaW5Tb3J0ZXIgYXMgQmluU29ydGVyfSBmcm9tICdAZGVjay5nbC9hZ2dyZWdhdGlvbi1sYXllcnMnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1RZUEVTLFxuICBTQ0FMRV9GVU5DLFxuICBTQ0FMRV9UWVBFUyxcbiAgVU5LTk9XTl9DT0xPUlxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge1JHQkFDb2xvciwgVmFsdWVPZn0gZnJvbSAnLi4vLi4vcmVkdWNlcnMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVA6IFBhcnRpYWw8UmVjb3JkPFxuICBBZ2dyZWdhdGlvbk9wZXJhdGlvbixcbiAgVmFsdWVPZjx0eXBlb2YgQUdHUkVHQVRJT05fVFlQRVM+XG4+PiA9IHtcbiAgU1VNOiBBR0dSRUdBVElPTl9UWVBFUy5zdW0sXG4gIE1FQU46IEFHR1JFR0FUSU9OX1RZUEVTLmF2ZXJhZ2UsXG4gIE1JTjogQUdHUkVHQVRJT05fVFlQRVMubWluaW11bSxcbiAgTUFYOiBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGdW5jKGFnZ3JlZ2F0aW9uLCBhY2Nlc3Nvcikge1xuICBjb25zdCBvcDogQWdncmVnYXRpb25PcGVyYXRpb24gPSBhZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWFnZ3JlZ2F0aW9uIHx8ICFERUNLX0FHR1JFR0FUSU9OX01BUFthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcCB8fCAnU1VNJ107XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBSzBDLFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFsQixDQUFBLEVBQUFHLE1BQUEsQ0FBQWMseUJBQUEsQ0FBQWYsQ0FBQSxLQUFBSCxPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxHQUFBYSxPQUFBLFdBQUFkLENBQUEsSUFBQUUsTUFBQSxDQUFBZ0IsY0FBQSxDQUFBbkIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQU4sQ0FBQSxFQUFBRCxDQUFBLGlCQUFBRCxDQUFBLElBaEMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLGtDQUVBO0FBK0RPLElBQU1vQixvQkFHWCxHQUFBQyxPQUFBLENBQUFELG9CQUFBLEdBQUc7RUFDSEUsR0FBRyxFQUFFQyxrQ0FBaUIsQ0FBQ0MsR0FBRztFQUMxQkMsSUFBSSxFQUFFRixrQ0FBaUIsQ0FBQ0csT0FBTztFQUMvQkMsR0FBRyxFQUFFSixrQ0FBaUIsQ0FBQ0ssT0FBTztFQUM5QkMsR0FBRyxFQUFFTixrQ0FBaUIsQ0FBQ087QUFDekIsQ0FBQztBQUVNLFNBQVNDLFlBQVlBLENBQUNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFO0VBQ2xELElBQU1DLEVBQXdCLEdBQUdGLFdBQVcsQ0FBQ0csV0FBVyxDQUFDLENBQUM7RUFDMUQsSUFBSSxDQUFDSCxXQUFXLElBQUksQ0FBQ1osb0JBQW9CLENBQUNZLFdBQVcsQ0FBQ0csV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3BFQyxlQUFPLENBQUNDLElBQUksZ0JBQUFDLE1BQUEsQ0FBZ0JOLFdBQVcsc0JBQW1CLENBQUM7RUFDN0Q7RUFFQSxJQUFNTyxRQUFRLEdBQUduQixvQkFBb0IsQ0FBQ2MsRUFBRSxJQUFJLEtBQUssQ0FBQztFQUVsRCxPQUFPLFVBQUFNLEdBQUc7SUFBQSxPQUFJLElBQUFDLHlCQUFTLEVBQUNELEdBQUcsQ0FBQ0UsR0FBRyxDQUFDVCxRQUFRLENBQUMsRUFBRU0sUUFBUSxDQUFDO0VBQUE7QUFDdEQ7QUFFTyxTQUFTSSxlQUFlQSxDQUFDQyxTQUFTLEVBQUU7RUFDekMsSUFBSSxDQUFDQSxTQUFTLElBQUksQ0FBQ0MsMkJBQVUsQ0FBQ0QsU0FBUyxDQUFDLEVBQUU7SUFDeENSLGVBQU8sQ0FBQ0MsSUFBSSxVQUFBQyxNQUFBLENBQVVNLFNBQVMsc0JBQW1CLENBQUM7RUFDckQ7RUFDQSxPQUFPQywyQkFBVSxDQUFDRCxTQUFTLENBQUMsSUFBSUMsMkJBQVUsQ0FBQ0MsUUFBUTtBQUNyRDtBQUVBLFNBQVNDLEdBQUdBLENBQUEsRUFBRyxDQUFDO0FBRVQsU0FBU0MsV0FBV0EsQ0FBc0JDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxnQkFBZ0IsRUFBRTtFQUM5RSxJQUFPQyxHQUFHLEdBQUlELGdCQUFnQixDQUF2QkMsR0FBRztFQUNWLElBQUFDLGNBQUEsR0FBcUNKLElBQUksQ0FBQ0ssUUFBUTtJQUEzQ0MsS0FBSyxHQUFBRixjQUFBLENBQUxFLEtBQUs7SUFBRUMsTUFBTSxHQUFBSCxjQUFBLENBQU5HLE1BQU07SUFBRXhCLFdBQVcsR0FBQXFCLGNBQUEsQ0FBWHJCLFdBQVc7RUFFakMsSUFBSXlCLFFBQVEsR0FBR1AsS0FBSyxDQUFDSyxLQUFLLENBQUNHLElBQUksQ0FBQztFQUVoQyxJQUFJRCxRQUFRLEtBQUssSUFBSSxFQUFFO0lBQ3JCO0lBQ0FBLFFBQVEsR0FBRzFCLFlBQVksQ0FBQ21CLEtBQUssQ0FBQ2xCLFdBQVcsQ0FBQzBCLElBQUksQ0FBQyxFQUFFUixLQUFLLENBQUNNLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLENBQUM7RUFDdEU7RUFFQSxJQUFJRCxRQUFRLEVBQUU7SUFDWixJQUFJLENBQUNFLGtCQUFrQixDQUFDUCxHQUFHLEVBQUU7TUFBQ0ssUUFBUSxFQUFSQTtJQUFRLENBQUMsQ0FBQztFQUMxQztBQUNGO0FBRU8sU0FBU0csc0JBQXNCQSxDQUFzQlgsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLGdCQUFnQixFQUFFO0VBQ3pGLElBQU9DLEdBQUcsR0FBSUQsZ0JBQWdCLENBQXZCQyxHQUFHO0VBQ1YsSUFBT0ssUUFBUSxHQUFJLElBQUksQ0FBQ0ksS0FBSyxDQUFDQyxVQUFVLENBQUNWLEdBQUcsQ0FBQyxDQUF0Q0ssUUFBUTtFQUNmLElBQU1NLFVBQVUsR0FBRyxJQUFJQyw2QkFBUyxDQUFDLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxTQUFTLENBQUNDLElBQUksSUFBSSxFQUFFLEVBQUU7SUFDaEVULFFBQVEsRUFBUkEsUUFBUTtJQUNSVSxVQUFVLEVBQUVqQixLQUFLLENBQUNrQjtFQUNwQixDQUFDLENBQUM7RUFDRixJQUFJLENBQUNULGtCQUFrQixDQUFDUCxHQUFHLEVBQUU7SUFBQ1csVUFBVSxFQUFWQTtFQUFVLENBQUMsQ0FBQztBQUM1QztBQUVPLFNBQVNNLHVCQUF1QkEsQ0FBc0JwQixJQUFJLEVBQUVDLEtBQUssRUFBRUMsZ0JBQWdCLEVBQUU7RUFDMUYsSUFBT0MsR0FBRyxHQUFJRCxnQkFBZ0IsQ0FBdkJDLEdBQUc7RUFDVixJQUFBa0IsZUFBQSxHQUVJckIsSUFBSSxDQUROSyxRQUFRO0lBQUdpQixlQUFlLEdBQUFELGVBQUEsQ0FBZkMsZUFBZTtJQUFFQyxlQUFlLEdBQUFGLGVBQUEsQ0FBZkUsZUFBZTtJQUFFNUIsU0FBUyxHQUFBMEIsZUFBQSxDQUFUMUIsU0FBUztFQUd4RCxJQUFJLENBQUMsSUFBSSxDQUFDaUIsS0FBSyxDQUFDQyxVQUFVLENBQUNWLEdBQUcsQ0FBQyxDQUFDVyxVQUFVLEVBQUU7SUFDMUM7SUFDQTtFQUNGOztFQUVBO0VBQ0E7RUFDQSxJQUFNVSxXQUFXLEdBQUcsSUFBSSxDQUFDWixLQUFLLENBQUNDLFVBQVUsQ0FBQ1YsR0FBRyxDQUFDLENBQUNXLFVBQVUsQ0FBQ1cscUJBQXFCLENBQzdFeEIsS0FBSyxDQUFDTixTQUFTLENBQUNjLElBQUksQ0FBQyxFQUNyQixDQUFDUixLQUFLLENBQUNxQixlQUFlLENBQUNiLElBQUksQ0FBQyxFQUFFUixLQUFLLENBQUNzQixlQUFlLENBQUNkLElBQUksQ0FBQyxDQUMzRCxDQUFDO0VBRUQsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ1AsR0FBRyxFQUFFO0lBQzNCO0lBQ0FxQixXQUFXLEVBQUV2QixLQUFLLENBQUNOLFNBQVMsQ0FBQ2MsSUFBSSxDQUFDLEtBQUtpQiw0QkFBVyxDQUFDQyxPQUFPLEdBQUdILFdBQVcsQ0FBQ0ksT0FBTyxDQUFDLENBQUMsR0FBR0o7RUFDdkYsQ0FBQyxDQUFDO0FBQ0o7QUFFTyxTQUFTSyxpQkFBaUJBLENBQXNCN0IsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLGdCQUFnQixFQUFFO0VBQ3BGLElBQU9DLEdBQUcsR0FBSUQsZ0JBQWdCLENBQXZCQyxHQUFHO0VBQ1YsSUFBQTJCLGVBQUEsR0FBbUM5QixJQUFJLENBQUNLLFFBQVE7SUFBekMwQixNQUFNLEdBQUFELGVBQUEsQ0FBTkMsTUFBTTtJQUFFQyxLQUFLLEdBQUFGLGVBQUEsQ0FBTEUsS0FBSztJQUFFckMsU0FBUyxHQUFBbUMsZUFBQSxDQUFUbkMsU0FBUztFQUMvQixJQUFPc0MsS0FBSyxHQUFJakMsSUFBSSxDQUFiaUMsS0FBSztFQUNaLElBQUksQ0FBQyxJQUFJLENBQUNyQixLQUFLLENBQUNDLFVBQVUsQ0FBQ1YsR0FBRyxDQUFDLENBQUNxQixXQUFXLEVBQUU7SUFDM0M7SUFDQTtFQUNGO0VBRUEsSUFBTVUsY0FBYyxHQUFHakMsS0FBSyxDQUFDK0IsS0FBSyxDQUFDdkIsSUFBSSxDQUFDO0VBQ3hDLElBQU0wQixlQUFlLEdBQUdsQyxLQUFLLENBQUM4QixNQUFNLENBQUN0QixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUNHLEtBQUssQ0FBQ0MsVUFBVSxDQUFDVixHQUFHLENBQUMsQ0FBQ3FCLFdBQVc7RUFFcEYsSUFBTVksYUFBYSxHQUFHekMsU0FBUyxJQUFJTSxLQUFLLENBQUNOLFNBQVMsQ0FBQ2MsSUFBSSxDQUFDO0VBQ3hELElBQU00QixZQUFZLEdBQUczQyxlQUFlLENBQUMwQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0VBRXJELElBQU1FLFNBQVMsR0FBR0QsWUFBWSxDQUMzQk4sTUFBTSxDQUNMSyxhQUFhLEtBQUtWLDRCQUFXLENBQUNDLE9BQU8sR0FDakNRLGVBQWUsQ0FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRUwsY0FBYyxDQUFDckUsTUFBTSxDQUFDLEdBQy9Dc0UsZUFDTixDQUFDLENBQ0FILEtBQUssQ0FBQ0UsY0FBYyxDQUFDLENBQ3JCTSxPQUFPLENBQUNDLDhCQUFhLENBQUM7RUFFekIsSUFBSSxJQUFBQyxRQUFBLGFBQU9ULEtBQUssTUFBSyxRQUFRLElBQUksT0FBT2hDLEtBQUssQ0FBQ2dDLEtBQUssQ0FBQ2hDLEtBQUssQ0FBQyxLQUFLLFVBQVUsRUFBRTtJQUN6RUEsS0FBSyxDQUFDZ0MsS0FBSyxDQUFDaEMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDVyxLQUFLLENBQUNDLFVBQVUsQ0FBQ1YsR0FBRyxDQUFDLENBQUNxQixXQUFXLENBQUM7RUFDNUQ7RUFDQSxJQUFJLENBQUNkLGtCQUFrQixDQUFDUCxHQUFHLEVBQUU7SUFBQ21DLFNBQVMsRUFBVEE7RUFBUyxDQUFDLENBQUM7QUFDM0M7QUFFQSxTQUFTSyxlQUFlQSxDQUFBLEVBQXVDO0VBQUEsSUFBdENDLE1BQStCLEdBQUFoRixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBaUYsU0FBQSxHQUFBakYsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUMzRDtFQUNBLElBQUlnRixNQUFNLENBQUNFLFFBQVEsRUFBRTtJQUNuQixPQUFPNUYsTUFBTSxDQUFDNkYsTUFBTSxDQUFDO01BQUM5QixJQUFJLEVBQUUyQixNQUFNLENBQUNFO0lBQVEsQ0FBQyxFQUFFRixNQUFNLENBQUM7RUFDdkQsQ0FBQyxNQUFNLElBQUlBLE1BQU0sQ0FBQzVCLFNBQVMsRUFBRTtJQUMzQixPQUFPOUQsTUFBTSxDQUFDNkYsTUFBTSxDQUFDO01BQUM5QixJQUFJLEVBQUUyQixNQUFNLENBQUM1QjtJQUFTLENBQUMsRUFBRTRCLE1BQU0sQ0FBQztFQUN4RDtFQUVBLE9BQU9BLE1BQU07QUFDZjtBQUVPLFNBQVNJLGlCQUFpQkEsQ0FFL0JoRCxJQUFJLEVBQ0pDLEtBQUssRUFDTGxCLFdBQVcsRUFDWGtFLGlCQUFpQixFQUNqQjtFQUNBLElBQ3lCQyxJQUFJLEdBQ3pCbEQsSUFBSSxDQUROSyxRQUFRLENBQUc4QyxVQUFVO0VBRXZCLElBQU1BLFVBQVUsR0FBR2xELEtBQUssQ0FBQ2lELElBQUksQ0FBQ3pDLElBQUksQ0FBQzs7RUFFbkM7RUFDQTtFQUNBLElBQU1tQyxNQUFNLEdBQUdPLFVBQVUsQ0FBQ2xELEtBQUssRUFBRWdELGlCQUFpQixDQUFDO0VBQ25ELElBQUksQ0FBQ0csUUFBUSxDQUFDO0lBQ1pwQyxTQUFTLEVBQUUyQixlQUFlLENBQUNDLE1BQU07RUFDbkMsQ0FBQyxDQUFDO0FBQ0o7QUFFTyxJQUFNUyxrQkFBbUMsR0FBQWpGLE9BQUEsQ0FBQWlGLGtCQUFBLEdBQUc7RUFDakRsRCxHQUFHLEVBQUUsVUFBVTtFQUNmbUQsV0FBVyxFQUFFLENBQ1g7SUFDRW5ELEdBQUcsRUFBRSxXQUFXO0lBQ2hCRSxRQUFRLEVBQUU7TUFDUmtELFFBQVEsRUFBRTtRQUNSOUMsSUFBSSxFQUFFO01BQ1IsQ0FBQztNQUNEK0MsUUFBUSxFQUFFO1FBQ1IvQyxJQUFJLEVBQUUsYUFBYTtRQUNuQmdELGFBQWEsRUFBRTtNQUNqQixDQUFDO01BQ0ROLFVBQVUsRUFBRTtRQUNWMUMsSUFBSSxFQUFFO01BQ1I7SUFDRixDQUFDO0lBQ0RpRCxPQUFPLEVBQUVWO0VBQ1gsQ0FBQztBQUVMLENBQUM7QUFFRCxTQUFTVyxtQkFBbUJBLENBQUNDLGNBQWMsRUFBRUMsU0FBUyxFQUFFQyxVQUFVLEVBQUU7RUFDbEUsT0FBTyxVQUFBQyxJQUFJLEVBQUk7SUFDYixJQUFPakQsVUFBVSxHQUFlOEMsY0FBYyxDQUF2QzlDLFVBQVU7TUFBRXdCLFNBQVMsR0FBSXNCLGNBQWMsQ0FBM0J0QixTQUFTO0lBQzVCLElBQU0wQixHQUFHLEdBQUdsRCxVQUFVLENBQUNtRCxNQUFNLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDO0lBRXpDLElBQUlGLEdBQUcsSUFBSUEsR0FBRyxDQUFDRyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzNCO01BQ0EsT0FBT04sU0FBUyxDQUFDTyxTQUFTO0lBQzVCO0lBRUEsSUFBTUMsRUFBRSxHQUFHTCxHQUFHLElBQUlBLEdBQUcsQ0FBQzFELEtBQUs7SUFDM0I7O0lBRUE7O0lBRUE7SUFDQTtJQUNBLE9BQU9nQyxTQUFTLENBQUMrQixFQUFFLENBQUM7RUFDdEIsQ0FBQztBQUNIO0FBRU8sSUFBTUMscUJBQStDLEdBQUFsRyxPQUFBLENBQUFrRyxxQkFBQSxHQUFHO0VBQzdEbkUsR0FBRyxFQUFFLFdBQVc7RUFDaEJuQixRQUFRLEVBQUUsY0FBYztFQUN4QnVGLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBR1gsY0FBYyxFQUFFRyxJQUFJLEVBQUs7SUFDeEMsSUFBT2pELFVBQVUsR0FBSThDLGNBQWMsQ0FBNUI5QyxVQUFVO0lBQ2pCLElBQU0wRCxVQUFVLEdBQUcxRCxVQUFVLENBQUNtRCxNQUFNLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDLElBQUlwRCxVQUFVLENBQUNtRCxNQUFNLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDLENBQUM1RCxLQUFLO0lBQ3ZGLE9BQU87TUFBQ2tFLFVBQVUsRUFBVkE7SUFBVSxDQUFDO0VBQ3JCLENBQUM7RUFDREosU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ3ZCZCxXQUFXLEVBQUUsQ0FDWDtJQUNFbkQsR0FBRyxFQUFFLFVBQVU7SUFDZkUsUUFBUSxFQUFFO01BQ1JDLEtBQUssRUFBRTtRQUNMRyxJQUFJLEVBQUUsZUFBZTtRQUNyQmdELGFBQWEsRUFBRTtNQUNqQixDQUFDO01BQ0RsRCxNQUFNLEVBQUU7UUFDTkUsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QmdELGFBQWEsRUFBRTtNQUNqQixDQUFDO01BQ0QxRSxXQUFXLEVBQUU7UUFDWDBCLElBQUksRUFBRTtNQUNSO0lBQ0YsQ0FBQztJQUNEaUQsT0FBTyxFQUFFM0Q7RUFDWCxDQUFDLEVBQ0Q7SUFDRUksR0FBRyxFQUFFLFNBQVM7SUFDZEUsUUFBUSxFQUFFO01BQ1JjLFdBQVcsRUFBRTtRQUNYVixJQUFJLEVBQUUsYUFBYTtRQUNuQmdELGFBQWEsRUFBRTtNQUNqQjtJQUNGLENBQUM7SUFDREMsT0FBTyxFQUFFL0M7RUFDWCxDQUFDLEVBQ0Q7SUFDRVIsR0FBRyxFQUFFLFdBQVc7SUFDaEJFLFFBQVEsRUFBRTtNQUNSaUIsZUFBZSxFQUFFO1FBQ2ZiLElBQUksRUFBRTtNQUNSLENBQUM7TUFDRGMsZUFBZSxFQUFFO1FBQ2ZkLElBQUksRUFBRTtNQUNSLENBQUM7TUFDRGQsU0FBUyxFQUFFO1FBQUNjLElBQUksRUFBRTtNQUFnQjtJQUNwQyxDQUFDO0lBQ0RpRCxPQUFPLEVBQUV0QztFQUNYLENBQUMsRUFDRDtJQUNFakIsR0FBRyxFQUFFLGNBQWM7SUFDbkJFLFFBQVEsRUFBRTtNQUNSMEIsTUFBTSxFQUFFO1FBQUN0QixJQUFJLEVBQUU7TUFBYSxDQUFDO01BQzdCdUIsS0FBSyxFQUFFO1FBQUN2QixJQUFJLEVBQUU7TUFBWSxDQUFDO01BQzNCZCxTQUFTLEVBQUU7UUFBQ2MsSUFBSSxFQUFFO01BQWdCO0lBQ3BDLENBQUM7SUFDRHdCLEtBQUssRUFBRTtNQUNMaEMsS0FBSyxFQUFFO0lBQ1QsQ0FBQztJQUNEeUQsT0FBTyxFQUFFN0I7RUFDWCxDQUFDLENBQ0Y7RUFDRDhCLG1CQUFtQixFQUFuQkE7QUFDRixDQUFDO0FBRU0sSUFBTWMseUJBQWdELEdBQUFyRyxPQUFBLENBQUFxRyx5QkFBQSxHQUFHO0VBQzlEdEUsR0FBRyxFQUFFLFdBQVc7RUFDaEJuQixRQUFRLEVBQUUsY0FBYztFQUN4QnVGLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBR1gsY0FBYyxFQUFFRyxJQUFJLEVBQUs7SUFDeEMsSUFBT2pELFVBQVUsR0FBSThDLGNBQWMsQ0FBNUI5QyxVQUFVO0lBQ2pCLElBQU00RCxjQUFjLEdBQUc1RCxVQUFVLENBQUNtRCxNQUFNLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDLElBQUlwRCxVQUFVLENBQUNtRCxNQUFNLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDLENBQUM1RCxLQUFLO0lBQzNGLE9BQU87TUFBQ29FLGNBQWMsRUFBZEE7SUFBYyxDQUFDO0VBQ3pCLENBQUM7RUFDRE4sU0FBUyxFQUFFLENBQUMsQ0FBQztFQUNiZCxXQUFXLEVBQUUsQ0FDWDtJQUNFbkQsR0FBRyxFQUFFLFVBQVU7SUFDZkUsUUFBUSxFQUFFO01BQ1JDLEtBQUssRUFBRTtRQUNMRyxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCZ0QsYUFBYSxFQUFFO01BQ2pCLENBQUM7TUFDRGxELE1BQU0sRUFBRTtRQUNORSxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCZ0QsYUFBYSxFQUFFO01BQ2pCLENBQUM7TUFDRDFFLFdBQVcsRUFBRTtRQUNYMEIsSUFBSSxFQUFFO01BQ1I7SUFDRixDQUFDO0lBQ0RpRCxPQUFPLEVBQUUzRDtFQUNYLENBQUMsRUFDRDtJQUNFSSxHQUFHLEVBQUUsU0FBUztJQUNkRSxRQUFRLEVBQUU7TUFDUmMsV0FBVyxFQUFFO1FBQ1hWLElBQUksRUFBRSxhQUFhO1FBQ25CZ0QsYUFBYSxFQUFFO01BQ2pCO0lBQ0YsQ0FBQztJQUNEQyxPQUFPLEVBQUUvQztFQUNYLENBQUMsRUFDRDtJQUNFUixHQUFHLEVBQUUsV0FBVztJQUNoQkUsUUFBUSxFQUFFO01BQ1JpQixlQUFlLEVBQUU7UUFDZmIsSUFBSSxFQUFFO01BQ1IsQ0FBQztNQUNEYyxlQUFlLEVBQUU7UUFDZmQsSUFBSSxFQUFFO01BQ1IsQ0FBQztNQUNEZCxTQUFTLEVBQUU7UUFBQ2MsSUFBSSxFQUFFO01BQW9CO0lBQ3hDLENBQUM7SUFDRGlELE9BQU8sRUFBRXRDO0VBQ1gsQ0FBQyxFQUNEO0lBQ0VqQixHQUFHLEVBQUUsY0FBYztJQUNuQkUsUUFBUSxFQUFFO01BQ1IwQixNQUFNLEVBQUU7UUFBQ3RCLElBQUksRUFBRTtNQUFpQixDQUFDO01BQ2pDdUIsS0FBSyxFQUFFO1FBQUN2QixJQUFJLEVBQUU7TUFBZ0IsQ0FBQztNQUMvQmQsU0FBUyxFQUFFO1FBQUNjLElBQUksRUFBRTtNQUFvQjtJQUN4QyxDQUFDO0lBQ0R3QixLQUFLLEVBQUU7TUFDTGhDLEtBQUssRUFBRTtJQUNULENBQUM7SUFDRHlELE9BQU8sRUFBRTdCO0VBQ1gsQ0FBQyxDQUNGO0VBQ0Q4QixtQkFBbUIsRUFBbkJBO0FBQ0YsQ0FBQztBQUVNLElBQU1nQixrQkFBaUIsR0FBQXZHLE9BQUEsQ0FBQXVHLGlCQUFBLEdBQUcsQ0FBQ0wscUJBQXFCLEVBQUVHLHlCQUF5QixDQUFDO0FBQUMsSUFJL0RHLGFBQWEsR0FBQXhHLE9BQUE7RUFNaEMsU0FBQXdHLGNBQUEsRUFNRTtJQUFBLElBTEFDLElBSUMsR0FBQWpILFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFpRixTQUFBLEdBQUFqRixTQUFBLE1BQUcsQ0FBQyxDQUFDO0lBQUEsSUFBQWtILGdCQUFBLG1CQUFBRixhQUFBO0lBRU4sSUFBSSxDQUFDaEUsS0FBSyxHQUFBakQsYUFBQTtNQUNScUQsU0FBUyxFQUFFLENBQUMsQ0FBQztNQUNiSCxVQUFVLEVBQUU7UUFDVjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7TUFBQTtJQUNELEdBQ0VnRSxJQUFJLENBQUNFLFlBQVksQ0FDckI7SUFFRCxJQUFJLENBQUNDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUNDLGtCQUFrQixHQUFHSixJQUFJLENBQUM5RixXQUFXLElBQUlzRSxrQkFBa0I7SUFFaEUsSUFBSSxDQUFDNkIsYUFBYSxDQUFDTCxJQUFJLENBQUNoRSxVQUFVLElBQUk4RCxrQkFBaUIsQ0FBQztFQUMxRDtFQUFDLFdBQUFRLGFBQUEsYUFBQVAsYUFBQTtJQUFBekUsR0FBQTtJQUFBRyxLQUFBLEVBTUQsU0FBQThFLG1CQUFtQkEsQ0FBQ25GLEtBQUssRUFBRTtNQUN6QixJQUFJb0YsZ0JBQXFDLEdBQUcsRUFBRTtNQUM5QztNQUNBLEtBQUssSUFBTUMsR0FBRyxJQUFJLElBQUksQ0FBQ04saUJBQWlCLEVBQUU7UUFDeEMsSUFBTU8sUUFBUSxHQUFHLElBQUksQ0FBQ0MsbUJBQW1CLENBQUMsQ0FBQyxFQUFFdkYsS0FBSyxFQUFFLElBQUksQ0FBQytFLGlCQUFpQixDQUFDTSxHQUFHLENBQUMsQ0FBQztRQUNoRkQsZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDaEcsTUFBTSxDQUFDa0csUUFBUSxDQUFDO01BQ3REO01BRUFGLGdCQUFnQixDQUFDdkgsT0FBTyxDQUFDLFVBQUEySCxDQUFDO1FBQUEsT0FBSSxPQUFPQSxDQUFDLEtBQUssVUFBVSxJQUFJQSxDQUFDLENBQUMsQ0FBQztNQUFBLEVBQUM7SUFDL0Q7RUFBQztJQUFBdEYsR0FBQTtJQUFBRyxLQUFBLEVBRUQsU0FBQW9GLGlCQUFpQkEsQ0FBQ3pGLEtBQUssRUFBRWdELGlCQUFpQixFQUFFO01BQzFDLElBQU1zQyxRQUFRLEdBQUcsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUV2RixLQUFLLEVBQUUsSUFBSSxDQUFDZ0Ysa0JBQWtCLENBQUM7TUFDNUVNLFFBQVEsQ0FBQ3pILE9BQU8sQ0FBQyxVQUFBMkgsQ0FBQztRQUFBLE9BQUksT0FBT0EsQ0FBQyxLQUFLLFVBQVUsSUFBSUEsQ0FBQyxDQUFDeEMsaUJBQWlCLENBQUM7TUFBQSxFQUFDO0lBQ3hFO0VBQUM7SUFBQTlDLEdBQUE7SUFBQUcsS0FBQSxFQUVELFNBQUFxRixXQUFXQSxDQUFDZCxJQUFJLEVBQUU1QixpQkFBaUIsRUFBRTtNQUNuQyxJQUFPMkMsUUFBUSxHQUF3QmYsSUFBSSxDQUFwQ2UsUUFBUTtRQUFFM0YsS0FBSyxHQUFpQjRFLElBQUksQ0FBMUI1RSxLQUFLO1FBQUU0RixXQUFXLEdBQUloQixJQUFJLENBQW5CZ0IsV0FBVztNQUNuQyxJQUFJUixnQkFBcUMsR0FBRyxFQUFFO01BRTlDLElBQUlRLFdBQVcsQ0FBQ0MsV0FBVyxFQUFFO1FBQzNCO1FBQ0EsSUFBSSxDQUFDSixpQkFBaUIsQ0FBQ3pGLEtBQUssRUFBRWdELGlCQUFpQixDQUFDO1FBQ2hELElBQUksQ0FBQ21DLG1CQUFtQixDQUFDbkYsS0FBSyxDQUFDO1FBRS9CLE9BQU8sSUFBSSxDQUFDVyxLQUFLO01BQ25CO01BRUEsSUFBTW1GLGtCQUFrQixHQUFHLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNKLFFBQVEsRUFBRTNGLEtBQUssRUFBRTRGLFdBQVcsQ0FBQztNQUVwRixJQUFJRSxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUNsSSxNQUFNLEVBQUU7UUFDbkQ7UUFDQWtJLGtCQUFrQixDQUFDakksT0FBTyxDQUFDLFVBQUEySCxDQUFDO1VBQUEsT0FBSSxPQUFPQSxDQUFDLEtBQUssVUFBVSxJQUFJQSxDQUFDLENBQUN4QyxpQkFBaUIsQ0FBQztRQUFBLEVBQUM7UUFDaEYsSUFBSSxDQUFDbUMsbUJBQW1CLENBQUNuRixLQUFLLENBQUM7TUFDakMsQ0FBQyxNQUFNO1FBQ0w7UUFDQW9GLGdCQUFnQixHQUFHLElBQUksQ0FBQ1ksb0JBQW9CLENBQUNMLFFBQVEsRUFBRTNGLEtBQUssRUFBRTRGLFdBQVcsQ0FBQyxJQUFJLEVBQUU7UUFDaEZSLGdCQUFnQixDQUFDdkgsT0FBTyxDQUFDLFVBQUEySCxDQUFDO1VBQUEsT0FBSSxPQUFPQSxDQUFDLEtBQUssVUFBVSxJQUFJQSxDQUFDLENBQUMsQ0FBQztRQUFBLEVBQUM7TUFDL0Q7TUFFQSxPQUFPLElBQUksQ0FBQzdFLEtBQUs7SUFDbkI7O0lBRUE7RUFBQTtJQUFBVCxHQUFBO0lBQUFHLEtBQUEsRUFDQSxTQUFBOEMsUUFBUUEsQ0FBQzhDLFlBQVksRUFBRTtNQUNyQixJQUFJLENBQUN0RixLQUFLLEdBQUcxRCxNQUFNLENBQUM2RixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDbkMsS0FBSyxFQUFFc0YsWUFBWSxDQUFDO0lBQzFEOztJQUVBO0VBQUE7SUFBQS9GLEdBQUE7SUFBQUcsS0FBQSxFQUNBLFNBQUFJLGtCQUFrQkEsQ0FBQ1AsR0FBRyxFQUFFK0YsWUFBWSxFQUFFO01BQ3BDLElBQUksQ0FBQzlDLFFBQVEsQ0FBQztRQUNadkMsVUFBVSxFQUFFM0QsTUFBTSxDQUFDNkYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ25DLEtBQUssQ0FBQ0MsVUFBVSxNQUFBOUMsZ0JBQUEsaUJBQ2hEb0MsR0FBRyxFQUFHakQsTUFBTSxDQUFDNkYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ25DLEtBQUssQ0FBQ0MsVUFBVSxDQUFDVixHQUFHLENBQUMsRUFBRStGLFlBQVksQ0FBQyxDQUNuRTtNQUNILENBQUMsQ0FBQztJQUNKO0VBQUM7SUFBQS9GLEdBQUE7SUFBQUcsS0FBQSxFQUVELFNBQUE2RixlQUFlQSxDQUFDcEgsV0FBNEIsRUFBRTtNQUM1QyxJQUFJLENBQUNrRyxrQkFBa0IsR0FBR2xHLFdBQVc7SUFDdkM7RUFBQztJQUFBb0IsR0FBQTtJQUFBRyxLQUFBLEVBRUQsU0FBQTRFLGFBQWFBLENBQUEsRUFBbUM7TUFBQSxJQUFBa0IsS0FBQTtNQUFBLElBQWxDdkYsVUFBMkIsR0FBQWpELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFpRixTQUFBLEdBQUFqRixTQUFBLE1BQUcsRUFBRTtNQUM1Q2lELFVBQVUsQ0FBQy9DLE9BQU8sQ0FBQyxVQUFBK0YsU0FBUyxFQUFJO1FBQzlCLElBQU8xRCxHQUFHLEdBQUkwRCxTQUFTLENBQWhCMUQsR0FBRztRQUNWaUcsS0FBSSxDQUFDcEIsaUJBQWlCLENBQUM3RSxHQUFHLENBQUMsR0FBRzBELFNBQVM7TUFDekMsQ0FBQyxDQUFDO0lBQ0o7RUFBQztJQUFBMUQsR0FBQTtJQUFBRyxLQUFBLEVBRUQsU0FBQStGLGVBQWVBLENBQ2JDLGFBQTJELEVBQzNEVixRQUFRLEVBQ1IzRixLQUFLLEVBQ0w0RixXQUFXLEVBQ1g7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLE9BQU8zSSxNQUFNLENBQUNxSixNQUFNLENBQUNELGFBQWEsQ0FBQ2pHLFFBQVEsQ0FBQyxDQUFDbUcsSUFBSSxDQUFDLFVBQUFDLElBQUksRUFBSTtRQUN4RCxJQUFJQSxJQUFJLENBQUNoRCxhQUFhLEVBQUU7VUFDdEI7VUFDQSxPQUNFb0MsV0FBVyxDQUFDYSxxQkFBcUIsS0FDaENiLFdBQVcsQ0FBQ2EscUJBQXFCLENBQUNDLEdBQUcsSUFDcENkLFdBQVcsQ0FBQ2EscUJBQXFCLENBQUNELElBQUksQ0FBQ2hELGFBQWEsQ0FBQyxDQUFDO1FBRTVEO1FBQ0E7UUFDQSxPQUFPbUMsUUFBUSxDQUFDYSxJQUFJLENBQUNoRyxJQUFJLENBQUMsS0FBS1IsS0FBSyxDQUFDd0csSUFBSSxDQUFDaEcsSUFBSSxDQUFDO01BQ2pELENBQUMsQ0FBQztJQUNKO0VBQUM7SUFBQU4sR0FBQTtJQUFBRyxLQUFBLEVBRUQsU0FBQWtGLG1CQUFtQkEsQ0FDakJ4RixJQUFJLEVBQ0pDLEtBQUssRUFDTDRELFNBQTRCLEVBQzVCO01BSUEsSUFBTTBCLFFBQXVCLEdBQUcsRUFBRTtNQUNsQyxLQUFLLElBQUlxQixDQUFDLEdBQUc1RyxJQUFJLEVBQUU0RyxDQUFDLEdBQUcvQyxTQUFTLENBQUNQLFdBQVcsQ0FBQ3pGLE1BQU0sRUFBRStJLENBQUMsRUFBRSxFQUFFO1FBQ3hELElBQU1sRCxPQUFPLEdBQUdHLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDc0QsQ0FBQyxDQUFDLENBQUNsRCxPQUFPO1FBQ2hELElBQUksT0FBT0EsT0FBTyxLQUFLLFVBQVUsRUFBRTtVQUNqQzZCLFFBQVEsQ0FBQzlILElBQUksQ0FDWGlHLE9BQU8sQ0FBQ21ELElBQUksQ0FBQyxJQUFJLEVBQUVoRCxTQUFTLENBQUNQLFdBQVcsQ0FBQ3NELENBQUMsQ0FBQyxFQUFFM0csS0FBSyxFQUFFNEQsU0FBUyxDQUMvRCxDQUFDO1FBQ0g7TUFDRjtNQUVBLE9BQU8wQixRQUFRO0lBQ2pCO0VBQUM7SUFBQXBGLEdBQUE7SUFBQUcsS0FBQSxFQUVELFNBQUF3RyxlQUFlQSxDQUNiakQsU0FBNEIsRUFDNUIrQixRQUFRLEVBQ1IzRixLQUFLLEVBQ0w0RixXQUFXLEVBQ1g7TUFBQSxJQUFBa0IsTUFBQTtNQUlBLElBQUl4QixRQUF1QixHQUFHLEVBQUU7TUFDaEMsSUFBTXlCLGNBQWMsR0FBR25ELFNBQVMsQ0FBQ1AsV0FBVyxDQUFDMkQsU0FBUyxDQUFDLFVBQUFqSCxJQUFJO1FBQUEsT0FDekQrRyxNQUFJLENBQUNWLGVBQWUsQ0FBQ3JHLElBQUksRUFBRTRGLFFBQVEsRUFBRTNGLEtBQUssRUFBRTRGLFdBQVcsQ0FBQztNQUFBLENBQzFELENBQUM7TUFFRCxJQUFJbUIsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3ZCekIsUUFBUSxHQUFHQSxRQUFRLENBQUNsRyxNQUFNLENBQUMsSUFBSSxDQUFDbUcsbUJBQW1CLENBQUN3QixjQUFjLEVBQUUvRyxLQUFLLEVBQUU0RCxTQUFTLENBQUMsQ0FBQztNQUN4RjtNQUVBLE9BQU8wQixRQUFRO0lBQ2pCO0VBQUM7SUFBQXBGLEdBQUE7SUFBQUcsS0FBQSxFQUVELFNBQUEwRixzQkFBc0JBLENBQUNKLFFBQVEsRUFBRTNGLEtBQUssRUFBRTRGLFdBQVcsRUFBRTtNQUNuRCxJQUFNTixRQUFRLEdBQUcsSUFBSSxDQUFDdUIsZUFBZSxDQUFDLElBQUksQ0FBQzdCLGtCQUFrQixFQUFFVyxRQUFRLEVBQUUzRixLQUFLLEVBQUU0RixXQUFXLENBQUM7TUFDNUYsT0FBT04sUUFBUSxDQUFDMUgsTUFBTSxHQUFHMEgsUUFBUSxHQUFHLElBQUk7SUFDMUM7RUFBQztJQUFBcEYsR0FBQTtJQUFBRyxLQUFBLEVBRUQsU0FBQTJGLG9CQUFvQkEsQ0FBQ0wsUUFBUSxFQUFFM0YsS0FBSyxFQUFFNEYsV0FBVyxFQUFFO01BQ2pELElBQUlOLFFBQTZCLEdBQUcsRUFBRTs7TUFFdEM7TUFDQSxLQUFLLElBQU1wRixHQUFHLElBQUksSUFBSSxDQUFDNkUsaUJBQWlCLEVBQUU7UUFDeEM7UUFDQSxJQUFNbkIsU0FBUyxHQUFHLElBQUksQ0FBQ21CLGlCQUFpQixDQUFDN0UsR0FBRyxDQUFDO1FBQzdDLElBQU02RSxpQkFBaUIsR0FBRyxJQUFJLENBQUM4QixlQUFlLENBQUNqRCxTQUFTLEVBQUUrQixRQUFRLEVBQUUzRixLQUFLLEVBQUU0RixXQUFXLENBQUM7UUFDdkZOLFFBQVEsR0FBR0EsUUFBUSxDQUFDbEcsTUFBTSxDQUFDMkYsaUJBQWlCLENBQUM7TUFDL0M7TUFFQSxPQUFPTyxRQUFRLENBQUMxSCxNQUFNLEdBQUcwSCxRQUFRLEdBQUcsSUFBSTtJQUMxQztFQUFDO0lBQUFwRixHQUFBO0lBQUFHLEtBQUEsRUFFRCxTQUFBNEcsaUJBQWlCQSxDQUFDakgsS0FBSyxFQUFFO01BQUEsSUFBQWtILE1BQUE7TUFDdkIsSUFBTUMsZUFBZSxHQUFHbkgsS0FBSyxDQUFDb0gsY0FBYyxJQUFJLENBQUMsQ0FBQztNQUNsRCxJQUFNQSxjQUFjLEdBQUcsQ0FBQyxDQUFDO01BQUMsSUFBQUMsS0FBQSxZQUFBQSxNQUFBLEVBRWdCO1FBQ3hDLElBQUFDLHFCQUFBLEdBR2dESixNQUFJLENBQUNuQyxpQkFBaUIsQ0FBQzdFLEdBQUcsQ0FBQztVQUZ6RW5CLFFBQVEsR0FBQXVJLHFCQUFBLENBQVJ2SSxRQUFRO1VBQ1JzRSxXQUFXLEdBQUFpRSxxQkFBQSxDQUFYakUsV0FBVztRQUViO1FBQ0ErRCxjQUFjLENBQUNySSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0JzRSxXQUFXLENBQUN4RixPQUFPLENBQUMsVUFBQWtDLElBQUksRUFBSTtVQUMxQjlDLE1BQU0sQ0FBQ3FKLE1BQU0sQ0FBQ3ZHLElBQUksQ0FBQ0ssUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDdkMsT0FBTyxDQUFDLFVBQUEwSixJQUFBLEVBQTJCO1lBQUEsSUFBekIvRyxJQUFJLEdBQUErRyxJQUFBLENBQUovRyxJQUFJO2NBQUVnRCxhQUFhLEdBQUErRCxJQUFBLENBQWIvRCxhQUFhO1lBQzlELElBQUlBLGFBQWEsRUFBRTtjQUNqQjtjQUNBO2NBQ0E7Y0FDQSxJQUFNZ0UsUUFBUSxHQUFHTCxlQUFlLENBQUMzRCxhQUFhLENBQUM7Y0FDL0MsSUFBSSxJQUFBZixRQUFBLGFBQU8rRSxRQUFRLE1BQUssUUFBUSxJQUFJLENBQUNDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRixRQUFRLENBQUMsRUFBRTtnQkFDNUQ7Z0JBQ0F2SyxNQUFNLENBQUM2RixNQUFNLENBQUNzRSxjQUFjLENBQUNySSxRQUFRLENBQUMsRUFBRXlJLFFBQVEsQ0FBQztjQUNuRCxDQUFDLE1BQU0sSUFBSUEsUUFBUSxLQUFLNUUsU0FBUyxFQUFFO2dCQUNqQ3dFLGNBQWMsQ0FBQ3JJLFFBQVEsQ0FBQyxDQUFDeUIsSUFBSSxDQUFDLEdBQUdnSCxRQUFRO2NBQzNDO1lBQ0YsQ0FBQyxNQUFNO2NBQ0w7Y0FDQUosY0FBYyxDQUFDckksUUFBUSxDQUFDLENBQUN5QixJQUFJLENBQUMsR0FBR1IsS0FBSyxDQUFDUSxJQUFJLENBQUM7WUFDOUM7VUFDRixDQUFDLENBQUM7UUFDSixDQUFDLENBQUM7TUFDSixDQUFDO01BM0JELEtBQUssSUFBTU4sR0FBRyxJQUFJLElBQUksQ0FBQzZFLGlCQUFpQjtRQUFBc0MsS0FBQTtNQUFBO01BNkJ4QyxPQUFPRCxjQUFjO0lBQ3ZCO0VBQUM7SUFBQWxILEdBQUE7SUFBQUcsS0FBQSxFQUVELFNBQUFpRSxjQUFjQSxDQUFBcUQsS0FBQSxFQUFTOUQsVUFBVSxFQUFFO01BQUEsSUFBbkIrRCxJQUFJLEdBQUFELEtBQUEsQ0FBSkMsSUFBSTtNQUNsQixJQUFNQyxRQUFRLEdBQUdELElBQUksQ0FBQ0UsTUFBTSxJQUFJRixJQUFJLENBQUMzRCxLQUFLLEdBQUcsQ0FBQyxDQUFDO01BQy9DLElBQUk4RCxNQUFNLEdBQUcsSUFBSTtNQUVqQixJQUFJRixRQUFRLEVBQUU7UUFDWixJQUFNL0QsSUFBSSxHQUFHLElBQUksQ0FBQ25ELEtBQUssQ0FBQ0ksU0FBUyxDQUFDQyxJQUFJLENBQUM0RyxJQUFJLENBQUMzRCxLQUFLLENBQUM7UUFFbEQsSUFBSStELE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsS0FBSyxJQUFNOUgsR0FBRyxJQUFJLElBQUksQ0FBQzZFLGlCQUFpQixFQUFFO1VBQ3hDLElBQU9ULGVBQWMsR0FBSSxJQUFJLENBQUNTLGlCQUFpQixDQUFDN0UsR0FBRyxDQUFDLENBQTdDb0UsY0FBYztVQUNyQixJQUFJLE9BQU9BLGVBQWMsS0FBSyxVQUFVLEVBQUU7WUFDeEMwRCxPQUFPLEdBQUcvSyxNQUFNLENBQUM2RixNQUFNLENBQ3JCLENBQUMsQ0FBQyxFQUNGa0YsT0FBTyxFQUNQMUQsZUFBYyxDQUFDLElBQUksQ0FBQzNELEtBQUssQ0FBQ0MsVUFBVSxDQUFDVixHQUFHLENBQUMsRUFBRTRELElBQUksRUFBRUQsVUFBVSxDQUM3RCxDQUFDO1VBQ0g7UUFDRjtRQUVBa0UsTUFBTSxHQUFHOUssTUFBTSxDQUFDNkYsTUFBTSxDQUFDa0YsT0FBTyxFQUFFbEUsSUFBSSxFQUFFO1VBQ3BDbUUsTUFBTSxFQUFFbkUsSUFBSSxDQUFDb0UsY0FBYyxJQUFJcEUsSUFBSSxDQUFDbUU7UUFDdEMsQ0FBQyxDQUFDO01BQ0o7O01BRUE7TUFDQSxPQUFPaEwsTUFBTSxDQUFDNkYsTUFBTSxDQUFDOEUsSUFBSSxFQUFFO1FBQ3pCRSxNQUFNLEVBQUVLLE9BQU8sQ0FBQ0osTUFBTSxDQUFDO1FBQ3ZCO1FBQ0FBLE1BQU0sRUFBTkE7TUFDRixDQUFDLENBQUM7SUFDSjtFQUFDO0lBQUE3SCxHQUFBO0lBQUFHLEtBQUEsRUFFRCxTQUFBK0gsV0FBV0EsQ0FBQ0MsWUFBWSxFQUFFeEUsVUFBVSxFQUFFO01BQ3BDLElBQUksQ0FBQyxJQUFJLENBQUNrQixpQkFBaUIsQ0FBQ3VELGNBQWMsQ0FBQ0QsWUFBWSxDQUFDLEVBQUU7UUFDeEQsT0FBT3hJLEdBQUc7TUFDWjtNQUNBLE9BQU8sSUFBSSxDQUFDa0YsaUJBQWlCLENBQUNzRCxZQUFZLENBQUMsQ0FBQzNFLG1CQUFtQixDQUM3RCxJQUFJLENBQUMvQyxLQUFLLENBQUNDLFVBQVUsQ0FBQ3lILFlBQVksQ0FBQyxFQUNuQyxJQUFJLENBQUN0RCxpQkFBaUIsQ0FBQ3NELFlBQVksQ0FBQyxFQUNwQ3hFLFVBQ0YsQ0FBQztJQUNIO0VBQUM7SUFBQTNELEdBQUE7SUFBQUcsS0FBQSxFQTFPRCxTQUFPcUUsaUJBQWlCQSxDQUFBLEVBQUc7TUFDekIsT0FBT0Esa0JBQWlCO0lBQzFCO0VBQUM7QUFBQTtBQTJPSEMsYUFBYSxDQUFDL0MsaUJBQWlCLEdBQUdBLGlCQUFpQiIsImlnbm9yZUxpc3QiOltdfQ==