@carto/kepler.gl 0.0.76 → 0.0.78-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +652 -42
- package/dist/actions/action-wrapper.js +49 -21
- package/dist/actions/actions.js +30 -16
- package/dist/actions/identity-actions.js +28 -14
- package/dist/actions/index.js +24 -7
- package/dist/actions/map-state-actions.js +27 -12
- package/dist/actions/map-style-actions.js +69 -31
- package/dist/actions/provider-actions.js +81 -44
- package/dist/actions/ui-state-actions.js +166 -71
- package/dist/actions/vis-state-actions.js +78 -106
- package/dist/cloud-providers/index.js +8 -8
- package/dist/cloud-providers/provider.js +109 -63
- package/dist/components/bottom-widget.js +58 -53
- package/dist/components/common/action-panel.js +41 -44
- package/dist/components/common/animation-control/animation-control.js +44 -44
- package/dist/components/common/animation-control/animation-controller.js +109 -55
- package/dist/components/common/animation-control/animation-speed-slider.js +38 -29
- package/dist/components/common/animation-control/floating-time-display.js +73 -58
- package/dist/components/common/animation-control/playback-controls.js +81 -67
- package/dist/components/common/animation-control/speed-control.js +24 -26
- package/dist/components/common/checkbox.js +54 -49
- package/dist/components/common/color-legend.js +71 -51
- package/dist/components/common/data-table/button.js +23 -30
- package/dist/components/common/data-table/canvas.js +10 -21
- package/dist/components/common/data-table/cell-size.js +58 -54
- package/dist/components/common/data-table/grid.js +51 -35
- package/dist/components/common/data-table/index.js +150 -109
- package/dist/components/common/data-table/option-dropdown.js +33 -29
- package/dist/components/common/dataset-label.js +15 -23
- package/dist/components/common/error-boundary.js +30 -25
- package/dist/components/common/field-selector.js +67 -67
- package/dist/components/common/field-token.js +17 -22
- package/dist/components/common/file-uploader/file-drop.js +66 -46
- package/dist/components/common/file-uploader/file-upload-progress.js +32 -33
- package/dist/components/common/file-uploader/file-upload.js +91 -52
- package/dist/components/common/file-uploader/upload-button.js +56 -82
- package/dist/components/common/histogram-plot.js +37 -35
- package/dist/components/common/icons/add.js +26 -32
- package/dist/components/common/icons/anchor_window.js +8 -8
- package/dist/components/common/icons/arrow-down-alt.js +26 -32
- package/dist/components/common/icons/arrow-down-solid.js +58 -0
- package/dist/components/common/icons/arrow-down.js +26 -32
- package/dist/components/common/icons/arrow-left.js +26 -32
- package/dist/components/common/icons/arrow-right.js +26 -32
- package/dist/components/common/icons/arrow-up-alt.js +26 -32
- package/dist/components/common/icons/arrow-up-solid.js +26 -32
- package/dist/components/common/icons/arrow-up.js +26 -32
- package/dist/components/common/icons/base.js +42 -52
- package/dist/components/common/icons/bug.js +26 -32
- package/dist/components/common/icons/cancel.js +26 -32
- package/dist/components/common/icons/checkmark.js +27 -32
- package/dist/components/common/icons/chevron-right.js +27 -27
- package/dist/components/common/icons/clipboard.js +26 -32
- package/dist/components/common/icons/clock.js +26 -32
- package/dist/components/common/icons/close.js +26 -32
- package/dist/components/common/icons/code-alt.js +27 -32
- package/dist/components/common/icons/copy.js +27 -32
- package/dist/components/common/icons/crosshairs.js +27 -32
- package/dist/components/common/icons/cube-3d.js +26 -32
- package/dist/components/common/icons/cursor-click.js +26 -32
- package/dist/components/common/icons/data-table.js +26 -32
- package/dist/components/common/icons/db.js +26 -32
- package/dist/components/common/icons/delete.js +26 -31
- package/dist/components/common/icons/docs.js +26 -32
- package/dist/components/common/icons/drag-n-drop.js +26 -32
- package/dist/components/common/icons/draw-polygon.js +26 -35
- package/dist/components/common/icons/email.js +26 -32
- package/dist/components/common/icons/expand.js +26 -32
- package/dist/components/common/icons/eye-seen.js +26 -32
- package/dist/components/common/icons/eye-unseen.js +26 -32
- package/dist/components/common/icons/file-type.js +16 -23
- package/dist/components/common/icons/file.js +26 -32
- package/dist/components/common/icons/files.js +25 -29
- package/dist/components/common/icons/filter-funnel.js +26 -32
- package/dist/components/common/icons/free-window.js +8 -8
- package/dist/components/common/icons/gear.js +26 -32
- package/dist/components/common/icons/hash.js +26 -32
- package/dist/components/common/icons/histogram.js +24 -28
- package/dist/components/common/icons/index.js +154 -63
- package/dist/components/common/icons/info.js +27 -32
- package/dist/components/common/icons/layers.js +26 -32
- package/dist/components/common/icons/left-arrow.js +27 -32
- package/dist/components/common/icons/legend.js +26 -32
- package/dist/components/common/icons/line-chart.js +26 -31
- package/dist/components/common/icons/login.js +26 -31
- package/dist/components/common/icons/logout.js +26 -31
- package/dist/components/common/icons/map-icon.js +27 -33
- package/dist/components/common/icons/map.js +27 -33
- package/dist/components/common/icons/messages.js +26 -32
- package/dist/components/common/icons/minus.js +26 -32
- package/dist/components/common/icons/order-by-dataset.js +56 -0
- package/dist/components/common/icons/order-by-list.js +48 -0
- package/dist/components/common/icons/pause.js +26 -32
- package/dist/components/common/icons/picture.js +25 -29
- package/dist/components/common/icons/pin.js +35 -33
- package/dist/components/common/icons/play.js +26 -32
- package/dist/components/common/icons/polygon.js +26 -35
- package/dist/components/common/icons/rectangle.js +26 -35
- package/dist/components/common/icons/reduce.js +26 -32
- package/dist/components/common/icons/reset.js +26 -32
- package/dist/components/common/icons/rocket.js +26 -32
- package/dist/components/common/icons/save.js +26 -32
- package/dist/components/common/icons/save2.js +26 -32
- package/dist/components/common/icons/search.js +26 -32
- package/dist/components/common/icons/settings.js +26 -32
- package/dist/components/common/icons/share.js +26 -32
- package/dist/components/common/icons/split.js +26 -32
- package/dist/components/common/icons/square-select.js +26 -32
- package/dist/components/common/icons/swap-horizontal.js +28 -27
- package/dist/components/common/icons/table.js +26 -31
- package/dist/components/common/icons/trash.js +26 -32
- package/dist/components/common/icons/upload.js +26 -33
- package/dist/components/common/icons/vert-dots.js +26 -32
- package/dist/components/common/icons/vert-three-dots.js +26 -32
- package/dist/components/common/icons/warning.js +27 -32
- package/dist/components/common/image-preview.js +27 -35
- package/dist/components/common/info-helper.js +23 -32
- package/dist/components/common/item-selector/accessor.js +5 -3
- package/dist/components/common/item-selector/chickleted-input.js +42 -62
- package/dist/components/common/item-selector/dropdown-list.js +95 -72
- package/dist/components/common/item-selector/item-selector-submenu.js +38 -29
- package/dist/components/common/item-selector/item-selector.js +102 -89
- package/dist/components/common/item-selector/typeahead.js +118 -86
- package/dist/components/common/line-chart.js +44 -46
- package/dist/components/common/loading-spinner.js +23 -33
- package/dist/components/common/logo.js +24 -36
- package/dist/components/common/map-layer-selector.js +14 -22
- package/dist/components/common/modal.js +62 -50
- package/dist/components/common/portaled.js +109 -64
- package/dist/components/common/progress-bar.js +17 -28
- package/dist/components/common/range-brush.js +132 -84
- package/dist/components/common/range-plot.js +51 -60
- package/dist/components/common/range-slider.js +88 -76
- package/dist/components/common/slider/mouse-event.js +88 -52
- package/dist/components/common/slider/slider-bar-handle.js +40 -39
- package/dist/components/common/slider/slider-handle.js +49 -45
- package/dist/components/common/slider/slider.js +107 -104
- package/dist/components/common/styled-components.js +183 -69
- package/dist/components/common/switch.js +14 -37
- package/dist/components/common/time-range-slider-time-title.js +19 -24
- package/dist/components/common/time-range-slider.js +39 -61
- package/dist/components/common/time-slider-marker.js +41 -36
- package/dist/components/common/tippy-tooltip.js +115 -0
- package/dist/components/common/toolbar-item.js +23 -25
- package/dist/components/common/toolbar.js +10 -21
- package/dist/components/common/vertical-toolbar.js +10 -21
- package/dist/components/container.js +94 -66
- package/dist/components/context.js +10 -6
- package/dist/components/editor/constants.js +8 -6
- package/dist/components/editor/editor.js +77 -62
- package/dist/components/editor/feature-action-panel.js +50 -47
- package/dist/components/editor/feature-styles.js +42 -37
- package/dist/components/editor/handle-style.js +39 -37
- package/dist/components/filters/components.js +10 -21
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +27 -19
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/new-filter-panel.js +23 -19
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +28 -21
- package/dist/components/filters/filter-panels/range-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +24 -19
- package/dist/components/filters/filter-panels/types.js +6 -0
- package/dist/components/filters/index.js +17 -11
- package/dist/components/filters/multi-select-filter.js +9 -3
- package/dist/components/filters/polygon-filter.js +19 -10
- package/dist/components/filters/range-filter.js +9 -4
- package/dist/components/filters/single-select-filter.js +9 -3
- package/dist/components/filters/time-range-filter.js +18 -7
- package/dist/components/filters/time-widget.js +51 -42
- package/dist/components/filters/types.js +6 -0
- package/dist/components/geocoder/geocoder.js +134 -100
- package/dist/components/geocoder-panel.js +79 -57
- package/dist/components/index.js +591 -356
- package/dist/components/injector.js +58 -42
- package/dist/components/kepler-gl.js +171 -91
- package/dist/components/map/coordinate-info.js +13 -4
- package/dist/components/map/layer-hover-info.js +46 -39
- package/dist/components/map/layer-selector-panel.js +30 -17
- package/dist/components/map/locale-panel.js +43 -23
- package/dist/components/map/map-control-panel.js +43 -30
- package/dist/components/map/map-control-toolbar.js +11 -21
- package/dist/components/map/map-control-tooltip.js +13 -6
- package/dist/components/map/map-control.js +28 -27
- package/dist/components/map/map-draw-panel.js +48 -23
- package/dist/components/map/map-legend-panel.js +138 -77
- package/dist/components/map/map-legend.js +82 -55
- package/dist/components/map/map-popover.js +58 -42
- package/dist/components/map/split-map-button.js +40 -25
- package/dist/components/map/toggle-3d-button.js +37 -22
- package/dist/components/map-container.js +164 -147
- package/dist/components/maps-layout.js +29 -25
- package/dist/components/modal-container.js +116 -91
- package/dist/components/modals/add-map-style-modal.js +66 -49
- package/dist/components/modals/cloud-tile.js +36 -36
- package/dist/components/modals/data-table-modal.js +96 -60
- package/dist/components/modals/delete-data-modal.js +20 -24
- package/dist/components/modals/error-display.js +10 -3
- package/dist/components/modals/export-data-modal.js +59 -57
- package/dist/components/modals/export-image-modal.js +28 -31
- package/dist/components/modals/export-map-modal/components.js +27 -27
- package/dist/components/modals/export-map-modal/export-html-map.js +27 -28
- package/dist/components/modals/export-map-modal/export-json-map.js +43 -30
- package/dist/components/modals/export-map-modal/export-map-modal.js +41 -34
- package/dist/components/modals/image-modal-container.js +19 -14
- package/dist/components/modals/load-data-modal.js +35 -31
- package/dist/components/modals/load-storage-map.js +79 -44
- package/dist/components/modals/loading-dialog.js +18 -24
- package/dist/components/modals/modal-dialog.js +7 -3
- package/dist/components/modals/modal-tabs.js +29 -29
- package/dist/components/modals/overwrite-map-modal.js +28 -29
- package/dist/components/modals/provider-modal-container.js +32 -35
- package/dist/components/modals/save-map-modal.js +51 -47
- package/dist/components/modals/share-map-modal.js +63 -55
- package/dist/components/modals/status-panel.js +25 -24
- package/dist/components/modals/storage-map-viewer.js +43 -38
- package/dist/components/notification-panel/notification-item.js +46 -41
- package/dist/components/notification-panel.js +32 -35
- package/dist/components/performance.js +36 -11
- package/dist/components/plot-container.js +76 -60
- package/dist/components/side-panel/cloud-storage-dropdown.js +10 -4
- package/dist/components/side-panel/common/dataset-info.js +13 -20
- package/dist/components/side-panel/common/dataset-tag.js +49 -31
- package/dist/components/side-panel/common/dataset-title.js +91 -44
- package/dist/components/side-panel/common/source-data-catalog.js +26 -28
- package/dist/components/side-panel/common/source-data-selector.js +51 -37
- package/dist/components/side-panel/common/types.js +6 -0
- package/dist/components/side-panel/custom-panel.js +9 -5
- package/dist/components/side-panel/filter-manager.js +32 -30
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +29 -32
- package/dist/components/side-panel/filter-panel/filter-panel.js +58 -53
- package/dist/components/side-panel/interaction-manager.js +12 -5
- package/dist/components/side-panel/interaction-panel/brush-config.js +19 -23
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +58 -41
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +83 -47
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +46 -30
- package/dist/components/side-panel/layer-manager.js +132 -211
- package/dist/components/side-panel/layer-panel/add-layer-button.js +156 -0
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +11 -4
- package/dist/components/side-panel/layer-panel/color-palette.js +29 -41
- package/dist/components/side-panel/layer-panel/color-range-selector.js +164 -162
- package/dist/components/side-panel/layer-panel/color-selector.js +71 -60
- package/dist/components/side-panel/layer-panel/column-selector.js +27 -28
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +7 -3
- package/dist/components/side-panel/layer-panel/custom-palette.js +72 -48
- package/dist/components/side-panel/layer-panel/custom-picker.js +41 -40
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +87 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +69 -0
- package/dist/components/side-panel/layer-panel/dataset-section.js +91 -0
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +16 -8
- package/dist/components/side-panel/layer-panel/hex-column-config.js +34 -12
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +10 -2
- package/dist/components/side-panel/layer-panel/layer-column-config.js +26 -42
- package/dist/components/side-panel/layer-panel/layer-config-group.js +86 -52
- package/dist/components/side-panel/layer-panel/layer-configurator.js +249 -158
- package/dist/components/side-panel/layer-panel/layer-list.js +168 -0
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +70 -74
- package/dist/components/side-panel/layer-panel/layer-panel.js +58 -55
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +22 -28
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +18 -22
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -35
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +40 -35
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +123 -0
- package/dist/components/side-panel/layer-panel/single-color-palette.js +45 -77
- package/dist/components/side-panel/layer-panel/text-label-panel.js +45 -41
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +51 -60
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +163 -52
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +27 -38
- package/dist/components/side-panel/map-manager.js +45 -38
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +31 -28
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +24 -26
- package/dist/components/side-panel/panel-dropdown.js +34 -34
- package/dist/components/side-panel/panel-header-action.js +43 -51
- package/dist/components/side-panel/panel-header.js +105 -78
- package/dist/components/side-panel/panel-tab.js +20 -24
- package/dist/components/side-panel/panel-title.js +17 -22
- package/dist/components/side-panel/panel-toggle.js +21 -33
- package/dist/components/side-panel/side-bar.js +53 -44
- package/dist/components/side-panel.js +79 -68
- package/dist/components/types.js +6 -0
- package/dist/connect/keplergl-connect.js +14 -5
- package/dist/connect/with-local-selector.js +38 -33
- package/dist/constants/action-types.js +14 -5
- package/dist/constants/color-palette.js +23 -12
- package/dist/constants/color-ranges.js +31 -32
- package/dist/constants/custom-color-ranges.js +14 -9
- package/dist/constants/default-settings.js +265 -162
- package/dist/constants/index.js +103 -95
- package/dist/constants/keyevent.js +7 -3
- package/dist/constants/tooltip.js +10 -7
- package/dist/constants/user-feedbacks.js +6 -5
- package/dist/constants/user-guides.js +20 -12
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +33 -30
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +43 -10
- package/dist/deckgl-layers/3d-building-layer/types.js +6 -0
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +75 -54
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +34 -31
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +38 -38
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +38 -38
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +26 -12
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +152 -90
- package/dist/deckgl-layers/layer-utils/shader-utils.js +5 -1
- package/dist/deckgl-layers/line-layer/line-layer.js +40 -31
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +32 -27
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +42 -36
- package/dist/index.js +23 -4
- package/dist/layers/aggregation-layer.js +126 -76
- package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
- package/dist/layers/arc-layer/arc-layer.js +85 -56
- package/dist/layers/base-layer.js +459 -288
- package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
- package/dist/layers/cluster-layer/cluster-layer.js +45 -34
- package/dist/layers/default-layer-icon.js +27 -27
- package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
- package/dist/layers/geojson-layer/geojson-layer.js +105 -60
- package/dist/layers/geojson-layer/geojson-utils.js +68 -39
- package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
- package/dist/layers/grid-layer/grid-layer.js +42 -31
- package/dist/layers/grid-layer/grid-utils.js +15 -12
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +92 -49
- package/dist/layers/h3-hexagon-layer/h3-utils.js +22 -11
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
- package/dist/layers/heatmap-layer/heatmap-layer.js +81 -59
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
- package/dist/layers/hexagon-layer/hexagon-layer.js +43 -31
- package/dist/layers/hexagon-layer/hexagon-utils.js +15 -3
- package/dist/layers/icon-layer/icon-info-modal.js +28 -24
- package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
- package/dist/layers/icon-layer/icon-layer.js +115 -63
- package/dist/layers/index.js +39 -38
- package/dist/layers/layer-factory.js +83 -69
- package/dist/layers/layer-text-label.js +15 -9
- package/dist/layers/layer-update.js +21 -12
- package/dist/layers/line-layer/line-layer-icon.js +27 -27
- package/dist/layers/line-layer/line-layer.js +84 -63
- package/dist/layers/mapbox-utils.js +54 -48
- package/dist/layers/mapboxgl-layer.js +68 -45
- package/dist/layers/point-layer/point-layer-icon.js +27 -27
- package/dist/layers/point-layer/point-layer.js +100 -60
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +86 -45
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
- package/dist/layers/s2-geometry-layer/s2-utils.js +18 -5
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +15 -21
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +85 -54
- package/dist/layers/trip-layer/trip-info-modal.js +16 -21
- package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
- package/dist/layers/trip-layer/trip-layer.js +115 -58
- package/dist/layers/trip-layer/trip-utils.js +51 -28
- package/dist/layers/types.js +6 -3
- package/dist/localization/formatted-message.js +12 -8
- package/dist/localization/index.js +14 -8
- package/dist/localization/locales.js +12 -7
- package/dist/localization/messages.js +29 -0
- package/dist/localization/translations/ca.js +455 -0
- package/dist/localization/translations/cn.js +458 -0
- package/dist/localization/translations/en.js +483 -0
- package/dist/localization/translations/es.js +455 -0
- package/dist/localization/translations/fi.js +427 -0
- package/dist/localization/translations/ja.js +456 -0
- package/dist/localization/translations/pt.js +427 -0
- package/dist/localization/translations/ru.js +464 -0
- package/dist/middleware/index.js +5 -2
- package/dist/processors/data-processor.js +217 -149
- package/dist/processors/file-handler.js +284 -210
- package/dist/processors/index.js +25 -97
- package/dist/processors/types.js +6 -0
- package/dist/reducers/combined-updaters.js +48 -40
- package/dist/reducers/composer-helpers.js +34 -32
- package/dist/reducers/composers.js +12 -25
- package/dist/reducers/core.js +46 -19
- package/dist/reducers/index.js +52 -24
- package/dist/reducers/map-state-updaters.js +64 -61
- package/dist/reducers/map-state.js +26 -31
- package/dist/reducers/map-style-updaters.js +149 -116
- package/dist/reducers/map-style.js +26 -31
- package/dist/reducers/provider-state-updaters.js +151 -121
- package/dist/reducers/provider-state.js +25 -32
- package/dist/reducers/root.js +52 -45
- package/dist/reducers/types.js +6 -0
- package/dist/reducers/ui-state-updaters.js +231 -138
- package/dist/reducers/ui-state.js +27 -32
- package/dist/reducers/vis-state-merger.js +212 -143
- package/dist/reducers/vis-state-selectors.js +12 -5
- package/dist/reducers/vis-state-updaters.js +706 -490
- package/dist/reducers/vis-state.js +25 -32
- package/dist/schemas/dataset-schema.js +59 -39
- package/dist/schemas/index.js +45 -38
- package/dist/schemas/map-state-schema.js +24 -28
- package/dist/schemas/map-style-schema.js +48 -34
- package/dist/schemas/schema-manager.js +71 -46
- package/dist/schemas/schema-utils.js +15 -11
- package/dist/schemas/schema.js +37 -35
- package/dist/schemas/versions.js +9 -5
- package/dist/schemas/vis-state-schema.js +312 -112
- package/dist/styles/base.js +646 -367
- package/dist/styles/index.js +5 -1
- package/dist/styles/media-breakpoints.js +36 -27
- package/dist/tasks/tasks.js +50 -22
- package/dist/templates/export-map-html.js +6 -3
- package/dist/utils/aggregate-utils.js +27 -23
- package/dist/utils/color-utils.js +62 -44
- package/dist/utils/custom-scales.js +7 -1
- package/dist/utils/data-scale-utils.js +18 -14
- package/dist/utils/data-utils.js +148 -110
- package/dist/utils/dataset-utils.js +91 -75
- package/dist/utils/dom-to-image.js +97 -19
- package/dist/utils/dom-utils.js +116 -34
- package/dist/utils/export-utils.js +122 -81
- package/dist/utils/filter-utils.js +335 -242
- package/dist/utils/gl-utils.js +15 -26
- package/dist/utils/gpu-filter-utils.js +70 -61
- package/dist/utils/index.js +220 -64
- package/dist/utils/interaction-utils.js +52 -34
- package/dist/utils/layer-utils.js +65 -60
- package/dist/utils/locale-utils.js +21 -23
- package/dist/utils/map-info-utils.js +3 -2
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +85 -86
- package/dist/utils/map-style-utils/mapbox-utils.js +5 -3
- package/dist/utils/mapbox-utils.js +5 -2
- package/dist/utils/notifications-utils.js +42 -43
- package/dist/utils/observe-dimensions.js +44 -39
- package/dist/utils/projection-utils.js +20 -9
- package/dist/utils/searcher-utils.js +4 -1
- package/dist/utils/split-map-utils.js +34 -38
- package/dist/utils/table-utils/data-container-interface.js +6 -0
- package/dist/utils/table-utils/data-container-utils.js +36 -29
- package/dist/utils/table-utils/data-row.js +79 -7
- package/dist/utils/table-utils/index.js +2 -1
- package/dist/utils/table-utils/indexed-data-container.js +113 -81
- package/dist/utils/table-utils/kepler-table.js +200 -99
- package/dist/utils/table-utils/row-data-container.js +109 -74
- package/dist/utils/utils.js +94 -50
- package/package.json +71 -21
- package/src/actions/action-wrapper.ts +183 -0
- package/src/actions/actions.ts +260 -0
- package/src/actions/identity-actions.ts +116 -0
- package/src/actions/map-state-actions.ts +116 -0
- package/src/actions/map-style-actions.ts +243 -0
- package/src/actions/provider-actions.ts +218 -0
- package/src/actions/ui-state-actions.ts +490 -0
- package/src/actions/vis-state-actions.ts +1279 -0
- package/src/cloud-providers/index.ts +22 -0
- package/src/cloud-providers/provider.ts +277 -0
- package/src/components/bottom-widget.tsx +275 -0
- package/src/components/common/action-panel.tsx +207 -0
- package/src/components/common/animation-control/animation-control.tsx +157 -0
- package/src/components/common/animation-control/animation-controller.ts +249 -0
- package/src/components/common/animation-control/animation-speed-slider.tsx +86 -0
- package/src/components/common/animation-control/floating-time-display.tsx +209 -0
- package/src/components/common/animation-control/playback-controls.tsx +316 -0
- package/src/components/common/animation-control/speed-control.tsx +71 -0
- package/src/components/common/checkbox.tsx +137 -0
- package/src/components/common/color-legend.tsx +203 -0
- package/src/components/common/data-table/button.tsx +54 -0
- package/src/components/common/data-table/cell-size.ts +185 -0
- package/src/components/common/data-table/grid.tsx +57 -0
- package/src/components/common/data-table/index.tsx +693 -0
- package/src/components/common/data-table/option-dropdown.tsx +122 -0
- package/src/components/common/dataset-label.tsx +48 -0
- package/src/components/common/error-boundary.tsx +43 -0
- package/src/components/common/field-selector.tsx +237 -0
- package/src/components/common/field-token.tsx +60 -0
- package/src/components/common/file-uploader/file-drop.tsx +208 -0
- package/src/components/common/file-uploader/file-upload-progress.tsx +123 -0
- package/src/components/common/file-uploader/file-upload.tsx +319 -0
- package/src/components/common/file-uploader/upload-button.tsx +88 -0
- package/src/components/common/histogram-plot.tsx +125 -0
- package/src/components/common/icons/add.tsx +37 -0
- package/src/components/common/icons/anchor_window.tsx +49 -0
- package/src/components/common/icons/arrow-down-alt.tsx +37 -0
- package/src/components/common/icons/arrow-down-solid.tsx +37 -0
- package/src/components/common/icons/arrow-down.tsx +40 -0
- package/src/components/common/icons/arrow-left.tsx +42 -0
- package/src/components/common/icons/arrow-right.tsx +40 -0
- package/src/components/common/icons/arrow-up-alt.tsx +40 -0
- package/src/components/common/icons/arrow-up-solid.tsx +37 -0
- package/src/components/common/icons/arrow-up.tsx +40 -0
- package/src/components/common/icons/base.tsx +95 -0
- package/src/components/common/icons/bug.tsx +40 -0
- package/src/components/common/icons/cancel.tsx +37 -0
- package/src/components/common/icons/checkmark.tsx +39 -0
- package/src/components/common/icons/chevron-right.js +1 -1
- package/src/components/common/icons/clipboard.tsx +40 -0
- package/src/components/common/icons/clock.tsx +38 -0
- package/src/components/common/icons/close.tsx +43 -0
- package/src/components/common/icons/code-alt.tsx +37 -0
- package/src/components/common/icons/copy.tsx +38 -0
- package/src/components/common/icons/crosshairs.tsx +37 -0
- package/src/components/common/icons/cube-3d.tsx +39 -0
- package/src/components/common/icons/cursor-click.tsx +43 -0
- package/src/components/common/icons/data-table.tsx +40 -0
- package/src/components/common/icons/db.tsx +40 -0
- package/src/components/common/icons/delete.tsx +39 -0
- package/src/components/common/icons/docs.tsx +40 -0
- package/src/components/common/icons/drag-n-drop.tsx +38 -0
- package/src/components/common/icons/draw-polygon.tsx +51 -0
- package/src/components/common/icons/email.tsx +39 -0
- package/src/components/common/icons/expand.tsx +39 -0
- package/src/components/common/icons/eye-seen.tsx +38 -0
- package/src/components/common/icons/eye-unseen.tsx +38 -0
- package/src/components/common/icons/file-type.tsx +71 -0
- package/src/components/common/icons/file.tsx +37 -0
- package/src/components/common/icons/files.tsx +37 -0
- package/src/components/common/icons/filter-funnel.tsx +37 -0
- package/src/components/common/icons/free-window.tsx +48 -0
- package/src/components/common/icons/gear.tsx +40 -0
- package/src/components/common/icons/hash.tsx +37 -0
- package/src/components/common/icons/histogram.tsx +42 -0
- package/src/components/common/icons/index.tsx +98 -0
- package/src/components/common/icons/info.tsx +48 -0
- package/src/components/common/icons/layers.tsx +37 -0
- package/src/components/common/icons/left-arrow.tsx +37 -0
- package/src/components/common/icons/legend.tsx +37 -0
- package/src/components/common/icons/line-chart.tsx +40 -0
- package/src/components/common/icons/login.tsx +41 -0
- package/src/components/common/icons/logout.tsx +38 -0
- package/src/components/common/icons/map-icon.tsx +62 -0
- package/src/components/common/icons/map.tsx +62 -0
- package/src/components/common/icons/messages.tsx +37 -0
- package/src/components/common/icons/minus.tsx +39 -0
- package/src/components/common/icons/order-by-dataset.tsx +49 -0
- package/src/components/common/icons/order-by-list.tsx +39 -0
- package/src/components/common/icons/pause.tsx +37 -0
- package/src/components/common/icons/picture.tsx +37 -0
- package/src/components/common/icons/pin.tsx +42 -0
- package/src/components/common/icons/play.tsx +37 -0
- package/src/components/common/icons/polygon.tsx +65 -0
- package/src/components/common/icons/rectangle.tsx +66 -0
- package/src/components/common/icons/reduce.tsx +42 -0
- package/src/components/common/icons/reset.tsx +37 -0
- package/src/components/common/icons/rocket.tsx +37 -0
- package/src/components/common/icons/save.tsx +38 -0
- package/src/components/common/icons/save2.tsx +42 -0
- package/src/components/common/icons/search.tsx +38 -0
- package/src/components/common/icons/settings.tsx +39 -0
- package/src/components/common/icons/share.tsx +37 -0
- package/src/components/common/icons/split.tsx +57 -0
- package/src/components/common/icons/square-select.tsx +38 -0
- package/src/components/common/icons/swap-horizontal.js +1 -1
- package/src/components/common/icons/table.tsx +41 -0
- package/src/components/common/icons/trash.tsx +45 -0
- package/src/components/common/icons/upload.tsx +37 -0
- package/src/components/common/icons/vert-dots.tsx +44 -0
- package/src/components/common/icons/vert-three-dots.tsx +39 -0
- package/src/components/common/icons/warning.tsx +40 -0
- package/src/components/common/image-preview.tsx +118 -0
- package/src/components/common/info-helper.tsx +90 -0
- package/src/components/common/item-selector/accessor.ts +45 -0
- package/src/components/common/item-selector/chickleted-input.tsx +153 -0
- package/src/components/common/item-selector/dropdown-list.tsx +269 -0
- package/src/components/common/item-selector/item-selector-submenu.js +1 -1
- package/src/components/common/item-selector/item-selector.d.ts +24 -27
- package/src/components/common/item-selector/item-selector.tsx +372 -0
- package/src/components/common/item-selector/typeahead.tsx +533 -0
- package/src/components/common/line-chart.tsx +170 -0
- package/src/components/common/loading-spinner.tsx +75 -0
- package/src/components/common/logo.tsx +88 -0
- package/src/components/common/map-layer-selector.tsx +64 -0
- package/src/components/common/modal.tsx +238 -0
- package/src/components/common/portaled.tsx +312 -0
- package/src/components/common/progress-bar.tsx +74 -0
- package/src/components/common/range-brush.tsx +276 -0
- package/src/components/common/range-plot.tsx +145 -0
- package/src/components/common/range-slider.tsx +320 -0
- package/src/components/common/slider/mouse-event.ts +122 -0
- package/src/components/common/slider/slider-bar-handle.tsx +106 -0
- package/src/components/common/slider/slider-handle.tsx +210 -0
- package/src/components/common/slider/slider.tsx +234 -0
- package/src/components/common/styled-components.tsx +708 -0
- package/src/components/common/switch.tsx +47 -0
- package/src/components/common/time-range-slider-time-title.tsx +87 -0
- package/src/components/common/time-range-slider.tsx +171 -0
- package/src/components/common/time-slider-marker.tsx +187 -0
- package/src/components/common/tippy-tooltip.tsx +130 -0
- package/src/components/common/toolbar-item.tsx +99 -0
- package/src/components/common/toolbar.tsx +49 -0
- package/src/components/common/vertical-toolbar.tsx +35 -0
- package/src/components/container.d.ts +8 -0
- package/src/components/container.tsx +188 -0
- package/src/components/context.ts +32 -0
- package/src/components/editor/editor.tsx +231 -0
- package/src/components/editor/feature-action-panel.tsx +155 -0
- package/src/components/editor/feature-styles.ts +75 -0
- package/src/components/editor/handle-style.ts +89 -0
- package/src/components/filters/filter-panels/filter-panel-with-field-select.tsx +118 -0
- package/src/components/filters/filter-panels/multi-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/new-filter-panel.tsx +100 -0
- package/src/components/filters/filter-panels/polygon-filter-panel.tsx +84 -0
- package/src/components/filters/filter-panels/range-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/single-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/time-range-filter-panel.tsx +92 -0
- package/src/components/filters/filter-panels/types.ts +39 -0
- package/src/components/filters/multi-select-filter.tsx +37 -0
- package/src/components/filters/polygon-filter.tsx +74 -0
- package/src/components/filters/range-filter.tsx +44 -0
- package/src/components/filters/single-select-filter.tsx +50 -0
- package/src/components/filters/time-range-filter.tsx +76 -0
- package/src/components/filters/time-widget.tsx +240 -0
- package/src/components/filters/types.ts +78 -0
- package/src/components/geocoder/geocoder.tsx +307 -0
- package/src/components/geocoder-panel.tsx +199 -0
- package/src/components/index.ts +262 -0
- package/src/components/injector.d.ts +33 -0
- package/src/components/injector.tsx +171 -0
- package/src/components/kepler-gl.d.ts +0 -2
- package/src/components/kepler-gl.tsx +579 -0
- package/src/components/map/coordinate-info.tsx +58 -0
- package/src/components/map/layer-hover-info.tsx +192 -0
- package/src/components/map/layer-selector-panel.tsx +121 -0
- package/src/components/map/locale-panel.tsx +110 -0
- package/src/components/map/map-control-panel.tsx +141 -0
- package/src/components/map/map-control-tooltip.tsx +45 -0
- package/src/components/map/map-control.tsx +138 -0
- package/src/components/map/map-draw-panel.tsx +145 -0
- package/src/components/map/map-legend-panel.tsx +167 -0
- package/src/components/map/map-legend.tsx +283 -0
- package/src/components/map/map-popover.tsx +266 -0
- package/src/components/map/split-map-button.tsx +98 -0
- package/src/components/map/toggle-3d-button.tsx +90 -0
- package/src/components/map-container.tsx +541 -0
- package/src/components/maps-layout.tsx +44 -0
- package/src/components/modal-container.tsx +556 -0
- package/src/components/modals/add-map-style-modal.tsx +303 -0
- package/src/components/modals/cloud-tile.tsx +181 -0
- package/src/components/modals/data-table-modal.tsx +241 -0
- package/src/components/modals/delete-data-modal.tsx +55 -0
- package/src/components/modals/error-display.tsx +43 -0
- package/src/components/modals/export-data-modal.tsx +201 -0
- package/src/components/modals/export-image-modal.tsx +155 -0
- package/src/components/modals/export-map-modal/export-html-map.tsx +164 -0
- package/src/components/modals/export-map-modal/export-json-map.tsx +112 -0
- package/src/components/modals/export-map-modal/export-map-modal.tsx +109 -0
- package/src/components/modals/image-modal-container.tsx +85 -0
- package/src/components/modals/load-data-modal.tsx +120 -0
- package/src/components/modals/load-storage-map.tsx +414 -0
- package/src/components/modals/loading-dialog.tsx +77 -0
- package/src/components/modals/modal-tabs.tsx +137 -0
- package/src/components/modals/overwrite-map-modal.tsx +113 -0
- package/src/components/modals/provider-modal-container.tsx +61 -0
- package/src/components/modals/save-map-modal.tsx +277 -0
- package/src/components/modals/share-map-modal.tsx +217 -0
- package/src/components/modals/status-panel.tsx +106 -0
- package/src/components/modals/storage-map-viewer.tsx +190 -0
- package/src/components/notification-panel/notification-item.tsx +143 -0
- package/src/components/notification-panel.tsx +75 -0
- package/src/components/plot-container.tsx +237 -0
- package/src/components/side-panel/common/dataset-info.tsx +46 -0
- package/src/components/side-panel/common/dataset-tag.tsx +86 -0
- package/src/components/side-panel/common/dataset-title.tsx +186 -0
- package/src/components/side-panel/common/source-data-catalog.tsx +67 -0
- package/src/components/side-panel/common/source-data-selector.tsx +90 -0
- package/src/components/side-panel/common/types.ts +76 -0
- package/src/components/side-panel/filter-manager.tsx +120 -0
- package/src/components/side-panel/filter-panel/filter-panel-header.tsx +96 -0
- package/src/components/side-panel/filter-panel/filter-panel.tsx +125 -0
- package/src/components/side-panel/interaction-manager.tsx +59 -0
- package/src/components/side-panel/interaction-panel/brush-config.tsx +58 -0
- package/src/components/side-panel/interaction-panel/interaction-panel.tsx +124 -0
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.tsx +243 -0
- package/src/components/side-panel/interaction-panel/tooltip-config.tsx +238 -0
- package/src/components/side-panel/layer-manager.tsx +242 -0
- package/src/components/side-panel/layer-panel/add-layer-button.tsx +208 -0
- package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +1 -1
- package/src/components/side-panel/layer-panel/color-palette.tsx +98 -0
- package/src/components/side-panel/layer-panel/color-range-selector.tsx +377 -0
- package/src/components/side-panel/layer-panel/color-selector.tsx +200 -0
- package/src/components/side-panel/layer-panel/column-selector.tsx +102 -0
- package/src/components/side-panel/layer-panel/custom-markers-config-group.js +1 -1
- package/src/components/side-panel/layer-panel/custom-palette.tsx +297 -0
- package/src/components/side-panel/layer-panel/custom-picker.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-group.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-section.tsx +100 -0
- package/src/components/side-panel/layer-panel/dataset-section.tsx +125 -0
- package/src/components/side-panel/layer-panel/dimension-scale-selector.tsx +64 -0
- package/src/components/side-panel/layer-panel/layer-column-config.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-config-group.tsx +256 -0
- package/src/components/side-panel/layer-panel/layer-list.tsx +191 -0
- package/src/components/side-panel/layer-panel/layer-panel-header.tsx +272 -0
- package/src/components/side-panel/layer-panel/layer-panel.tsx +196 -0
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.tsx +118 -0
- package/src/components/side-panel/layer-panel/layer-type-list-item.tsx +92 -0
- package/src/components/side-panel/layer-panel/layer-type-selector.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +1 -1
- package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +132 -0
- package/src/components/side-panel/layer-panel/single-color-palette.tsx +94 -0
- package/src/components/side-panel/layer-panel/text-label-panel.tsx +187 -0
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.tsx +179 -0
- package/src/components/side-panel/layer-panel/vis-config-slider.tsx +237 -0
- package/src/components/side-panel/layer-panel/vis-config-switch.tsx +86 -0
- package/src/components/side-panel/map-manager.tsx +123 -0
- package/src/components/side-panel/map-style-panel/map-layer-selector.tsx +145 -0
- package/src/components/side-panel/map-style-panel/map-style-selector.tsx +122 -0
- package/src/components/side-panel/panel-dropdown.tsx +53 -0
- package/src/components/side-panel/panel-header-action.tsx +114 -0
- package/src/components/side-panel/panel-header.tsx +386 -0
- package/src/components/side-panel/panel-tab.tsx +79 -0
- package/src/components/side-panel/panel-title.tsx +35 -0
- package/src/components/side-panel/panel-toggle.tsx +72 -0
- package/src/components/side-panel/side-bar.tsx +140 -0
- package/src/components/side-panel.tsx +261 -0
- package/src/components/types.ts +41 -0
- package/src/connect/keplergl-connect.ts +48 -0
- package/src/connect/with-local-selector.tsx +70 -0
- package/src/constants/action-types.ts +188 -0
- package/src/constants/color-ranges.ts +87 -0
- package/src/constants/default-settings.ts +1049 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.ts +57 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.ts +211 -0
- package/src/deckgl-layers/3d-building-layer/types.ts +29 -0
- package/src/deckgl-layers/column-layer/enhanced-column-layer.ts +63 -0
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +68 -0
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.ts +68 -0
- package/src/deckgl-layers/layer-utils/cluster-utils.ts +78 -0
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +672 -0
- package/src/deckgl-layers/layer-utils/shader-utils.ts +41 -0
- package/src/deckgl-layers/line-layer/line-layer.ts +126 -0
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.ts +63 -0
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.ts +96 -0
- package/src/index.d.ts +1 -0
- package/src/layers/aggregation-layer.ts +402 -0
- package/src/layers/arc-layer/arc-layer-icon.tsx +67 -0
- package/src/layers/arc-layer/arc-layer.ts +294 -0
- package/src/layers/base-layer.ts +1743 -0
- package/src/layers/cluster-layer/cluster-layer.ts +162 -0
- package/src/layers/geojson-layer/geojson-layer-icon.tsx +68 -0
- package/src/layers/geojson-layer/geojson-layer.ts +461 -0
- package/src/layers/geojson-layer/geojson-utils.ts +200 -0
- package/src/layers/grid-layer/grid-layer-icon.tsx +53 -0
- package/src/layers/grid-layer/grid-layer.ts +153 -0
- package/src/layers/grid-layer/grid-utils.ts +84 -0
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.ts +339 -0
- package/src/layers/h3-hexagon-layer/h3-utils.ts +67 -0
- package/src/layers/heatmap-layer/heatmap-layer.ts +255 -0
- package/src/layers/hexagon-layer/hexagon-layer.ts +156 -0
- package/src/layers/hexagon-layer/hexagon-utils.ts +64 -0
- package/src/layers/icon-layer/icon-info-modal.tsx +155 -0
- package/src/layers/icon-layer/icon-layer.ts +392 -0
- package/src/layers/index.ts +77 -0
- package/src/layers/layer-factory.ts +695 -0
- package/src/layers/layer-text-label.ts +62 -0
- package/src/layers/layer-update.ts +70 -0
- package/src/layers/line-layer/line-layer.ts +222 -0
- package/src/layers/mapbox-utils.ts +204 -0
- package/src/layers/mapboxgl-layer.ts +176 -0
- package/src/layers/point-layer/point-layer.ts +504 -0
- package/src/layers/s2-geometry-layer/s2-geometry-layer.ts +369 -0
- package/src/layers/s2-geometry-layer/s2-utils.ts +42 -0
- package/src/layers/scenegraph-layer/scenegraph-layer.ts +237 -0
- package/src/layers/trip-layer/trip-layer.ts +356 -0
- package/src/layers/trip-layer/trip-utils.ts +177 -0
- package/src/localization/formatted-message.tsx +42 -0
- package/src/localization/index.ts +29 -0
- package/src/localization/locales.ts +53 -0
- package/src/localization/messages.ts +40 -0
- package/src/localization/translations/ca.ts +476 -0
- package/src/localization/translations/cn.ts +477 -0
- package/src/localization/translations/en.ts +504 -0
- package/src/localization/translations/es.ts +477 -0
- package/src/localization/translations/fi.ts +448 -0
- package/src/localization/translations/ja.ts +477 -0
- package/src/localization/translations/pt.ts +449 -0
- package/src/localization/translations/ru.ts +488 -0
- package/src/middleware/index.ts +35 -0
- package/src/processors/data-processor.ts +723 -0
- package/src/processors/file-handler.ts +248 -0
- package/src/processors/index.ts +22 -0
- package/src/processors/types.ts +22 -0
- package/src/reducers/combined-updaters.ts +216 -0
- package/src/reducers/composer-helpers.ts +75 -0
- package/src/reducers/core.ts +111 -0
- package/src/reducers/index.ts +116 -0
- package/src/reducers/map-state-updaters.ts +271 -0
- package/src/reducers/map-state.ts +47 -0
- package/src/reducers/map-style-updaters.ts +640 -0
- package/src/reducers/map-style.ts +53 -0
- package/src/reducers/provider-state-updaters.ts +454 -0
- package/src/reducers/provider-state.ts +53 -0
- package/src/reducers/root.ts +231 -0
- package/src/reducers/types.ts +18 -0
- package/src/reducers/ui-state-updaters.ts +926 -0
- package/src/reducers/ui-state.ts +75 -0
- package/src/reducers/vis-state-merger.ts +627 -0
- package/src/reducers/vis-state-selectors.ts +37 -0
- package/src/reducers/vis-state-updaters.ts +2568 -0
- package/src/reducers/vis-state.ts +157 -0
- package/src/schemas/dataset-schema.ts +141 -0
- package/src/schemas/index.ts +52 -0
- package/src/schemas/schema-manager.ts +446 -0
- package/src/schemas/schema.ts +124 -0
- package/src/schemas/vis-state-schema.ts +761 -0
- package/src/styles/base.ts +1642 -0
- package/src/styles/media-breakpoints.ts +56 -0
- package/src/typedefs/deckgl.d.ts +25 -0
- package/src/utils/aggregate-utils.ts +71 -0
- package/src/utils/color-utils.ts +134 -0
- package/src/utils/data-scale-utils.ts +73 -0
- package/src/utils/data-utils.ts +459 -0
- package/src/utils/dataset-utils.ts +261 -0
- package/src/utils/dom-to-image.ts +533 -0
- package/src/utils/dom-utils.ts +354 -0
- package/src/utils/export-utils.ts +265 -0
- package/src/utils/filter-utils.ts +1185 -0
- package/src/utils/gl-utils.ts +40 -0
- package/src/utils/gpu-filter-utils.ts +249 -0
- package/src/utils/index.ts +69 -0
- package/src/utils/interaction-utils.ts +212 -0
- package/src/utils/layer-utils.ts +249 -0
- package/src/utils/map-style-utils/mapbox-gl-style-editor.ts +227 -0
- package/src/utils/notifications-utils.ts +89 -0
- package/src/utils/observe-dimensions.ts +127 -0
- package/src/utils/split-map-utils.ts +104 -0
- package/src/utils/table-utils/data-container-utils.ts +90 -0
- package/src/utils/table-utils/data-row.ts +110 -0
- package/src/utils/table-utils/indexed-data-container.ts +184 -0
- package/src/utils/table-utils/kepler-table.ts +639 -0
- package/src/utils/table-utils/row-data-container.ts +178 -0
- package/src/utils/utils.ts +228 -0
- package/dist/components/common/icons/arrow-down-solid .js +0 -64
- package/dist/localization/en.js +0 -494
- package/src/actions/action-wrapper.js +0 -183
- package/src/actions/actions.d.ts +0 -104
- package/src/actions/actions.js +0 -178
- package/src/actions/identity-actions.d.ts +0 -53
- package/src/actions/identity-actions.js +0 -83
- package/src/actions/index.d.ts +0 -23
- package/src/actions/map-state-actions.d.ts +0 -46
- package/src/actions/map-state-actions.js +0 -90
- package/src/actions/map-style-actions.d.ts +0 -116
- package/src/actions/map-style-actions.js +0 -135
- package/src/actions/provider-actions.d.ts +0 -203
- package/src/actions/provider-actions.js +0 -94
- package/src/actions/ui-state-actions.d.ts +0 -200
- package/src/actions/ui-state-actions.js +0 -272
- package/src/actions/vis-state-actions.d.ts +0 -502
- package/src/actions/vis-state-actions.js +0 -919
- package/src/cloud-providers/index.d.ts +0 -53
- package/src/cloud-providers/index.js +0 -21
- package/src/cloud-providers/provider.js +0 -233
- package/src/components/bottom-widget.d.ts +0 -33
- package/src/components/bottom-widget.js +0 -235
- package/src/components/common/action-panel.d.ts +0 -24
- package/src/components/common/action-panel.js +0 -177
- package/src/components/common/animation-control/animation-control.js +0 -155
- package/src/components/common/animation-control/animation-controller.js +0 -224
- package/src/components/common/animation-control/animation-speed-slider.js +0 -79
- package/src/components/common/animation-control/floating-time-display.js +0 -192
- package/src/components/common/animation-control/playback-controls.js +0 -278
- package/src/components/common/animation-control/speed-control.js +0 -71
- package/src/components/common/checkbox.js +0 -128
- package/src/components/common/color-legend.js +0 -198
- package/src/components/common/data-table/button.js +0 -47
- package/src/components/common/data-table/cell-size.js +0 -180
- package/src/components/common/data-table/grid.js +0 -55
- package/src/components/common/data-table/index.js +0 -620
- package/src/components/common/data-table/option-dropdown.js +0 -110
- package/src/components/common/dataset-label.js +0 -40
- package/src/components/common/error-boundary.js +0 -43
- package/src/components/common/field-selector.js +0 -233
- package/src/components/common/field-token.js +0 -56
- package/src/components/common/file-uploader/file-drop.d.ts +0 -19
- package/src/components/common/file-uploader/file-drop.js +0 -196
- package/src/components/common/file-uploader/file-upload-progress.d.ts +0 -11
- package/src/components/common/file-uploader/file-upload-progress.js +0 -110
- package/src/components/common/file-uploader/file-upload.d.ts +0 -22
- package/src/components/common/file-uploader/file-upload.js +0 -301
- package/src/components/common/file-uploader/upload-button.d.ts.wip +0 -11
- package/src/components/common/file-uploader/upload-button.js +0 -83
- package/src/components/common/histogram-plot.js +0 -102
- package/src/components/common/icons/add.js +0 -43
- package/src/components/common/icons/anchor_window.js +0 -53
- package/src/components/common/icons/arrow-down-alt.js +0 -43
- package/src/components/common/icons/arrow-down-solid .js +0 -43
- package/src/components/common/icons/arrow-down.js +0 -46
- package/src/components/common/icons/arrow-left.js +0 -48
- package/src/components/common/icons/arrow-right.js +0 -46
- package/src/components/common/icons/arrow-up-alt.js +0 -46
- package/src/components/common/icons/arrow-up-solid.js +0 -43
- package/src/components/common/icons/arrow-up.js +0 -46
- package/src/components/common/icons/base.js +0 -90
- package/src/components/common/icons/bug.js +0 -46
- package/src/components/common/icons/cancel.js +0 -43
- package/src/components/common/icons/checkmark.js +0 -45
- package/src/components/common/icons/clipboard.js +0 -46
- package/src/components/common/icons/clock.js +0 -44
- package/src/components/common/icons/close.js +0 -49
- package/src/components/common/icons/code-alt.js +0 -43
- package/src/components/common/icons/copy.js +0 -44
- package/src/components/common/icons/crosshairs.js +0 -43
- package/src/components/common/icons/cube-3d.js +0 -45
- package/src/components/common/icons/cursor-click.js +0 -49
- package/src/components/common/icons/data-table.js +0 -45
- package/src/components/common/icons/db.js +0 -45
- package/src/components/common/icons/delete.js +0 -44
- package/src/components/common/icons/docs.js +0 -46
- package/src/components/common/icons/drag-n-drop.js +0 -44
- package/src/components/common/icons/draw-polygon.js +0 -60
- package/src/components/common/icons/email.js +0 -45
- package/src/components/common/icons/expand.js +0 -45
- package/src/components/common/icons/eye-seen.js +0 -44
- package/src/components/common/icons/eye-unseen.js +0 -44
- package/src/components/common/icons/file-type.js +0 -57
- package/src/components/common/icons/file.js +0 -43
- package/src/components/common/icons/files.js +0 -42
- package/src/components/common/icons/filter-funnel.js +0 -43
- package/src/components/common/icons/free-window.js +0 -53
- package/src/components/common/icons/gear.js +0 -45
- package/src/components/common/icons/hash.js +0 -43
- package/src/components/common/icons/histogram.js +0 -47
- package/src/components/common/icons/index.js +0 -96
- package/src/components/common/icons/info.js +0 -54
- package/src/components/common/icons/layers.js +0 -43
- package/src/components/common/icons/left-arrow.js +0 -43
- package/src/components/common/icons/legend.js +0 -43
- package/src/components/common/icons/line-chart.js +0 -45
- package/src/components/common/icons/login.js +0 -46
- package/src/components/common/icons/logout.js +0 -43
- package/src/components/common/icons/map-icon.js +0 -69
- package/src/components/common/icons/map.js +0 -69
- package/src/components/common/icons/messages.js +0 -43
- package/src/components/common/icons/minus.js +0 -45
- package/src/components/common/icons/pause.js +0 -43
- package/src/components/common/icons/picture.js +0 -43
- package/src/components/common/icons/pin.js +0 -43
- package/src/components/common/icons/play.js +0 -43
- package/src/components/common/icons/polygon.js +0 -74
- package/src/components/common/icons/rectangle.js +0 -75
- package/src/components/common/icons/reduce.js +0 -48
- package/src/components/common/icons/reset.js +0 -43
- package/src/components/common/icons/rocket.js +0 -43
- package/src/components/common/icons/save.js +0 -44
- package/src/components/common/icons/save2.js +0 -47
- package/src/components/common/icons/search.js +0 -44
- package/src/components/common/icons/settings.js +0 -45
- package/src/components/common/icons/share.js +0 -43
- package/src/components/common/icons/split.js +0 -63
- package/src/components/common/icons/square-select.js +0 -44
- package/src/components/common/icons/table.js +0 -46
- package/src/components/common/icons/trash.js +0 -51
- package/src/components/common/icons/upload.js +0 -44
- package/src/components/common/icons/vert-dots.js +0 -50
- package/src/components/common/icons/vert-three-dots.js +0 -45
- package/src/components/common/icons/warning.js +0 -46
- package/src/components/common/image-preview.js +0 -111
- package/src/components/common/info-helper.js +0 -84
- package/src/components/common/item-selector/accessor.js +0 -45
- package/src/components/common/item-selector/chickleted-input.js +0 -143
- package/src/components/common/item-selector/dropdown-list.js +0 -258
- package/src/components/common/item-selector/item-selector.js +0 -360
- package/src/components/common/item-selector/typeahead.js +0 -507
- package/src/components/common/line-chart.js +0 -134
- package/src/components/common/loading-spinner.js +0 -64
- package/src/components/common/logo.js +0 -92
- package/src/components/common/map-layer-selector.d.ts +0 -10
- package/src/components/common/map-layer-selector.js +0 -54
- package/src/components/common/modal.js +0 -233
- package/src/components/common/portaled.js +0 -264
- package/src/components/common/progress-bar.d.ts +0 -13
- package/src/components/common/progress-bar.js +0 -49
- package/src/components/common/range-brush.js +0 -256
- package/src/components/common/range-plot.js +0 -139
- package/src/components/common/range-slider.js +0 -299
- package/src/components/common/slider/mouse-event.js +0 -97
- package/src/components/common/slider/slider-bar-handle.js +0 -97
- package/src/components/common/slider/slider-handle.js +0 -181
- package/src/components/common/slider/slider.js +0 -213
- package/src/components/common/styled-components.js +0 -657
- package/src/components/common/switch.js +0 -50
- package/src/components/common/time-range-slider-time-title.js +0 -76
- package/src/components/common/time-range-slider.js +0 -163
- package/src/components/common/time-slider-marker.js +0 -168
- package/src/components/common/toolbar-item.d.ts +0 -14
- package/src/components/common/toolbar-item.js +0 -83
- package/src/components/common/toolbar.js +0 -45
- package/src/components/common/vertical-toolbar.js +0 -35
- package/src/components/container.js +0 -173
- package/src/components/context.d.ts +0 -10
- package/src/components/context.js +0 -32
- package/src/components/editor/editor.js +0 -218
- package/src/components/editor/feature-action-panel.js +0 -143
- package/src/components/editor/feature-styles.js +0 -75
- package/src/components/editor/handle-style.js +0 -89
- package/src/components/filters/filter-panels/filter-panel-types.d.ts +0 -28
- package/src/components/filters/filter-panels/filter-panel-with-field-select.js +0 -124
- package/src/components/filters/filter-panels/multi-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/new-filter-panel.js +0 -99
- package/src/components/filters/filter-panels/polygon-filter-panel.js +0 -96
- package/src/components/filters/filter-panels/range-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/single-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/time-range-filter-panel.js +0 -95
- package/src/components/filters/multi-select-filter.js +0 -36
- package/src/components/filters/polygon-filter.d.ts +0 -13
- package/src/components/filters/polygon-filter.js +0 -73
- package/src/components/filters/range-filter.js +0 -43
- package/src/components/filters/single-select-filter.js +0 -49
- package/src/components/filters/time-range-filter.js +0 -68
- package/src/components/filters/time-widget.js +0 -228
- package/src/components/geocoder/geocoder.d.ts +0 -33
- package/src/components/geocoder/geocoder.js +0 -272
- package/src/components/geocoder-panel.js +0 -191
- package/src/components/index.js +0 -247
- package/src/components/injector.js +0 -161
- package/src/components/kepler-gl.js +0 -525
- package/src/components/map/coordinate-info.js +0 -53
- package/src/components/map/layer-hover-info.d.ts +0 -12
- package/src/components/map/layer-hover-info.js +0 -185
- package/src/components/map/layer-selector-panel.d.ts +0 -16
- package/src/components/map/layer-selector-panel.js +0 -106
- package/src/components/map/locale-panel.d.ts +0 -12
- package/src/components/map/locale-panel.js +0 -91
- package/src/components/map/map-control-panel.d.ts +0 -11
- package/src/components/map/map-control-panel.js +0 -98
- package/src/components/map/map-control-tooltip.d.ts +0 -8
- package/src/components/map/map-control-tooltip.js +0 -40
- package/src/components/map/map-control.d.ts +0 -37
- package/src/components/map/map-control.js +0 -100
- package/src/components/map/map-draw-panel.d.ts +0 -16
- package/src/components/map/map-draw-panel.js +0 -125
- package/src/components/map/map-legend-panel.d.ts +0 -20
- package/src/components/map/map-legend-panel.js +0 -100
- package/src/components/map/map-legend.d.ts +0 -58
- package/src/components/map/map-legend.js +0 -228
- package/src/components/map/map-popover.d.ts +0 -28
- package/src/components/map/map-popover.js +0 -250
- package/src/components/map/split-map-button.d.ts +0 -19
- package/src/components/map/split-map-button.js +0 -82
- package/src/components/map/toggle-3d-button.d.ts +0 -16
- package/src/components/map/toggle-3d-button.js +0 -75
- package/src/components/map-container.d.ts +0 -18
- package/src/components/map-container.js +0 -502
- package/src/components/maps-layout.d.ts +0 -5
- package/src/components/maps-layout.js +0 -40
- package/src/components/modal-container.d.ts +0 -38
- package/src/components/modal-container.js +0 -545
- package/src/components/modals/add-map-style-modal.js +0 -301
- package/src/components/modals/cloud-tile.js +0 -147
- package/src/components/modals/data-table-modal.js +0 -217
- package/src/components/modals/delete-data-modal.js +0 -48
- package/src/components/modals/error-display.js +0 -39
- package/src/components/modals/export-data-modal.js +0 -193
- package/src/components/modals/export-image-modal.d.ts +0 -21
- package/src/components/modals/export-image-modal.js +0 -144
- package/src/components/modals/export-map-modal/export-html-map.d.ts +0 -21
- package/src/components/modals/export-map-modal/export-html-map.js +0 -145
- package/src/components/modals/export-map-modal/export-json-map.js +0 -100
- package/src/components/modals/export-map-modal/export-map-modal.js +0 -114
- package/src/components/modals/image-modal-container.d.ts +0 -13
- package/src/components/modals/image-modal-container.js +0 -76
- package/src/components/modals/load-data-modal.d.ts +0 -30
- package/src/components/modals/load-data-modal.js +0 -94
- package/src/components/modals/load-storage-map.js +0 -381
- package/src/components/modals/loading-dialog.js +0 -69
- package/src/components/modals/modal-tabs.js +0 -126
- package/src/components/modals/overwrite-map-modal.d.ts +0 -18
- package/src/components/modals/overwrite-map-modal.js +0 -97
- package/src/components/modals/provider-modal-container.d.ts +0 -12
- package/src/components/modals/provider-modal-container.js +0 -60
- package/src/components/modals/save-map-modal.d.ts +0 -32
- package/src/components/modals/save-map-modal.js +0 -244
- package/src/components/modals/share-map-modal.js +0 -208
- package/src/components/modals/status-panel.js +0 -95
- package/src/components/modals/storage-map-viewer.js +0 -177
- package/src/components/notification-panel/notification-item.js +0 -132
- package/src/components/notification-panel.js +0 -72
- package/src/components/plot-container.js +0 -228
- package/src/components/side-panel/common/dataset-info.js +0 -45
- package/src/components/side-panel/common/dataset-tag.js +0 -55
- package/src/components/side-panel/common/dataset-title.js +0 -146
- package/src/components/side-panel/common/source-data-catalog.js +0 -61
- package/src/components/side-panel/common/source-data-selector.js +0 -79
- package/src/components/side-panel/filter-manager.js +0 -105
- package/src/components/side-panel/filter-panel/filter-panel-header.js +0 -83
- package/src/components/side-panel/filter-panel/filter-panel.js +0 -126
- package/src/components/side-panel/interaction-manager.js +0 -46
- package/src/components/side-panel/interaction-panel/brush-config.js +0 -51
- package/src/components/side-panel/interaction-panel/interaction-panel.js +0 -115
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +0 -199
- package/src/components/side-panel/interaction-panel/tooltip-config.js +0 -190
- package/src/components/side-panel/layer-manager.js +0 -290
- package/src/components/side-panel/layer-panel/color-palette.js +0 -90
- package/src/components/side-panel/layer-panel/color-range-selector.js +0 -353
- package/src/components/side-panel/layer-panel/color-selector.js +0 -196
- package/src/components/side-panel/layer-panel/column-selector.js +0 -70
- package/src/components/side-panel/layer-panel/custom-palette.js +0 -296
- package/src/components/side-panel/layer-panel/custom-picker.js +0 -88
- package/src/components/side-panel/layer-panel/dimension-scale-selector.js +0 -48
- package/src/components/side-panel/layer-panel/layer-column-config.js +0 -113
- package/src/components/side-panel/layer-panel/layer-config-group.js +0 -237
- package/src/components/side-panel/layer-panel/layer-panel-header.js +0 -236
- package/src/components/side-panel/layer-panel/layer-panel.js +0 -171
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +0 -105
- package/src/components/side-panel/layer-panel/layer-type-list-item.js +0 -83
- package/src/components/side-panel/layer-panel/layer-type-selector.js +0 -89
- package/src/components/side-panel/layer-panel/single-color-palette.js +0 -98
- package/src/components/side-panel/layer-panel/text-label-panel.js +0 -179
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +0 -163
- package/src/components/side-panel/layer-panel/vis-config-slider.js +0 -82
- package/src/components/side-panel/layer-panel/vis-config-switch.js +0 -87
- package/src/components/side-panel/map-manager.js +0 -114
- package/src/components/side-panel/map-style-panel/map-layer-selector.js +0 -128
- package/src/components/side-panel/map-style-panel/map-style-selector.js +0 -111
- package/src/components/side-panel/panel-dropdown.js +0 -53
- package/src/components/side-panel/panel-header-action.js +0 -106
- package/src/components/side-panel/panel-header.js +0 -321
- package/src/components/side-panel/panel-tab.js +0 -62
- package/src/components/side-panel/panel-title.js +0 -32
- package/src/components/side-panel/panel-toggle.js +0 -70
- package/src/components/side-panel/side-bar.js +0 -136
- package/src/components/side-panel.d.ts +0 -33
- package/src/components/side-panel.js +0 -253
- package/src/connect/keplergl-connect.js +0 -47
- package/src/connect/with-local-selector.d.ts +0 -11
- package/src/connect/with-local-selector.js +0 -67
- package/src/constants/action-types.d.ts +0 -135
- package/src/constants/action-types.js +0 -184
- package/src/constants/color-ranges.js +0 -72
- package/src/constants/default-settings.js +0 -994
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +0 -56
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +0 -192
- package/src/deckgl-layers/column-layer/enhanced-column-layer.js +0 -63
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +0 -70
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +0 -70
- package/src/deckgl-layers/layer-utils/cluster-utils.js +0 -76
- package/src/deckgl-layers/layer-utils/cpu-aggregator.js +0 -583
- package/src/deckgl-layers/layer-utils/shader-utils.js +0 -41
- package/src/deckgl-layers/line-layer/line-layer.js +0 -122
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +0 -57
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +0 -85
- package/src/layers/aggregation-layer.js +0 -356
- package/src/layers/arc-layer/arc-layer-icon.js +0 -67
- package/src/layers/arc-layer/arc-layer.js +0 -221
- package/src/layers/base-layer.js +0 -1545
- package/src/layers/cluster-layer/cluster-layer.js +0 -125
- package/src/layers/geojson-layer/geojson-layer-icon.js +0 -68
- package/src/layers/geojson-layer/geojson-layer.js +0 -344
- package/src/layers/geojson-layer/geojson-utils.js +0 -179
- package/src/layers/grid-layer/grid-layer-icon.js +0 -53
- package/src/layers/grid-layer/grid-layer.js +0 -95
- package/src/layers/grid-layer/grid-utils.js +0 -71
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +0 -264
- package/src/layers/h3-hexagon-layer/h3-utils.js +0 -65
- package/src/layers/heatmap-layer/heatmap-layer.js +0 -226
- package/src/layers/hexagon-layer/hexagon-layer.js +0 -95
- package/src/layers/hexagon-layer/hexagon-utils.js +0 -63
- package/src/layers/icon-layer/icon-info-modal.js +0 -155
- package/src/layers/icon-layer/icon-layer.js +0 -324
- package/src/layers/index.d.ts +0 -128
- package/src/layers/index.js +0 -72
- package/src/layers/layer-factory.d.ts +0 -149
- package/src/layers/layer-factory.js +0 -480
- package/src/layers/layer-text-label.js +0 -62
- package/src/layers/layer-update.js +0 -71
- package/src/layers/line-layer/line-layer.js +0 -161
- package/src/layers/mapbox-utils.js +0 -195
- package/src/layers/mapboxgl-layer.js +0 -154
- package/src/layers/point-layer/point-layer.js +0 -414
- package/src/layers/s2-geometry-layer/s2-geometry-layer.js +0 -265
- package/src/layers/s2-geometry-layer/s2-utils.js +0 -36
- package/src/layers/scenegraph-layer/scenegraph-layer.js +0 -182
- package/src/layers/trip-layer/trip-layer.js +0 -295
- package/src/layers/trip-layer/trip-utils.js +0 -169
- package/src/localization/en.js +0 -504
- package/src/localization/formatted-message.js +0 -33
- package/src/localization/index.js +0 -32
- package/src/localization/locales.js +0 -46
- package/src/middleware/index.js +0 -34
- package/src/processors/data-processor.d.ts +0 -57
- package/src/processors/data-processor.js +0 -684
- package/src/processors/file-handler.d.ts +0 -46
- package/src/processors/file-handler.js +0 -220
- package/src/processors/index.js +0 -44
- package/src/reducers/combined-updaters.d.ts +0 -26
- package/src/reducers/combined-updaters.js +0 -198
- package/src/reducers/composer-helpers.d.ts +0 -32
- package/src/reducers/composer-helpers.js +0 -70
- package/src/reducers/core.d.ts +0 -25
- package/src/reducers/core.js +0 -97
- package/src/reducers/index.d.ts +0 -118
- package/src/reducers/index.js +0 -53
- package/src/reducers/map-state-updaters.d.ts +0 -64
- package/src/reducers/map-state-updaters.js +0 -224
- package/src/reducers/map-state.js +0 -47
- package/src/reducers/map-style-updaters.d.ts +0 -76
- package/src/reducers/map-style-updaters.js +0 -541
- package/src/reducers/map-style.js +0 -53
- package/src/reducers/provider-state-updaters.d.ts +0 -88
- package/src/reducers/provider-state-updaters.js +0 -428
- package/src/reducers/provider-state.js +0 -53
- package/src/reducers/root.js +0 -230
- package/src/reducers/types.d.ts +0 -10
- package/src/reducers/ui-state-updaters.d.ts +0 -198
- package/src/reducers/ui-state-updaters.js +0 -766
- package/src/reducers/ui-state.js +0 -73
- package/src/reducers/vis-state-merger.d.ts +0 -78
- package/src/reducers/vis-state-merger.js +0 -557
- package/src/reducers/vis-state-selectors.js +0 -35
- package/src/reducers/vis-state-updaters.d.ts +0 -534
- package/src/reducers/vis-state-updaters.js +0 -2137
- package/src/reducers/vis-state.js +0 -155
- package/src/schemas/dataset-schema.js +0 -141
- package/src/schemas/index.d.ts +0 -24
- package/src/schemas/index.js +0 -42
- package/src/schemas/schema-manager.d.ts +0 -229
- package/src/schemas/schema-manager.js +0 -228
- package/src/schemas/schema.d.ts +0 -47
- package/src/schemas/schema.js +0 -90
- package/src/schemas/versions.d.ts +0 -23
- package/src/schemas/vis-state-schema.js +0 -754
- package/src/styles/base.js +0 -1620
- package/src/styles/media-breakpoints.js +0 -47
- package/src/typedefs/README.md +0 -3
- package/src/typedefs/deck.gl__core.d.ts +0 -64
- package/src/typedefs/deck.gl__mesh-layers.d.ts +0 -33
- package/src/utils/aggregate-utils.js +0 -71
- package/src/utils/color-utils.js +0 -115
- package/src/utils/data-scale-utils.d.ts +0 -26
- package/src/utils/data-scale-utils.js +0 -61
- package/src/utils/data-utils.d.ts +0 -46
- package/src/utils/data-utils.js +0 -447
- package/src/utils/dataset-utils.d.ts +0 -10
- package/src/utils/dataset-utils.js +0 -255
- package/src/utils/dom-to-image.js +0 -533
- package/src/utils/dom-utils.js +0 -354
- package/src/utils/export-utils.js +0 -247
- package/src/utils/filter-utils.d.ts +0 -192
- package/src/utils/filter-utils.js +0 -1114
- package/src/utils/gl-utils.js +0 -42
- package/src/utils/gpu-filter-utils.d.ts +0 -28
- package/src/utils/gpu-filter-utils.js +0 -253
- package/src/utils/index.d.ts +0 -5
- package/src/utils/index.js +0 -55
- package/src/utils/interaction-utils.d.ts +0 -36
- package/src/utils/interaction-utils.js +0 -185
- package/src/utils/layer-utils.d.ts +0 -78
- package/src/utils/layer-utils.js +0 -206
- package/src/utils/map-style-utils/mapbox-gl-style-editor.js +0 -201
- package/src/utils/notifications-utils.js +0 -83
- package/src/utils/observe-dimensions.d.ts +0 -18
- package/src/utils/observe-dimensions.js +0 -115
- package/src/utils/split-map-utils.js +0 -104
- package/src/utils/table-utils/data-container-utils.d.ts +0 -43
- package/src/utils/table-utils/data-container-utils.js +0 -61
- package/src/utils/table-utils/data-row.d.ts +0 -65
- package/src/utils/table-utils/data-row.js +0 -54
- package/src/utils/table-utils/index.d.ts +0 -1
- package/src/utils/table-utils/indexed-data-container.d.ts +0 -26
- package/src/utils/table-utils/indexed-data-container.js +0 -152
- package/src/utils/table-utils/kepler-table.d.ts +0 -114
- package/src/utils/table-utils/kepler-table.js +0 -508
- package/src/utils/table-utils/row-data-container.d.ts +0 -30
- package/src/utils/table-utils/row-data-container.js +0 -151
- package/src/utils/utils.js +0 -202
- /package/src/actions/{index.js → index.ts} +0 -0
- /package/src/components/common/data-table/{canvas.js → canvas.tsx} +0 -0
- /package/src/components/editor/{constants.js → constants.ts} +0 -0
- /package/src/components/filters/{components.js → components.ts} +0 -0
- /package/src/components/filters/{index.js → index.ts} +0 -0
- /package/src/components/map/{map-control-toolbar.js → map-control-toolbar.tsx} +0 -0
- /package/src/components/modals/export-map-modal/{components.js → components.tsx} +0 -0
- /package/src/components/modals/{modal-dialog.js → modal-dialog.tsx} +0 -0
- /package/src/components/side-panel/{cloud-storage-dropdown.js → cloud-storage-dropdown.tsx} +0 -0
- /package/src/components/side-panel/{custom-panel.js → custom-panel.tsx} +0 -0
- /package/src/components/side-panel/layer-panel/{layer-configurator.js → layer-configurator.tsx} +0 -0
- /package/src/constants/{color-palette.js → color-palette.ts} +0 -0
- /package/src/constants/{custom-color-ranges.js → custom-color-ranges.ts} +0 -0
- /package/src/constants/{index.js → index.ts} +0 -0
- /package/src/constants/{keyevent.js → keyevent.ts} +0 -0
- /package/src/constants/{tooltip.js → tooltip.ts} +0 -0
- /package/src/constants/{user-feedbacks.js → user-feedbacks.ts} +0 -0
- /package/src/constants/{user-guides.js → user-guides.ts} +0 -0
- /package/src/layers/cluster-layer/{cluster-layer-icon.js → cluster-layer-icon.tsx} +0 -0
- /package/src/layers/{default-layer-icon.js → default-layer-icon.tsx} +0 -0
- /package/src/layers/h3-hexagon-layer/{h3-hexagon-layer-icon.js → h3-hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/heatmap-layer/{heatmap-layer-icon.js → heatmap-layer-icon.tsx} +0 -0
- /package/src/layers/hexagon-layer/{hexagon-layer-icon.js → hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/icon-layer/{icon-layer-icon.js → icon-layer-icon.tsx} +0 -0
- /package/src/layers/line-layer/{line-layer-icon.js → line-layer-icon.tsx} +0 -0
- /package/src/layers/point-layer/{point-layer-icon.js → point-layer-icon.tsx} +0 -0
- /package/src/layers/s2-geometry-layer/{s2-layer-icon.js → s2-layer-icon.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-info-modal.js → scenegraph-info-modal.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-layer-icon.js → scenegraph-layer-icon.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-info-modal.js → trip-info-modal.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-layer-icon.js → trip-layer-icon.tsx} +0 -0
- /package/src/layers/{types.js → types.ts} +0 -0
- /package/src/reducers/{composers.js → composers.ts} +0 -0
- /package/src/schemas/{map-state-schema.js → map-state-schema.ts} +0 -0
- /package/src/schemas/{map-style-schema.js → map-style-schema.ts} +0 -0
- /package/src/schemas/{schema-utils.js → schema-utils.ts} +0 -0
- /package/src/schemas/{versions.js → versions.ts} +0 -0
- /package/src/styles/{index.js → index.ts} +0 -0
- /package/src/tasks/{tasks.js → tasks.ts} +0 -0
- /package/src/templates/{export-map-html.js → export-map-html.ts} +0 -0
- /package/src/utils/{locale-utils.js → locale-utils.ts} +0 -0
- /package/src/utils/{map-info-utils.js → map-info-utils.ts} +0 -0
- /package/src/utils/map-style-utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{projection-utils.js → projection-utils.ts} +0 -0
- /package/src/utils/{searcher-utils.js → searcher-utils.ts} +0 -0
- /package/src/utils/table-utils/{data-container-interface.d.ts → data-container-interface.ts} +0 -0
- /package/src/utils/table-utils/{index.js → index.ts} +0 -0
|
@@ -1,136 +1,154 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
4
5
|
Object.defineProperty(exports, "__esModule", {
|
|
5
6
|
value: true
|
|
6
7
|
});
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
8
|
+
exports.getValueFunc = getValueFunc;
|
|
9
|
+
exports.getScaleFunctor = getScaleFunctor;
|
|
10
|
+
exports.getGetValue = getGetValue;
|
|
10
11
|
exports.getDimensionSortedBins = getDimensionSortedBins;
|
|
11
12
|
exports.getDimensionValueDomain = getDimensionValueDomain;
|
|
12
|
-
exports.
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
13
|
+
exports.getDimensionScale = getDimensionScale;
|
|
14
|
+
exports.getAggregatedData = getAggregatedData;
|
|
15
|
+
exports["default"] = exports.defaultDimensions = exports.defaultElevationDimension = exports.defaultColorDimension = exports.defaultAggregation = exports.DECK_AGGREGATION_MAP = void 0;
|
|
16
|
+
|
|
15
17
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
18
|
+
|
|
16
19
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
20
|
+
|
|
17
21
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
22
|
+
|
|
18
23
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
24
|
+
|
|
19
25
|
var _aggregationLayers = require("@deck.gl/aggregation-layers");
|
|
26
|
+
|
|
20
27
|
var _window = require("global/window");
|
|
28
|
+
|
|
21
29
|
var _aggregateUtils = require("../../utils/aggregate-utils");
|
|
30
|
+
|
|
22
31
|
var _defaultSettings = require("../../constants/default-settings");
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// The above copyright notice and this permission notice shall be included in
|
|
34
|
-
// all copies or substantial portions of the Software.
|
|
35
|
-
//
|
|
36
|
-
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
37
|
-
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
38
|
-
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
39
|
-
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
40
|
-
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
41
|
-
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
42
|
-
// THE SOFTWARE.
|
|
43
|
-
/* eslint-disable guard-for-in */
|
|
44
|
-
var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _aggregationLayers.AGGREGATION_OPERATION.SUM, _defaultSettings.AGGREGATION_TYPES.sum), _aggregationLayers.AGGREGATION_OPERATION.MEAN, _defaultSettings.AGGREGATION_TYPES.average), _aggregationLayers.AGGREGATION_OPERATION.MIN, _defaultSettings.AGGREGATION_TYPES.minimum), _aggregationLayers.AGGREGATION_OPERATION.MAX, _defaultSettings.AGGREGATION_TYPES.maximum);
|
|
32
|
+
|
|
33
|
+
var _DECK_AGGREGATION_MAP;
|
|
34
|
+
|
|
35
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
36
|
+
|
|
37
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
38
|
+
|
|
39
|
+
var DECK_AGGREGATION_MAP = (_DECK_AGGREGATION_MAP = {}, (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.SUM, _defaultSettings.AGGREGATION_TYPES.sum), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MEAN, _defaultSettings.AGGREGATION_TYPES.average), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MIN, _defaultSettings.AGGREGATION_TYPES.minimum), (0, _defineProperty2["default"])(_DECK_AGGREGATION_MAP, _aggregationLayers.AGGREGATION_OPERATION.MAX, _defaultSettings.AGGREGATION_TYPES.maximum), _DECK_AGGREGATION_MAP);
|
|
40
|
+
exports.DECK_AGGREGATION_MAP = DECK_AGGREGATION_MAP;
|
|
41
|
+
|
|
45
42
|
function getValueFunc(aggregation, accessor) {
|
|
46
43
|
if (!aggregation || !_aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
|
|
47
44
|
_window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
|
|
48
45
|
}
|
|
46
|
+
|
|
49
47
|
var op = _aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()] || _aggregationLayers.AGGREGATION_OPERATION.SUM;
|
|
48
|
+
|
|
50
49
|
var keplerOp = DECK_AGGREGATION_MAP[op];
|
|
51
50
|
return function (pts) {
|
|
52
51
|
return (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
|
|
53
52
|
};
|
|
54
53
|
}
|
|
54
|
+
|
|
55
55
|
function getScaleFunctor(scaleType) {
|
|
56
56
|
if (!scaleType || !_defaultSettings.SCALE_FUNC[scaleType]) {
|
|
57
57
|
_window.console.warn("Scale ".concat(scaleType, " is not supported"));
|
|
58
58
|
}
|
|
59
|
+
|
|
59
60
|
return _defaultSettings.SCALE_FUNC[scaleType] || _defaultSettings.SCALE_FUNC.quantize;
|
|
60
61
|
}
|
|
62
|
+
|
|
61
63
|
function nop() {}
|
|
64
|
+
|
|
62
65
|
function getGetValue(step, props, dimensionUpdater) {
|
|
63
66
|
var key = dimensionUpdater.key;
|
|
64
67
|
var _step$triggers = step.triggers,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
value = _step$triggers.value,
|
|
69
|
+
weight = _step$triggers.weight,
|
|
70
|
+
aggregation = _step$triggers.aggregation;
|
|
68
71
|
var getValue = props[value.prop];
|
|
72
|
+
|
|
69
73
|
if (getValue === null) {
|
|
70
74
|
// If `getValue` is not provided from props, build it with aggregation and weight.
|
|
71
75
|
getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
|
|
72
76
|
}
|
|
77
|
+
|
|
73
78
|
if (getValue) {
|
|
74
79
|
this._setDimensionState(key, {
|
|
75
80
|
getValue: getValue
|
|
76
81
|
});
|
|
77
82
|
}
|
|
78
83
|
}
|
|
84
|
+
|
|
79
85
|
function getDimensionSortedBins(step, props, dimensionUpdater) {
|
|
80
86
|
var key = dimensionUpdater.key;
|
|
81
|
-
var getValue = this.state.dimensions[key].getValue;
|
|
87
|
+
var getValue = this.state.dimensions[key].getValue; // @ts-expect-error
|
|
88
|
+
|
|
82
89
|
var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
|
|
83
90
|
getValue: getValue,
|
|
84
91
|
filterData: props._filterData
|
|
85
92
|
});
|
|
93
|
+
|
|
86
94
|
this._setDimensionState(key, {
|
|
87
95
|
sortedBins: sortedBins
|
|
88
96
|
});
|
|
89
97
|
}
|
|
98
|
+
|
|
90
99
|
function getDimensionValueDomain(step, props, dimensionUpdater) {
|
|
91
100
|
var key = dimensionUpdater.key;
|
|
92
101
|
var _step$triggers2 = step.triggers,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
102
|
+
lowerPercentile = _step$triggers2.lowerPercentile,
|
|
103
|
+
upperPercentile = _step$triggers2.upperPercentile,
|
|
104
|
+
scaleType = _step$triggers2.scaleType;
|
|
105
|
+
|
|
96
106
|
if (!this.state.dimensions[key].sortedBins) {
|
|
97
107
|
// the previous step should set sortedBins, if not, something went wrong
|
|
98
108
|
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// for log and sqrt scale, returns linear domain by default
|
|
109
|
+
} // for log and sqrt scale, returns linear domain by default
|
|
102
110
|
// TODO: support other scale function domain in bin sorter
|
|
111
|
+
|
|
112
|
+
|
|
103
113
|
var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
|
|
114
|
+
|
|
104
115
|
this._setDimensionState(key, {
|
|
105
116
|
// By default sortedBins order by ascending frecuency but if we've an ordinal scale we want to order by descending frecuency
|
|
106
117
|
valueDomain: props[scaleType.prop] === _defaultSettings.SCALE_TYPES.ordinal ? valueDomain.reverse() : valueDomain
|
|
107
118
|
});
|
|
108
119
|
}
|
|
120
|
+
|
|
109
121
|
function getDimensionScale(step, props, dimensionUpdater) {
|
|
110
122
|
var key = dimensionUpdater.key;
|
|
111
123
|
var _step$triggers3 = step.triggers,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
124
|
+
domain = _step$triggers3.domain,
|
|
125
|
+
range = _step$triggers3.range,
|
|
126
|
+
scaleType = _step$triggers3.scaleType;
|
|
115
127
|
var onSet = step.onSet;
|
|
128
|
+
|
|
116
129
|
if (!this.state.dimensions[key].valueDomain) {
|
|
117
130
|
// the previous step should set valueDomain, if not, something went wrong
|
|
118
131
|
return;
|
|
119
132
|
}
|
|
133
|
+
|
|
120
134
|
var dimensionRange = props[range.prop];
|
|
121
135
|
var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
|
|
122
136
|
var scaleTypeProp = scaleType && props[scaleType.prop];
|
|
123
137
|
var scaleFunctor = getScaleFunctor(scaleTypeProp)();
|
|
124
138
|
var scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
139
|
+
|
|
125
140
|
if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
|
|
126
141
|
props[onSet.props](this.state.dimensions[key].valueDomain);
|
|
127
142
|
}
|
|
143
|
+
|
|
128
144
|
this._setDimensionState(key, {
|
|
129
145
|
scaleFunc: scaleFunc
|
|
130
146
|
});
|
|
131
147
|
}
|
|
148
|
+
|
|
132
149
|
function normalizeResult() {
|
|
133
150
|
var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
151
|
+
|
|
134
152
|
// support previous hexagonAggregator API
|
|
135
153
|
if (result.hexagons) {
|
|
136
154
|
return Object.assign({
|
|
@@ -141,20 +159,22 @@ function normalizeResult() {
|
|
|
141
159
|
data: result.layerData
|
|
142
160
|
}, result);
|
|
143
161
|
}
|
|
162
|
+
|
|
144
163
|
return result;
|
|
145
164
|
}
|
|
165
|
+
|
|
146
166
|
function getAggregatedData(step, props, aggregation, aggregationParams) {
|
|
147
167
|
var aggr = step.triggers.aggregator;
|
|
148
|
-
var aggregator = props[aggr.prop];
|
|
149
|
-
|
|
150
|
-
// result should contain a data array and other props
|
|
168
|
+
var aggregator = props[aggr.prop]; // result should contain a data array and other props
|
|
151
169
|
// result = {data: [], ...other props}
|
|
170
|
+
|
|
152
171
|
var result = aggregator(props, aggregationParams);
|
|
153
172
|
this.setState({
|
|
154
173
|
layerData: normalizeResult(result)
|
|
155
174
|
});
|
|
156
175
|
}
|
|
157
|
-
|
|
176
|
+
|
|
177
|
+
var defaultAggregation = {
|
|
158
178
|
key: 'position',
|
|
159
179
|
updateSteps: [{
|
|
160
180
|
key: 'aggregate',
|
|
@@ -173,26 +193,29 @@ var defaultAggregation = exports.defaultAggregation = {
|
|
|
173
193
|
updater: getAggregatedData
|
|
174
194
|
}]
|
|
175
195
|
};
|
|
196
|
+
exports.defaultAggregation = defaultAggregation;
|
|
197
|
+
|
|
176
198
|
function getSubLayerAccessor(dimensionState, dimension, layerProps) {
|
|
177
199
|
return function (cell) {
|
|
178
200
|
var sortedBins = dimensionState.sortedBins,
|
|
179
|
-
|
|
201
|
+
scaleFunc = dimensionState.scaleFunc;
|
|
180
202
|
var bin = sortedBins.binMap[cell.index];
|
|
203
|
+
|
|
181
204
|
if (bin && bin.counts === 0) {
|
|
182
205
|
// no points left in bin after filtering
|
|
183
206
|
return dimension.nullValue;
|
|
184
207
|
}
|
|
185
|
-
var cv = bin && bin.value;
|
|
186
|
-
// const domain = scaleFunc.domain();
|
|
187
208
|
|
|
209
|
+
var cv = bin && bin.value; // const domain = scaleFunc.domain();
|
|
188
210
|
// const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
|
|
189
|
-
|
|
190
211
|
// if cell value is outside domain, set alpha to 0
|
|
191
212
|
// return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
|
|
213
|
+
|
|
192
214
|
return scaleFunc(cv);
|
|
193
215
|
};
|
|
194
216
|
}
|
|
195
|
-
|
|
217
|
+
|
|
218
|
+
var defaultColorDimension = {
|
|
196
219
|
key: 'fillColor',
|
|
197
220
|
accessor: 'getFillColor',
|
|
198
221
|
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
|
@@ -262,7 +285,8 @@ var defaultColorDimension = exports.defaultColorDimension = {
|
|
|
262
285
|
}],
|
|
263
286
|
getSubLayerAccessor: getSubLayerAccessor
|
|
264
287
|
};
|
|
265
|
-
|
|
288
|
+
exports.defaultColorDimension = defaultColorDimension;
|
|
289
|
+
var defaultElevationDimension = {
|
|
266
290
|
key: 'elevation',
|
|
267
291
|
accessor: 'getElevation',
|
|
268
292
|
getPickingInfo: function getPickingInfo(dimensionState, cell) {
|
|
@@ -332,15 +356,20 @@ var defaultElevationDimension = exports.defaultElevationDimension = {
|
|
|
332
356
|
}],
|
|
333
357
|
getSubLayerAccessor: getSubLayerAccessor
|
|
334
358
|
};
|
|
335
|
-
|
|
336
|
-
var
|
|
359
|
+
exports.defaultElevationDimension = defaultElevationDimension;
|
|
360
|
+
var _defaultDimensions = [defaultColorDimension, defaultElevationDimension];
|
|
361
|
+
exports.defaultDimensions = _defaultDimensions;
|
|
362
|
+
|
|
363
|
+
var CPUAggregator = /*#__PURE__*/function () {
|
|
337
364
|
function CPUAggregator() {
|
|
338
365
|
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
339
366
|
(0, _classCallCheck2["default"])(this, CPUAggregator);
|
|
367
|
+
(0, _defineProperty2["default"])(this, "state", void 0);
|
|
368
|
+
(0, _defineProperty2["default"])(this, "dimensionUpdaters", void 0);
|
|
369
|
+
(0, _defineProperty2["default"])(this, "aggregationUpdater", void 0);
|
|
340
370
|
this.state = _objectSpread({
|
|
341
371
|
layerData: {},
|
|
342
|
-
dimensions: {
|
|
343
|
-
// color: {
|
|
372
|
+
dimensions: {// color: {
|
|
344
373
|
// getValue: null,
|
|
345
374
|
// domain: null,
|
|
346
375
|
// sortedBins: null,
|
|
@@ -355,19 +384,22 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
355
384
|
}
|
|
356
385
|
}, opts.initialState);
|
|
357
386
|
this.dimensionUpdaters = {};
|
|
358
|
-
this.aggregationUpdater =
|
|
387
|
+
this.aggregationUpdater = opts.aggregation || defaultAggregation;
|
|
388
|
+
|
|
359
389
|
this._addDimension(opts.dimensions || _defaultDimensions);
|
|
360
|
-
this._addAggregation(opts.aggregation || defaultAggregation);
|
|
361
390
|
}
|
|
391
|
+
|
|
362
392
|
(0, _createClass2["default"])(CPUAggregator, [{
|
|
363
393
|
key: "updateAllDimensions",
|
|
364
394
|
value: function updateAllDimensions(props) {
|
|
365
|
-
var dimensionChanges = [];
|
|
366
|
-
|
|
395
|
+
var dimensionChanges = []; // update all dimensions
|
|
396
|
+
|
|
367
397
|
for (var dim in this.dimensionUpdaters) {
|
|
368
398
|
var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
|
|
399
|
+
|
|
369
400
|
dimensionChanges = dimensionChanges.concat(updaters);
|
|
370
401
|
}
|
|
402
|
+
|
|
371
403
|
dimensionChanges.forEach(function (f) {
|
|
372
404
|
return typeof f === 'function' && f();
|
|
373
405
|
});
|
|
@@ -376,6 +408,7 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
376
408
|
key: "updateAggregation",
|
|
377
409
|
value: function updateAggregation(props, aggregationParams) {
|
|
378
410
|
var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
|
|
411
|
+
|
|
379
412
|
updaters.forEach(function (f) {
|
|
380
413
|
return typeof f === 'function' && f(aggregationParams);
|
|
381
414
|
});
|
|
@@ -384,16 +417,19 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
384
417
|
key: "updateState",
|
|
385
418
|
value: function updateState(opts, aggregationParams) {
|
|
386
419
|
var oldProps = opts.oldProps,
|
|
387
|
-
|
|
388
|
-
|
|
420
|
+
props = opts.props,
|
|
421
|
+
changeFlags = opts.changeFlags;
|
|
389
422
|
var dimensionChanges = [];
|
|
423
|
+
|
|
390
424
|
if (changeFlags.dataChanged) {
|
|
391
425
|
// if data changed update everything
|
|
392
426
|
this.updateAggregation(props, aggregationParams);
|
|
393
427
|
this.updateAllDimensions(props);
|
|
394
428
|
return this.state;
|
|
395
429
|
}
|
|
430
|
+
|
|
396
431
|
var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
|
|
432
|
+
|
|
397
433
|
if (aggregationChanges && aggregationChanges.length) {
|
|
398
434
|
// get aggregatedData
|
|
399
435
|
aggregationChanges.forEach(function (f) {
|
|
@@ -407,17 +443,16 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
407
443
|
return typeof f === 'function' && f();
|
|
408
444
|
});
|
|
409
445
|
}
|
|
446
|
+
|
|
410
447
|
return this.state;
|
|
411
|
-
}
|
|
448
|
+
} // Update private state
|
|
412
449
|
|
|
413
|
-
// Update private state
|
|
414
450
|
}, {
|
|
415
451
|
key: "setState",
|
|
416
452
|
value: function setState(updateObject) {
|
|
417
453
|
this.state = Object.assign({}, this.state, updateObject);
|
|
418
|
-
}
|
|
454
|
+
} // Update private state.dimensions
|
|
419
455
|
|
|
420
|
-
// Update private state.dimensions
|
|
421
456
|
}, {
|
|
422
457
|
key: "_setDimensionState",
|
|
423
458
|
value: function _setDimensionState(key, updateObject) {
|
|
@@ -434,6 +469,7 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
434
469
|
key: "_addDimension",
|
|
435
470
|
value: function _addDimension() {
|
|
436
471
|
var _this = this;
|
|
472
|
+
|
|
437
473
|
var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
438
474
|
dimensions.forEach(function (dimension) {
|
|
439
475
|
var key = dimension.key;
|
|
@@ -451,8 +487,9 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
451
487
|
if (item.updateTrigger) {
|
|
452
488
|
// check based on updateTriggers change first
|
|
453
489
|
return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
|
|
454
|
-
}
|
|
455
|
-
|
|
490
|
+
} // fallback to direct comparison
|
|
491
|
+
|
|
492
|
+
|
|
456
493
|
return oldProps[item.prop] !== props[item.prop];
|
|
457
494
|
});
|
|
458
495
|
}
|
|
@@ -460,67 +497,82 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
460
497
|
key: "_accumulateUpdaters",
|
|
461
498
|
value: function _accumulateUpdaters(step, props, dimension) {
|
|
462
499
|
var updaters = [];
|
|
500
|
+
|
|
463
501
|
for (var i = step; i < dimension.updateSteps.length; i++) {
|
|
464
|
-
|
|
465
|
-
|
|
502
|
+
var updater = dimension.updateSteps[i].updater;
|
|
503
|
+
|
|
504
|
+
if (typeof updater === 'function') {
|
|
505
|
+
updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
|
|
466
506
|
}
|
|
467
507
|
}
|
|
508
|
+
|
|
468
509
|
return updaters;
|
|
469
510
|
}
|
|
470
511
|
}, {
|
|
471
512
|
key: "_getAllUpdaters",
|
|
472
513
|
value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
|
|
473
514
|
var _this2 = this;
|
|
515
|
+
|
|
474
516
|
var updaters = [];
|
|
475
517
|
var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
|
|
476
518
|
return _this2._needUpdateStep(step, oldProps, props, changeFlags);
|
|
477
519
|
});
|
|
520
|
+
|
|
478
521
|
if (needUpdateStep > -1) {
|
|
479
522
|
updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
|
|
480
523
|
}
|
|
524
|
+
|
|
481
525
|
return updaters;
|
|
482
526
|
}
|
|
483
527
|
}, {
|
|
484
528
|
key: "_getAggregationChanges",
|
|
485
529
|
value: function _getAggregationChanges(oldProps, props, changeFlags) {
|
|
486
530
|
var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
|
|
531
|
+
|
|
487
532
|
return updaters.length ? updaters : null;
|
|
488
533
|
}
|
|
489
534
|
}, {
|
|
490
535
|
key: "_getDimensionChanges",
|
|
491
536
|
value: function _getDimensionChanges(oldProps, props, changeFlags) {
|
|
492
|
-
var updaters = [];
|
|
537
|
+
var updaters = []; // get dimension to be updated
|
|
493
538
|
|
|
494
|
-
|
|
495
|
-
for (var key in this.dimensionUpdaters) {
|
|
539
|
+
for (var _key in this.dimensionUpdaters) {
|
|
496
540
|
// return the first triggered updater for each dimension
|
|
497
|
-
var dimension = this.dimensionUpdaters[
|
|
541
|
+
var dimension = this.dimensionUpdaters[_key];
|
|
542
|
+
|
|
498
543
|
var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
|
|
544
|
+
|
|
499
545
|
updaters = updaters.concat(dimensionUpdaters);
|
|
500
546
|
}
|
|
547
|
+
|
|
501
548
|
return updaters.length ? updaters : null;
|
|
502
549
|
}
|
|
503
550
|
}, {
|
|
504
551
|
key: "getUpdateTriggers",
|
|
505
552
|
value: function getUpdateTriggers(props) {
|
|
506
553
|
var _this3 = this;
|
|
554
|
+
|
|
507
555
|
var _updateTriggers = props.updateTriggers || {};
|
|
556
|
+
|
|
508
557
|
var updateTriggers = {};
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
558
|
+
|
|
559
|
+
var _loop = function _loop(_key2) {
|
|
560
|
+
var _this3$dimensionUpdat = _this3.dimensionUpdaters[_key2],
|
|
561
|
+
accessor = _this3$dimensionUpdat.accessor,
|
|
562
|
+
updateSteps = _this3$dimensionUpdat.updateSteps; // fold dimension triggers into each accessor
|
|
563
|
+
|
|
514
564
|
updateTriggers[accessor] = {};
|
|
515
565
|
updateSteps.forEach(function (step) {
|
|
516
566
|
Object.values(step.triggers || []).forEach(function (_ref) {
|
|
517
567
|
var prop = _ref.prop,
|
|
518
|
-
|
|
568
|
+
updateTrigger = _ref.updateTrigger;
|
|
569
|
+
|
|
519
570
|
if (updateTrigger) {
|
|
520
571
|
// if prop is based on updateTrigger e.g. getColorValue, getColorWeight
|
|
521
572
|
// and updateTriggers is passed in from layer prop
|
|
522
573
|
// fold the updateTriggers into accessor
|
|
523
574
|
var fromProp = _updateTriggers[updateTrigger];
|
|
575
|
+
|
|
524
576
|
if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
|
|
525
577
|
// if updateTrigger is an object spread it
|
|
526
578
|
Object.assign(updateTriggers[accessor], fromProp);
|
|
@@ -534,9 +586,11 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
534
586
|
});
|
|
535
587
|
});
|
|
536
588
|
};
|
|
537
|
-
|
|
538
|
-
|
|
589
|
+
|
|
590
|
+
for (var _key2 in this.dimensionUpdaters) {
|
|
591
|
+
_loop(_key2);
|
|
539
592
|
}
|
|
593
|
+
|
|
540
594
|
return updateTriggers;
|
|
541
595
|
}
|
|
542
596
|
}, {
|
|
@@ -545,21 +599,25 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
545
599
|
var info = _ref2.info;
|
|
546
600
|
var isPicked = info.picked && info.index > -1;
|
|
547
601
|
var object = null;
|
|
602
|
+
|
|
548
603
|
if (isPicked) {
|
|
549
|
-
var
|
|
604
|
+
var _cell = this.state.layerData.data[info.index];
|
|
550
605
|
var binInfo = {};
|
|
551
|
-
|
|
552
|
-
|
|
606
|
+
|
|
607
|
+
for (var _key3 in this.dimensionUpdaters) {
|
|
608
|
+
var getPickingInfo = this.dimensionUpdaters[_key3].getPickingInfo;
|
|
609
|
+
|
|
553
610
|
if (typeof getPickingInfo === 'function') {
|
|
554
|
-
binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[
|
|
611
|
+
binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[_key3], _cell, layerProps));
|
|
555
612
|
}
|
|
556
613
|
}
|
|
557
|
-
|
|
558
|
-
|
|
614
|
+
|
|
615
|
+
object = Object.assign(binInfo, _cell, {
|
|
616
|
+
points: _cell.filteredPoints || _cell.points
|
|
559
617
|
});
|
|
560
|
-
}
|
|
618
|
+
} // add bin and to info
|
|
619
|
+
|
|
561
620
|
|
|
562
|
-
// add bin and to info
|
|
563
621
|
return Object.assign(info, {
|
|
564
622
|
picked: Boolean(object),
|
|
565
623
|
// override object with picked cell
|
|
@@ -572,6 +630,7 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
572
630
|
if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
|
|
573
631
|
return nop;
|
|
574
632
|
}
|
|
633
|
+
|
|
575
634
|
return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
|
|
576
635
|
}
|
|
577
636
|
}], [{
|
|
@@ -582,5 +641,8 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
|
|
|
582
641
|
}]);
|
|
583
642
|
return CPUAggregator;
|
|
584
643
|
}();
|
|
644
|
+
|
|
645
|
+
exports["default"] = CPUAggregator;
|
|
646
|
+
(0, _defineProperty2["default"])(CPUAggregator, "getDimensionScale", void 0);
|
|
585
647
|
CPUAggregator.getDimensionScale = getDimensionScale;
|
|
586
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0Iiwib3AiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJyZXZlcnNlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJfc3RlcCR0cmlnZ2VyczMiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZVR5cGVQcm9wIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwic2xpY2UiLCJ1bmtub3duIiwiVU5LTk9XTl9DT0xPUiIsIl90eXBlb2YyIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdnciIsImFnZ3JlZ2F0b3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwib3B0cyIsIl9jbGFzc0NhbGxDaGVjazIiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJfYWRkQWdncmVnYXRpb24iLCJfY3JlYXRlQ2xhc3MyIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl90aGlzIiwiX25lZWRVcGRhdGVTdGVwIiwiZGltZW5zaW9uU3RlcCIsInZhbHVlcyIsInNvbWUiLCJpdGVtIiwidXBkYXRlVHJpZ2dlcnNDaGFuZ2VkIiwiYWxsIiwiaSIsImJpbmQiLCJfZ2V0QWxsVXBkYXRlcnMiLCJfdGhpczIiLCJuZWVkVXBkYXRlU3RlcCIsImZpbmRJbmRleCIsImdldFVwZGF0ZVRyaWdnZXJzIiwiX3RoaXMzIiwiX3VwZGF0ZVRyaWdnZXJzIiwidXBkYXRlVHJpZ2dlcnMiLCJfbG9vcCIsIl90aGlzMyRkaW1lbnNpb25VcGRhdCIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJ3V0aWxzL2FnZ3JlZ2F0ZS11dGlscyc7XG5pbXBvcnQge1xuICBBR0dSRUdBVElPTl9UWVBFUyxcbiAgU0NBTEVfRlVOQyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgU0NBTEVfVFlQRVNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVAgPSB7XG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNXTogQUdHUkVHQVRJT05fVFlQRVMuc3VtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1FQU5dOiBBR0dSRUdBVElPTl9UWVBFUy5hdmVyYWdlLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1JTl06IEFHR1JFR0FUSU9OX1RZUEVTLm1pbmltdW0sXG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uTUFYXTogQUdHUkVHQVRJT05fVFlQRVMubWF4aW11bVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnVuYyhhZ2dyZWdhdGlvbiwgYWNjZXNzb3IpIHtcbiAgaWYgKCFhZ2dyZWdhdGlvbiB8fCAhQUdHUkVHQVRJT05fT1BFUkFUSU9OW2FnZ3JlZ2F0aW9uLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgQ29uc29sZS53YXJuKGBBZ2dyZWdhdGlvbiAke2FnZ3JlZ2F0aW9ufSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBvcCA9IEFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSB8fCBBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNO1xuICBjb25zdCBrZXBsZXJPcCA9IERFQ0tfQUdHUkVHQVRJT05fTUFQW29wXTtcblxuICByZXR1cm4gcHRzID0+IGFnZ3JlZ2F0ZShwdHMubWFwKGFjY2Vzc29yKSwga2VwbGVyT3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGdW5jdG9yKHNjYWxlVHlwZSkge1xuICBpZiAoIXNjYWxlVHlwZSB8fCAhU0NBTEVfRlVOQ1tzY2FsZVR5cGVdKSB7XG4gICAgQ29uc29sZS53YXJuKGBTY2FsZSAke3NjYWxlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlVHlwZV0gfHwgU0NBTEVfRlVOQy5xdWFudGl6ZTtcbn1cblxuZnVuY3Rpb24gbm9wKCkge31cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdldFZhbHVlKHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge3ZhbHVlLCB3ZWlnaHQsIGFnZ3JlZ2F0aW9ufSA9IHN0ZXAudHJpZ2dlcnM7XG5cbiAgbGV0IGdldFZhbHVlID0gcHJvcHNbdmFsdWUucHJvcF07XG5cbiAgaWYgKGdldFZhbHVlID09PSBudWxsKSB7XG4gICAgLy8gSWYgYGdldFZhbHVlYCBpcyBub3QgcHJvdmlkZWQgZnJvbSBwcm9wcywgYnVpbGQgaXQgd2l0aCBhZ2dyZWdhdGlvbiBhbmQgd2VpZ2h0LlxuICAgIGdldFZhbHVlID0gZ2V0VmFsdWVGdW5jKHByb3BzW2FnZ3JlZ2F0aW9uLnByb3BdLCBwcm9wc1t3ZWlnaHQucHJvcF0pO1xuICB9XG5cbiAgaWYgKGdldFZhbHVlKSB7XG4gICAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7Z2V0VmFsdWV9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uU29ydGVkQmlucyhzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtnZXRWYWx1ZX0gPSB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XTtcblxuICBjb25zdCBzb3J0ZWRCaW5zID0gbmV3IEJpblNvcnRlcih0aGlzLnN0YXRlLmxheWVyRGF0YS5kYXRhIHx8IFtdLCB7XG4gICAgZ2V0VmFsdWUsXG4gICAgZmlsdGVyRGF0YTogcHJvcHMuX2ZpbHRlckRhdGFcbiAgfSk7XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NvcnRlZEJpbnN9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblZhbHVlRG9tYWluKHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7bG93ZXJQZXJjZW50aWxlLCB1cHBlclBlcmNlbnRpbGUsIHNjYWxlVHlwZX1cbiAgfSA9IHN0ZXA7XG5cbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCBzb3J0ZWRCaW5zLCBpZiBub3QsIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZm9yIGxvZyBhbmQgc3FydCBzY2FsZSwgcmV0dXJucyBsaW5lYXIgZG9tYWluIGJ5IGRlZmF1bHRcbiAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBzY2FsZSBmdW5jdGlvbiBkb21haW4gaW4gYmluIHNvcnRlclxuICBjb25zdCB2YWx1ZURvbWFpbiA9IHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMuZ2V0VmFsdWVEb21haW5CeVNjYWxlKFxuICAgIHByb3BzW3NjYWxlVHlwZS5wcm9wXSxcbiAgICBbcHJvcHNbbG93ZXJQZXJjZW50aWxlLnByb3BdLCBwcm9wc1t1cHBlclBlcmNlbnRpbGUucHJvcF1dXG4gICk7XG5cbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7XG4gICAgLy8gQnkgZGVmYXVsdCBzb3J0ZWRCaW5zIG9yZGVyIGJ5IGFzY2VuZGluZyBmcmVjdWVuY3kgIGJ1dCBpZiB3ZSd2ZSBhbiBvcmRpbmFsIHNjYWxlIHdlIHdhbnQgdG8gb3JkZXIgYnkgZGVzY2VuZGluZyBmcmVjdWVuY3lcbiAgICB2YWx1ZURvbWFpbjogcHJvcHNbc2NhbGVUeXBlLnByb3BdID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsID8gdmFsdWVEb21haW4ucmV2ZXJzZSgpIDogdmFsdWVEb21haW5cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZShzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGV9ID0gc3RlcC50cmlnZ2VycztcbiAgY29uc3Qge29uU2V0fSA9IHN0ZXA7XG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHZhbHVlRG9tYWluLCBpZiBub3QsIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGltZW5zaW9uUmFuZ2UgPSBwcm9wc1tyYW5nZS5wcm9wXTtcbiAgY29uc3QgZGltZW5zaW9uRG9tYWluID0gcHJvcHNbZG9tYWluLnByb3BdIHx8IHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluO1xuXG4gIGNvbnN0IHNjYWxlVHlwZVByb3AgPSBzY2FsZVR5cGUgJiYgcHJvcHNbc2NhbGVUeXBlLnByb3BdO1xuICBjb25zdCBzY2FsZUZ1bmN0b3IgPSBnZXRTY2FsZUZ1bmN0b3Ioc2NhbGVUeXBlUHJvcCkoKTtcblxuICBjb25zdCBzY2FsZUZ1bmMgPSBzY2FsZUZ1bmN0b3JcbiAgICAuZG9tYWluKFxuICAgICAgc2NhbGVUeXBlUHJvcCA9PT0gU0NBTEVfVFlQRVMub3JkaW5hbFxuICAgICAgICA/IGRpbWVuc2lvbkRvbWFpbi5zbGljZSgwLCBkaW1lbnNpb25SYW5nZS5sZW5ndGgpXG4gICAgICAgIDogZGltZW5zaW9uRG9tYWluXG4gICAgKVxuICAgIC5yYW5nZShkaW1lbnNpb25SYW5nZSlcbiAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcblxuICBpZiAodHlwZW9mIG9uU2V0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvcHNbb25TZXQucHJvcHNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvcHNbb25TZXQucHJvcHNdKHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKTtcbiAgfVxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzY2FsZUZ1bmN9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVzdWx0KHJlc3VsdCA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKHN0ZXAsIHByb3BzLCBhZ2dyZWdhdGlvbiwgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbiA9IHtcbiAga2V5OiAncG9zaXRpb24nLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2FnZ3JlZ2F0ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBjZWxsU2l6ZToge1xuICAgICAgICAgIHByb3A6ICdjZWxsU2l6ZSdcbiAgICAgICAgfSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0UG9zaXRpb24nLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRQb3NpdGlvbidcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRvcjoge1xuICAgICAgICAgIHByb3A6ICdncmlkQWdncmVnYXRvcidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEFnZ3JlZ2F0ZWREYXRhXG4gICAgfVxuICBdXG59O1xuXG5mdW5jdGlvbiBnZXRTdWJMYXllckFjY2Vzc29yKGRpbWVuc2lvblN0YXRlLCBkaW1lbnNpb24sIGxheWVyUHJvcHMpIHtcbiAgcmV0dXJuIGNlbGwgPT4ge1xuICAgIGNvbnN0IHtzb3J0ZWRCaW5zLCBzY2FsZUZ1bmN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgYmluID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF07XG5cbiAgICBpZiAoYmluICYmIGJpbi5jb3VudHMgPT09IDApIHtcbiAgICAgIC8vIG5vIHBvaW50cyBsZWZ0IGluIGJpbiBhZnRlciBmaWx0ZXJpbmdcbiAgICAgIHJldHVybiBkaW1lbnNpb24ubnVsbFZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN2ID0gYmluICYmIGJpbi52YWx1ZTtcbiAgICAvLyBjb25zdCBkb21haW4gPSBzY2FsZUZ1bmMuZG9tYWluKCk7XG5cbiAgICAvLyBjb25zdCBpc1ZhbHVlSW5Eb21haW4gPSBjdiA+PSBkb21haW5bMF0gJiYgY3YgPD0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXTtcblxuICAgIC8vIGlmIGNlbGwgdmFsdWUgaXMgb3V0c2lkZSBkb21haW4sIHNldCBhbHBoYSB0byAwXG4gICAgLy8gcmV0dXJuIGlzVmFsdWVJbkRvbWFpbiA/IHNjYWxlRnVuYyhjdikgOiBkaW1lbnNpb24ubnVsbFZhbHVlO1xuICAgIHJldHVybiBzY2FsZUZ1bmMoY3YpO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9yRGltZW5zaW9uID0ge1xuICBrZXk6ICdmaWxsQ29sb3InLFxuICBhY2Nlc3NvcjogJ2dldEZpbGxDb2xvcicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBjb2xvclZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtjb2xvclZhbHVlfTtcbiAgfSxcbiAgbnVsbFZhbHVlOiBbMCwgMCwgMCwgMF0sXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JWYWx1ZScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldENvbG9yVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvcldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldENvbG9yV2VpZ2h0J1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdjb2xvckFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnbG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAndXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2NvbG9yRG9tYWluJ30sXG4gICAgICAgIHJhbmdlOiB7cHJvcDogJ2NvbG9yUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0Q29sb3JEb21haW4nXG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU2NhbGVcbiAgICB9XG4gIF0sXG4gIGdldFN1YkxheWVyQWNjZXNzb3Jcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENQVUFnZ3JlZ2F0b3Ige1xuICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbGF5ZXJEYXRhOiB7fSxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgLy8gY29sb3I6IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBlbGV2YXRpb246IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0cy5pbml0aWFsU3RhdGVcbiAgICB9O1xuICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMgPSB7fTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IHt9O1xuXG4gICAgdGhpcy5fYWRkRGltZW5zaW9uKG9wdHMuZGltZW5zaW9ucyB8fCBkZWZhdWx0RGltZW5zaW9ucyk7XG4gICAgdGhpcy5fYWRkQWdncmVnYXRpb24ob3B0cy5hZ2dyZWdhdGlvbiB8fCBkZWZhdWx0QWdncmVnYXRpb24pO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlcyA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbikge1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gYWdncmVnYXRpb247XG4gIH1cblxuICBfYWRkRGltZW5zaW9uKGRpbWVuc2lvbnMgPSBbXSkge1xuICAgIGRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuICAgICAgY29uc3Qge2tleX0gPSBkaW1lbnNpb247XG4gICAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV0gPSBkaW1lbnNpb247XG4gICAgfSk7XG4gIH1cblxuICBfbmVlZFVwZGF0ZVN0ZXAoZGltZW5zaW9uU3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzKHN0ZXAsIHByb3BzLCBkaW1lbnNpb24pIHtcbiAgICBjb25zdCB1cGRhdGVycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGVwOyBpIDwgZGltZW5zaW9uLnVwZGF0ZVN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgZGltZW5zaW9uLnVwZGF0ZVN0ZXBzW2ldLnVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzKGRpbWVuc2lvbiwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGxldCB1cGRhdGVycyA9IFtdO1xuICAgIGNvbnN0IG5lZWRVcGRhdGVTdGVwID0gZGltZW5zaW9uLnVwZGF0ZVN0ZXBzLmZpbmRJbmRleChzdGVwID0+XG4gICAgICB0aGlzLl9uZWVkVXBkYXRlU3RlcChzdGVwLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKVxuICAgICk7XG5cbiAgICBpZiAobmVlZFVwZGF0ZVN0ZXAgPiAtMSkge1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQodGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKG5lZWRVcGRhdGVTdGVwLCBwcm9wcywgZGltZW5zaW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHtcbiAgICBsZXQgdXBkYXRlcnMgPSBbXTtcblxuICAgIC8vIGdldCBkaW1lbnNpb24gdG8gYmUgdXBkYXRlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgdHJpZ2dlcmVkIHVwZGF0ZXIgZm9yIGVhY2ggZGltZW5zaW9uXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICBjb25zdCBkaW1lbnNpb25VcGRhdGVycyA9IHRoaXMuX2dldEFsbFVwZGF0ZXJzKGRpbWVuc2lvbiwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgICB1cGRhdGVycyA9IHVwZGF0ZXJzLmNvbmNhdChkaW1lbnNpb25VcGRhdGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIGdldFVwZGF0ZVRyaWdnZXJzKHByb3BzKSB7XG4gICAgY29uc3QgX3VwZGF0ZVRyaWdnZXJzID0gcHJvcHMudXBkYXRlVHJpZ2dlcnMgfHwge307XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHthY2Nlc3NvciwgdXBkYXRlU3RlcHN9ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxP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
|
|
648
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL2xheWVyLXV0aWxzL2NwdS1hZ2dyZWdhdG9yLnRzIl0sIm5hbWVzIjpbIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiQUdHUkVHQVRJT05fT1BFUkFUSU9OIiwiU1VNIiwiQUdHUkVHQVRJT05fVFlQRVMiLCJzdW0iLCJNRUFOIiwiYXZlcmFnZSIsIk1JTiIsIm1pbmltdW0iLCJNQVgiLCJtYXhpbXVtIiwiZ2V0VmFsdWVGdW5jIiwiYWdncmVnYXRpb24iLCJhY2Nlc3NvciIsInRvVXBwZXJDYXNlIiwiQ29uc29sZSIsIndhcm4iLCJvcCIsImtlcGxlck9wIiwicHRzIiwibWFwIiwiZ2V0U2NhbGVGdW5jdG9yIiwic2NhbGVUeXBlIiwiU0NBTEVfRlVOQyIsInF1YW50aXplIiwibm9wIiwiZ2V0R2V0VmFsdWUiLCJzdGVwIiwicHJvcHMiLCJkaW1lbnNpb25VcGRhdGVyIiwia2V5IiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJyZXZlcnNlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZVR5cGVQcm9wIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwic2xpY2UiLCJsZW5ndGgiLCJ1bmtub3duIiwiVU5LTk9XTl9DT0xPUiIsIm5vcm1hbGl6ZVJlc3VsdCIsInJlc3VsdCIsImhleGFnb25zIiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0QWdncmVnYXRlZERhdGEiLCJhZ2dyZWdhdGlvblBhcmFtcyIsImFnZ3IiLCJhZ2dyZWdhdG9yIiwic2V0U3RhdGUiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJ1cGRhdGVTdGVwcyIsImNlbGxTaXplIiwicG9zaXRpb24iLCJ1cGRhdGVUcmlnZ2VyIiwidXBkYXRlciIsImdldFN1YkxheWVyQWNjZXNzb3IiLCJkaW1lbnNpb25TdGF0ZSIsImRpbWVuc2lvbiIsImxheWVyUHJvcHMiLCJjZWxsIiwiYmluIiwiYmluTWFwIiwiaW5kZXgiLCJjb3VudHMiLCJudWxsVmFsdWUiLCJjdiIsImRlZmF1bHRDb2xvckRpbWVuc2lvbiIsImdldFBpY2tpbmdJbmZvIiwiY29sb3JWYWx1ZSIsImRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb24iLCJlbGV2YXRpb25WYWx1ZSIsImRlZmF1bHREaW1lbnNpb25zIiwiQ1BVQWdncmVnYXRvciIsIm9wdHMiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJkaW1lbnNpb25DaGFuZ2VzIiwiZGltIiwidXBkYXRlcnMiLCJfYWNjdW11bGF0ZVVwZGF0ZXJzIiwiY29uY2F0IiwiZm9yRWFjaCIsImYiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwiZGF0YUNoYW5nZWQiLCJ1cGRhdGVBZ2dyZWdhdGlvbiIsInVwZGF0ZUFsbERpbWVuc2lvbnMiLCJhZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0QWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldERpbWVuc2lvbkNoYW5nZXMiLCJ1cGRhdGVPYmplY3QiLCJkaW1lbnNpb25TdGVwIiwidmFsdWVzIiwic29tZSIsIml0ZW0iLCJ1cGRhdGVUcmlnZ2Vyc0NoYW5nZWQiLCJhbGwiLCJpIiwicHVzaCIsImJpbmQiLCJuZWVkVXBkYXRlU3RlcCIsImZpbmRJbmRleCIsIl9uZWVkVXBkYXRlU3RlcCIsIl9nZXRBbGxVcGRhdGVycyIsIl91cGRhdGVUcmlnZ2VycyIsInVwZGF0ZVRyaWdnZXJzIiwiZnJvbVByb3AiLCJBcnJheSIsImlzQXJyYXkiLCJ1bmRlZmluZWQiLCJpbmZvIiwiaXNQaWNrZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJiaW5JbmZvIiwicG9pbnRzIiwiZmlsdGVyZWRQb2ludHMiLCJCb29sZWFuIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7QUFxRE8sSUFBTUEsb0JBQW9CLHdGQUM5QkMseUNBQXNCQyxHQURRLEVBQ0ZDLG1DQUFrQkMsR0FEaEIsMkRBRTlCSCx5Q0FBc0JJLElBRlEsRUFFREYsbUNBQWtCRyxPQUZqQiwyREFHOUJMLHlDQUFzQk0sR0FIUSxFQUdGSixtQ0FBa0JLLE9BSGhCLDJEQUk5QlAseUNBQXNCUSxHQUpRLEVBSUZOLG1DQUFrQk8sT0FKaEIseUJBQTFCOzs7QUFPQSxTQUFTQyxZQUFULENBQXNCQyxXQUF0QixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFDbEQsTUFBSSxDQUFDRCxXQUFELElBQWdCLENBQUNYLHlDQUFzQlcsV0FBVyxDQUFDRSxXQUFaLEVBQXRCLENBQXJCLEVBQXVFO0FBQ3JFQyxvQkFBUUMsSUFBUix1QkFBNEJKLFdBQTVCO0FBQ0Q7O0FBRUQsTUFBTUssRUFBRSxHQUFHaEIseUNBQXNCVyxXQUFXLENBQUNFLFdBQVosRUFBdEIsS0FBb0RiLHlDQUFzQkMsR0FBckY7O0FBQ0EsTUFBTWdCLFFBQVEsR0FBR2xCLG9CQUFvQixDQUFDaUIsRUFBRCxDQUFyQztBQUVBLFNBQU8sVUFBQUUsR0FBRztBQUFBLFdBQUksK0JBQVVBLEdBQUcsQ0FBQ0MsR0FBSixDQUFRUCxRQUFSLENBQVYsRUFBNkJLLFFBQTdCLENBQUo7QUFBQSxHQUFWO0FBQ0Q7O0FBRU0sU0FBU0csZUFBVCxDQUF5QkMsU0FBekIsRUFBb0M7QUFDekMsTUFBSSxDQUFDQSxTQUFELElBQWMsQ0FBQ0MsNEJBQVdELFNBQVgsQ0FBbkIsRUFBMEM7QUFDeENQLG9CQUFRQyxJQUFSLGlCQUFzQk0sU0FBdEI7QUFDRDs7QUFDRCxTQUFPQyw0QkFBV0QsU0FBWCxLQUF5QkMsNEJBQVdDLFFBQTNDO0FBQ0Q7O0FBRUQsU0FBU0MsR0FBVCxHQUFlLENBQUU7O0FBRVYsU0FBU0MsV0FBVCxDQUEwQ0MsSUFBMUMsRUFBZ0RDLEtBQWhELEVBQXVEQyxnQkFBdkQsRUFBeUU7QUFBQSxNQUN2RUMsR0FEdUUsR0FDaEVELGdCQURnRSxDQUN2RUMsR0FEdUU7QUFBQSx1QkFFekNILElBQUksQ0FBQ0ksUUFGb0M7QUFBQSxNQUV2RUMsS0FGdUUsa0JBRXZFQSxLQUZ1RTtBQUFBLE1BRWhFQyxNQUZnRSxrQkFFaEVBLE1BRmdFO0FBQUEsTUFFeERyQixXQUZ3RCxrQkFFeERBLFdBRndEO0FBSTlFLE1BQUlzQixRQUFRLEdBQUdOLEtBQUssQ0FBQ0ksS0FBSyxDQUFDRyxJQUFQLENBQXBCOztBQUVBLE1BQUlELFFBQVEsS0FBSyxJQUFqQixFQUF1QjtBQUNyQjtBQUNBQSxJQUFBQSxRQUFRLEdBQUd2QixZQUFZLENBQUNpQixLQUFLLENBQUNoQixXQUFXLENBQUN1QixJQUFiLENBQU4sRUFBMEJQLEtBQUssQ0FBQ0ssTUFBTSxDQUFDRSxJQUFSLENBQS9CLENBQXZCO0FBQ0Q7O0FBRUQsTUFBSUQsUUFBSixFQUFjO0FBQ1osU0FBS0Usa0JBQUwsQ0FBd0JOLEdBQXhCLEVBQTZCO0FBQUNJLE1BQUFBLFFBQVEsRUFBUkE7QUFBRCxLQUE3QjtBQUNEO0FBQ0Y7O0FBRU0sU0FBU0csc0JBQVQsQ0FBcURWLElBQXJELEVBQTJEQyxLQUEzRCxFQUFrRUMsZ0JBQWxFLEVBQW9GO0FBQUEsTUFDbEZDLEdBRGtGLEdBQzNFRCxnQkFEMkUsQ0FDbEZDLEdBRGtGO0FBQUEsTUFFbEZJLFFBRmtGLEdBRXRFLEtBQUtJLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsR0FBdEIsQ0FGc0UsQ0FFbEZJLFFBRmtGLEVBR3pGOztBQUNBLE1BQU1NLFVBQVUsR0FBRyxJQUFJQyw2QkFBSixDQUFjLEtBQUtILEtBQUwsQ0FBV0ksU0FBWCxDQUFxQkMsSUFBckIsSUFBNkIsRUFBM0MsRUFBK0M7QUFDaEVULElBQUFBLFFBQVEsRUFBUkEsUUFEZ0U7QUFFaEVVLElBQUFBLFVBQVUsRUFBRWhCLEtBQUssQ0FBQ2lCO0FBRjhDLEdBQS9DLENBQW5COztBQUlBLE9BQUtULGtCQUFMLENBQXdCTixHQUF4QixFQUE2QjtBQUFDVSxJQUFBQSxVQUFVLEVBQVZBO0FBQUQsR0FBN0I7QUFDRDs7QUFFTSxTQUFTTSx1QkFBVCxDQUFzRG5CLElBQXRELEVBQTREQyxLQUE1RCxFQUFtRUMsZ0JBQW5FLEVBQXFGO0FBQUEsTUFDbkZDLEdBRG1GLEdBQzVFRCxnQkFENEUsQ0FDbkZDLEdBRG1GO0FBQUEsd0JBSXRGSCxJQUpzRixDQUd4RkksUUFId0Y7QUFBQSxNQUc3RWdCLGVBSDZFLG1CQUc3RUEsZUFINkU7QUFBQSxNQUc1REMsZUFINEQsbUJBRzVEQSxlQUg0RDtBQUFBLE1BRzNDMUIsU0FIMkMsbUJBRzNDQSxTQUgyQzs7QUFNMUYsTUFBSSxDQUFDLEtBQUtnQixLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLEVBQTJCVSxVQUFoQyxFQUE0QztBQUMxQztBQUNBO0FBQ0QsR0FUeUYsQ0FXMUY7QUFDQTs7O0FBQ0EsTUFBTVMsV0FBVyxHQUFHLEtBQUtYLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsR0FBdEIsRUFBMkJVLFVBQTNCLENBQXNDVSxxQkFBdEMsQ0FDbEJ0QixLQUFLLENBQUNOLFNBQVMsQ0FBQ2EsSUFBWCxDQURhLEVBRWxCLENBQUNQLEtBQUssQ0FBQ21CLGVBQWUsQ0FBQ1osSUFBakIsQ0FBTixFQUE4QlAsS0FBSyxDQUFDb0IsZUFBZSxDQUFDYixJQUFqQixDQUFuQyxDQUZrQixDQUFwQjs7QUFLQSxPQUFLQyxrQkFBTCxDQUF3Qk4sR0FBeEIsRUFBNkI7QUFDM0I7QUFDQW1CLElBQUFBLFdBQVcsRUFBRXJCLEtBQUssQ0FBQ04sU0FBUyxDQUFDYSxJQUFYLENBQUwsS0FBMEJnQiw2QkFBWUMsT0FBdEMsR0FBZ0RILFdBQVcsQ0FBQ0ksT0FBWixFQUFoRCxHQUF3RUo7QUFGMUQsR0FBN0I7QUFJRDs7QUFFTSxTQUFTSyxpQkFBVCxDQUFnRDNCLElBQWhELEVBQXNEQyxLQUF0RCxFQUE2REMsZ0JBQTdELEVBQStFO0FBQUEsTUFDN0VDLEdBRDZFLEdBQ3RFRCxnQkFEc0UsQ0FDN0VDLEdBRDZFO0FBQUEsd0JBRWpESCxJQUFJLENBQUNJLFFBRjRDO0FBQUEsTUFFN0V3QixNQUY2RSxtQkFFN0VBLE1BRjZFO0FBQUEsTUFFckVDLEtBRnFFLG1CQUVyRUEsS0FGcUU7QUFBQSxNQUU5RGxDLFNBRjhELG1CQUU5REEsU0FGOEQ7QUFBQSxNQUc3RW1DLEtBSDZFLEdBR3BFOUIsSUFIb0UsQ0FHN0U4QixLQUg2RTs7QUFJcEYsTUFBSSxDQUFDLEtBQUtuQixLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLEVBQTJCbUIsV0FBaEMsRUFBNkM7QUFDM0M7QUFDQTtBQUNEOztBQUVELE1BQU1TLGNBQWMsR0FBRzlCLEtBQUssQ0FBQzRCLEtBQUssQ0FBQ3JCLElBQVAsQ0FBNUI7QUFDQSxNQUFNd0IsZUFBZSxHQUFHL0IsS0FBSyxDQUFDMkIsTUFBTSxDQUFDcEIsSUFBUixDQUFMLElBQXNCLEtBQUtHLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsR0FBdEIsRUFBMkJtQixXQUF6RTtBQUVBLE1BQU1XLGFBQWEsR0FBR3RDLFNBQVMsSUFBSU0sS0FBSyxDQUFDTixTQUFTLENBQUNhLElBQVgsQ0FBeEM7QUFDQSxNQUFNMEIsWUFBWSxHQUFHeEMsZUFBZSxDQUFDdUMsYUFBRCxDQUFmLEVBQXJCO0FBRUEsTUFBTUUsU0FBUyxHQUFHRCxZQUFZLENBQzNCTixNQURlLENBRWRLLGFBQWEsS0FBS1QsNkJBQVlDLE9BQTlCLEdBQ0lPLGVBQWUsQ0FBQ0ksS0FBaEIsQ0FBc0IsQ0FBdEIsRUFBeUJMLGNBQWMsQ0FBQ00sTUFBeEMsQ0FESixHQUVJTCxlQUpVLEVBTWZILEtBTmUsQ0FNVEUsY0FOUyxFQU9mTyxPQVBlLENBT1BDLDhCQVBPLENBQWxCOztBQVNBLE1BQUkseUJBQU9ULEtBQVAsTUFBaUIsUUFBakIsSUFBNkIsT0FBTzdCLEtBQUssQ0FBQzZCLEtBQUssQ0FBQzdCLEtBQVAsQ0FBWixLQUE4QixVQUEvRCxFQUEyRTtBQUN6RUEsSUFBQUEsS0FBSyxDQUFDNkIsS0FBSyxDQUFDN0IsS0FBUCxDQUFMLENBQW1CLEtBQUtVLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsR0FBdEIsRUFBMkJtQixXQUE5QztBQUNEOztBQUNELE9BQUtiLGtCQUFMLENBQXdCTixHQUF4QixFQUE2QjtBQUFDZ0MsSUFBQUEsU0FBUyxFQUFUQTtBQUFELEdBQTdCO0FBQ0Q7O0FBRUQsU0FBU0ssZUFBVCxHQUErRDtBQUFBLE1BQXRDQyxNQUFzQyx1RUFBSixFQUFJOztBQUM3RDtBQUNBLE1BQUlBLE1BQU0sQ0FBQ0MsUUFBWCxFQUFxQjtBQUNuQixXQUFPQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUFDNUIsTUFBQUEsSUFBSSxFQUFFeUIsTUFBTSxDQUFDQztBQUFkLEtBQWQsRUFBdUNELE1BQXZDLENBQVA7QUFDRCxHQUZELE1BRU8sSUFBSUEsTUFBTSxDQUFDMUIsU0FBWCxFQUFzQjtBQUMzQixXQUFPNEIsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFBQzVCLE1BQUFBLElBQUksRUFBRXlCLE1BQU0sQ0FBQzFCO0FBQWQsS0FBZCxFQUF3QzBCLE1BQXhDLENBQVA7QUFDRDs7QUFFRCxTQUFPQSxNQUFQO0FBQ0Q7O0FBRU0sU0FBU0ksaUJBQVQsQ0FFTDdDLElBRkssRUFHTEMsS0FISyxFQUlMaEIsV0FKSyxFQUtMNkQsaUJBTEssRUFNTDtBQUFBLE1BRXlCQyxJQUZ6QixHQUdJL0MsSUFISixDQUVFSSxRQUZGLENBRWE0QyxVQUZiO0FBSUEsTUFBTUEsVUFBVSxHQUFHL0MsS0FBSyxDQUFDOEMsSUFBSSxDQUFDdkMsSUFBTixDQUF4QixDQUpBLENBTUE7QUFDQTs7QUFDQSxNQUFNaUMsTUFBTSxHQUFHTyxVQUFVLENBQUMvQyxLQUFELEVBQVE2QyxpQkFBUixDQUF6QjtBQUNBLE9BQUtHLFFBQUwsQ0FBYztBQUNabEMsSUFBQUEsU0FBUyxFQUFFeUIsZUFBZSxDQUFDQyxNQUFEO0FBRGQsR0FBZDtBQUdEOztBQUVNLElBQU1TLGtCQUFtQyxHQUFHO0FBQ2pEL0MsRUFBQUEsR0FBRyxFQUFFLFVBRDRDO0FBRWpEZ0QsRUFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRWhELElBQUFBLEdBQUcsRUFBRSxXQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSZ0QsTUFBQUEsUUFBUSxFQUFFO0FBQ1I1QyxRQUFBQSxJQUFJLEVBQUU7QUFERSxPQURGO0FBSVI2QyxNQUFBQSxRQUFRLEVBQUU7QUFDUjdDLFFBQUFBLElBQUksRUFBRSxhQURFO0FBRVI4QyxRQUFBQSxhQUFhLEVBQUU7QUFGUCxPQUpGO0FBUVJOLE1BQUFBLFVBQVUsRUFBRTtBQUNWeEMsUUFBQUEsSUFBSSxFQUFFO0FBREk7QUFSSixLQUZaO0FBY0UrQyxJQUFBQSxPQUFPLEVBQUVWO0FBZFgsR0FEVztBQUZvQyxDQUE1Qzs7O0FBc0JQLFNBQVNXLG1CQUFULENBQTZCQyxjQUE3QixFQUE2Q0MsU0FBN0MsRUFBd0RDLFVBQXhELEVBQW9FO0FBQ2xFLFNBQU8sVUFBQUMsSUFBSSxFQUFJO0FBQUEsUUFDTi9DLFVBRE0sR0FDbUI0QyxjQURuQixDQUNONUMsVUFETTtBQUFBLFFBQ01zQixTQUROLEdBQ21Cc0IsY0FEbkIsQ0FDTXRCLFNBRE47QUFFYixRQUFNMEIsR0FBRyxHQUFHaEQsVUFBVSxDQUFDaUQsTUFBWCxDQUFrQkYsSUFBSSxDQUFDRyxLQUF2QixDQUFaOztBQUVBLFFBQUlGLEdBQUcsSUFBSUEsR0FBRyxDQUFDRyxNQUFKLEtBQWUsQ0FBMUIsRUFBNkI7QUFDM0I7QUFDQSxhQUFPTixTQUFTLENBQUNPLFNBQWpCO0FBQ0Q7O0FBRUQsUUFBTUMsRUFBRSxHQUFHTCxHQUFHLElBQUlBLEdBQUcsQ0FBQ3hELEtBQXRCLENBVGEsQ0FVYjtBQUVBO0FBRUE7QUFDQTs7QUFDQSxXQUFPOEIsU0FBUyxDQUFDK0IsRUFBRCxDQUFoQjtBQUNELEdBakJEO0FBa0JEOztBQUVNLElBQU1DLHFCQUErQyxHQUFHO0FBQzdEaEUsRUFBQUEsR0FBRyxFQUFFLFdBRHdEO0FBRTdEakIsRUFBQUEsUUFBUSxFQUFFLGNBRm1EO0FBRzdEa0YsRUFBQUEsY0FBYyxFQUFFLHdCQUFDWCxjQUFELEVBQWlCRyxJQUFqQixFQUEwQjtBQUFBLFFBQ2pDL0MsVUFEaUMsR0FDbkI0QyxjQURtQixDQUNqQzVDLFVBRGlDO0FBRXhDLFFBQU13RCxVQUFVLEdBQUd4RCxVQUFVLENBQUNpRCxNQUFYLENBQWtCRixJQUFJLENBQUNHLEtBQXZCLEtBQWlDbEQsVUFBVSxDQUFDaUQsTUFBWCxDQUFrQkYsSUFBSSxDQUFDRyxLQUF2QixFQUE4QjFELEtBQWxGO0FBQ0EsV0FBTztBQUFDZ0UsTUFBQUEsVUFBVSxFQUFWQTtBQUFELEtBQVA7QUFDRCxHQVA0RDtBQVE3REosRUFBQUEsU0FBUyxFQUFFLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQVJrRDtBQVM3RGQsRUFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRWhELElBQUFBLEdBQUcsRUFBRSxVQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSQyxNQUFBQSxLQUFLLEVBQUU7QUFDTEcsUUFBQUEsSUFBSSxFQUFFLGVBREQ7QUFFTDhDLFFBQUFBLGFBQWEsRUFBRTtBQUZWLE9BREM7QUFLUmhELE1BQUFBLE1BQU0sRUFBRTtBQUNORSxRQUFBQSxJQUFJLEVBQUUsZ0JBREE7QUFFTjhDLFFBQUFBLGFBQWEsRUFBRTtBQUZULE9BTEE7QUFTUnJFLE1BQUFBLFdBQVcsRUFBRTtBQUNYdUIsUUFBQUEsSUFBSSxFQUFFO0FBREs7QUFUTCxLQUZaO0FBZUUrQyxJQUFBQSxPQUFPLEVBQUV4RDtBQWZYLEdBRFcsRUFrQlg7QUFDRUksSUFBQUEsR0FBRyxFQUFFLFNBRFA7QUFFRUMsSUFBQUEsUUFBUSxFQUFFO0FBQ1JjLE1BQUFBLFdBQVcsRUFBRTtBQUNYVixRQUFBQSxJQUFJLEVBQUUsYUFESztBQUVYOEMsUUFBQUEsYUFBYSxFQUFFO0FBRko7QUFETCxLQUZaO0FBUUVDLElBQUFBLE9BQU8sRUFBRTdDO0FBUlgsR0FsQlcsRUE0Qlg7QUFDRVAsSUFBQUEsR0FBRyxFQUFFLFdBRFA7QUFFRUMsSUFBQUEsUUFBUSxFQUFFO0FBQ1JnQixNQUFBQSxlQUFlLEVBQUU7QUFDZlosUUFBQUEsSUFBSSxFQUFFO0FBRFMsT0FEVDtBQUlSYSxNQUFBQSxlQUFlLEVBQUU7QUFDZmIsUUFBQUEsSUFBSSxFQUFFO0FBRFMsT0FKVDtBQU9SYixNQUFBQSxTQUFTLEVBQUU7QUFBQ2EsUUFBQUEsSUFBSSxFQUFFO0FBQVA7QUFQSCxLQUZaO0FBV0UrQyxJQUFBQSxPQUFPLEVBQUVwQztBQVhYLEdBNUJXLEVBeUNYO0FBQ0VoQixJQUFBQSxHQUFHLEVBQUUsY0FEUDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFDUndCLE1BQUFBLE1BQU0sRUFBRTtBQUFDcEIsUUFBQUEsSUFBSSxFQUFFO0FBQVAsT0FEQTtBQUVScUIsTUFBQUEsS0FBSyxFQUFFO0FBQUNyQixRQUFBQSxJQUFJLEVBQUU7QUFBUCxPQUZDO0FBR1JiLE1BQUFBLFNBQVMsRUFBRTtBQUFDYSxRQUFBQSxJQUFJLEVBQUU7QUFBUDtBQUhILEtBRlo7QUFPRXNCLElBQUFBLEtBQUssRUFBRTtBQUNMN0IsTUFBQUEsS0FBSyxFQUFFO0FBREYsS0FQVDtBQVVFc0QsSUFBQUEsT0FBTyxFQUFFNUI7QUFWWCxHQXpDVyxDQVRnRDtBQStEN0Q2QixFQUFBQSxtQkFBbUIsRUFBbkJBO0FBL0Q2RCxDQUF4RDs7QUFrRUEsSUFBTWMseUJBQWdELEdBQUc7QUFDOURuRSxFQUFBQSxHQUFHLEVBQUUsV0FEeUQ7QUFFOURqQixFQUFBQSxRQUFRLEVBQUUsY0FGb0Q7QUFHOURrRixFQUFBQSxjQUFjLEVBQUUsd0JBQUNYLGNBQUQsRUFBaUJHLElBQWpCLEVBQTBCO0FBQUEsUUFDakMvQyxVQURpQyxHQUNuQjRDLGNBRG1CLENBQ2pDNUMsVUFEaUM7QUFFeEMsUUFBTTBELGNBQWMsR0FBRzFELFVBQVUsQ0FBQ2lELE1BQVgsQ0FBa0JGLElBQUksQ0FBQ0csS0FBdkIsS0FBaUNsRCxVQUFVLENBQUNpRCxNQUFYLENBQWtCRixJQUFJLENBQUNHLEtBQXZCLEVBQThCMUQsS0FBdEY7QUFDQSxXQUFPO0FBQUNrRSxNQUFBQSxjQUFjLEVBQWRBO0FBQUQsS0FBUDtBQUNELEdBUDZEO0FBUTlETixFQUFBQSxTQUFTLEVBQUUsQ0FBQyxDQVJrRDtBQVM5RGQsRUFBQUEsV0FBVyxFQUFFLENBQ1g7QUFDRWhELElBQUFBLEdBQUcsRUFBRSxVQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSQyxNQUFBQSxLQUFLLEVBQUU7QUFDTEcsUUFBQUEsSUFBSSxFQUFFLG1CQUREO0FBRUw4QyxRQUFBQSxhQUFhLEVBQUU7QUFGVixPQURDO0FBS1JoRCxNQUFBQSxNQUFNLEVBQUU7QUFDTkUsUUFBQUEsSUFBSSxFQUFFLG9CQURBO0FBRU44QyxRQUFBQSxhQUFhLEVBQUU7QUFGVCxPQUxBO0FBU1JyRSxNQUFBQSxXQUFXLEVBQUU7QUFDWHVCLFFBQUFBLElBQUksRUFBRTtBQURLO0FBVEwsS0FGWjtBQWVFK0MsSUFBQUEsT0FBTyxFQUFFeEQ7QUFmWCxHQURXLEVBa0JYO0FBQ0VJLElBQUFBLEdBQUcsRUFBRSxTQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSYyxNQUFBQSxXQUFXLEVBQUU7QUFDWFYsUUFBQUEsSUFBSSxFQUFFLGFBREs7QUFFWDhDLFFBQUFBLGFBQWEsRUFBRTtBQUZKO0FBREwsS0FGWjtBQVFFQyxJQUFBQSxPQUFPLEVBQUU3QztBQVJYLEdBbEJXLEVBNEJYO0FBQ0VQLElBQUFBLEdBQUcsRUFBRSxXQURQO0FBRUVDLElBQUFBLFFBQVEsRUFBRTtBQUNSZ0IsTUFBQUEsZUFBZSxFQUFFO0FBQ2ZaLFFBQUFBLElBQUksRUFBRTtBQURTLE9BRFQ7QUFJUmEsTUFBQUEsZUFBZSxFQUFFO0FBQ2ZiLFFBQUFBLElBQUksRUFBRTtBQURTLE9BSlQ7QUFPUmIsTUFBQUEsU0FBUyxFQUFFO0FBQUNhLFFBQUFBLElBQUksRUFBRTtBQUFQO0FBUEgsS0FGWjtBQVdFK0MsSUFBQUEsT0FBTyxFQUFFcEM7QUFYWCxHQTVCVyxFQXlDWDtBQUNFaEIsSUFBQUEsR0FBRyxFQUFFLGNBRFA7QUFFRUMsSUFBQUEsUUFBUSxFQUFFO0FBQ1J3QixNQUFBQSxNQUFNLEVBQUU7QUFBQ3BCLFFBQUFBLElBQUksRUFBRTtBQUFQLE9BREE7QUFFUnFCLE1BQUFBLEtBQUssRUFBRTtBQUFDckIsUUFBQUEsSUFBSSxFQUFFO0FBQVAsT0FGQztBQUdSYixNQUFBQSxTQUFTLEVBQUU7QUFBQ2EsUUFBQUEsSUFBSSxFQUFFO0FBQVA7QUFISCxLQUZaO0FBT0VzQixJQUFBQSxLQUFLLEVBQUU7QUFDTDdCLE1BQUFBLEtBQUssRUFBRTtBQURGLEtBUFQ7QUFVRXNELElBQUFBLE9BQU8sRUFBRTVCO0FBVlgsR0F6Q1csQ0FUaUQ7QUErRDlENkIsRUFBQUEsbUJBQW1CLEVBQW5CQTtBQS9EOEQsQ0FBekQ7O0FBa0VBLElBQU1nQixrQkFBaUIsR0FBRyxDQUFDTCxxQkFBRCxFQUF3QkcseUJBQXhCLENBQTFCOzs7SUFJY0csYTtBQU1uQiwyQkFNRTtBQUFBLFFBTEFDLElBS0EsdUVBREksRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsU0FBSy9ELEtBQUw7QUFDRUksTUFBQUEsU0FBUyxFQUFFLEVBRGI7QUFFRUgsTUFBQUEsVUFBVSxFQUFFLENBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWlU7QUFGZCxPQWdCSzhELElBQUksQ0FBQ0MsWUFoQlY7QUFtQkEsU0FBS0MsaUJBQUwsR0FBeUIsRUFBekI7QUFDQSxTQUFLQyxrQkFBTCxHQUEwQkgsSUFBSSxDQUFDekYsV0FBTCxJQUFvQmlFLGtCQUE5Qzs7QUFFQSxTQUFLNEIsYUFBTCxDQUFtQkosSUFBSSxDQUFDOUQsVUFBTCxJQUFtQjRELGtCQUF0QztBQUNEOzs7O1dBTUQsNkJBQW9CdkUsS0FBcEIsRUFBMkI7QUFDekIsVUFBSThFLGdCQUFxQyxHQUFHLEVBQTVDLENBRHlCLENBRXpCOztBQUNBLFdBQUssSUFBTUMsR0FBWCxJQUFrQixLQUFLSixpQkFBdkIsRUFBMEM7QUFDeEMsWUFBTUssUUFBUSxHQUFHLEtBQUtDLG1CQUFMLENBQXlCLENBQXpCLEVBQTRCakYsS0FBNUIsRUFBbUMsS0FBSzJFLGlCQUFMLENBQXVCSSxHQUF2QixDQUFuQyxDQUFqQjs7QUFDQUQsUUFBQUEsZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDSSxNQUFqQixDQUF3QkYsUUFBeEIsQ0FBbkI7QUFDRDs7QUFFREYsTUFBQUEsZ0JBQWdCLENBQUNLLE9BQWpCLENBQXlCLFVBQUFDLENBQUM7QUFBQSxlQUFJLE9BQU9BLENBQVAsS0FBYSxVQUFiLElBQTJCQSxDQUFDLEVBQWhDO0FBQUEsT0FBMUI7QUFDRDs7O1dBRUQsMkJBQWtCcEYsS0FBbEIsRUFBeUI2QyxpQkFBekIsRUFBNEM7QUFDMUMsVUFBTW1DLFFBQVEsR0FBRyxLQUFLQyxtQkFBTCxDQUF5QixDQUF6QixFQUE0QmpGLEtBQTVCLEVBQW1DLEtBQUs0RSxrQkFBeEMsQ0FBakI7O0FBQ0FJLE1BQUFBLFFBQVEsQ0FBQ0csT0FBVCxDQUFpQixVQUFBQyxDQUFDO0FBQUEsZUFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBYixJQUEyQkEsQ0FBQyxDQUFDdkMsaUJBQUQsQ0FBaEM7QUFBQSxPQUFsQjtBQUNEOzs7V0FFRCxxQkFBWTRCLElBQVosRUFBa0I1QixpQkFBbEIsRUFBcUM7QUFBQSxVQUM1QndDLFFBRDRCLEdBQ0laLElBREosQ0FDNUJZLFFBRDRCO0FBQUEsVUFDbEJyRixLQURrQixHQUNJeUUsSUFESixDQUNsQnpFLEtBRGtCO0FBQUEsVUFDWHNGLFdBRFcsR0FDSWIsSUFESixDQUNYYSxXQURXO0FBRW5DLFVBQUlSLGdCQUFxQyxHQUFHLEVBQTVDOztBQUVBLFVBQUlRLFdBQVcsQ0FBQ0MsV0FBaEIsRUFBNkI7QUFDM0I7QUFDQSxhQUFLQyxpQkFBTCxDQUF1QnhGLEtBQXZCLEVBQThCNkMsaUJBQTlCO0FBQ0EsYUFBSzRDLG1CQUFMLENBQXlCekYsS0FBekI7QUFFQSxlQUFPLEtBQUtVLEtBQVo7QUFDRDs7QUFFRCxVQUFNZ0Ysa0JBQWtCLEdBQUcsS0FBS0Msc0JBQUwsQ0FBNEJOLFFBQTVCLEVBQXNDckYsS0FBdEMsRUFBNkNzRixXQUE3QyxDQUEzQjs7QUFFQSxVQUFJSSxrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUN0RCxNQUE3QyxFQUFxRDtBQUNuRDtBQUNBc0QsUUFBQUEsa0JBQWtCLENBQUNQLE9BQW5CLENBQTJCLFVBQUFDLENBQUM7QUFBQSxpQkFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBYixJQUEyQkEsQ0FBQyxDQUFDdkMsaUJBQUQsQ0FBaEM7QUFBQSxTQUE1QjtBQUNBLGFBQUs0QyxtQkFBTCxDQUF5QnpGLEtBQXpCO0FBQ0QsT0FKRCxNQUlPO0FBQ0w7QUFDQThFLFFBQUFBLGdCQUFnQixHQUFHLEtBQUtjLG9CQUFMLENBQTBCUCxRQUExQixFQUFvQ3JGLEtBQXBDLEVBQTJDc0YsV0FBM0MsS0FBMkQsRUFBOUU7QUFDQVIsUUFBQUEsZ0JBQWdCLENBQUNLLE9BQWpCLENBQXlCLFVBQUFDLENBQUM7QUFBQSxpQkFBSSxPQUFPQSxDQUFQLEtBQWEsVUFBYixJQUEyQkEsQ0FBQyxFQUFoQztBQUFBLFNBQTFCO0FBQ0Q7O0FBRUQsYUFBTyxLQUFLMUUsS0FBWjtBQUNELEssQ0FFRDs7OztXQUNBLGtCQUFTbUYsWUFBVCxFQUF1QjtBQUNyQixXQUFLbkYsS0FBTCxHQUFhZ0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLakMsS0FBdkIsRUFBOEJtRixZQUE5QixDQUFiO0FBQ0QsSyxDQUVEOzs7O1dBQ0EsNEJBQW1CM0YsR0FBbkIsRUFBd0IyRixZQUF4QixFQUFzQztBQUNwQyxXQUFLN0MsUUFBTCxDQUFjO0FBQ1pyQyxRQUFBQSxVQUFVLEVBQUUrQixNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUtqQyxLQUFMLENBQVdDLFVBQTdCLHVDQUNUVCxHQURTLEVBQ0h3QyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUtqQyxLQUFMLENBQVdDLFVBQVgsQ0FBc0JULEdBQXRCLENBQWxCLEVBQThDMkYsWUFBOUMsQ0FERztBQURBLE9BQWQ7QUFLRDs7O1dBRUQseUJBQWdCN0csV0FBaEIsRUFBOEM7QUFDNUMsV0FBSzRGLGtCQUFMLEdBQTBCNUYsV0FBMUI7QUFDRDs7O1dBRUQseUJBQWdEO0FBQUE7O0FBQUEsVUFBbEMyQixVQUFrQyx1RUFBSixFQUFJO0FBQzlDQSxNQUFBQSxVQUFVLENBQUN3RSxPQUFYLENBQW1CLFVBQUExQixTQUFTLEVBQUk7QUFBQSxZQUN2QnZELEdBRHVCLEdBQ2hCdUQsU0FEZ0IsQ0FDdkJ2RCxHQUR1QjtBQUU5QixRQUFBLEtBQUksQ0FBQ3lFLGlCQUFMLENBQXVCekUsR0FBdkIsSUFBOEJ1RCxTQUE5QjtBQUNELE9BSEQ7QUFJRDs7O1dBRUQseUJBQ0VxQyxhQURGLEVBRUVULFFBRkYsRUFHRXJGLEtBSEYsRUFJRXNGLFdBSkYsRUFLRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBTzVDLE1BQU0sQ0FBQ3FELE1BQVAsQ0FBY0QsYUFBYSxDQUFDM0YsUUFBNUIsRUFBc0M2RixJQUF0QyxDQUEyQyxVQUFBQyxJQUFJLEVBQUk7QUFDeEQsWUFBSUEsSUFBSSxDQUFDNUMsYUFBVCxFQUF3QjtBQUN0QjtBQUNBLGlCQUNFaUMsV0FBVyxDQUFDWSxxQkFBWixLQUNDWixXQUFXLENBQUNZLHFCQUFaLENBQWtDQyxHQUFsQyxJQUNDYixXQUFXLENBQUNZLHFCQUFaLENBQWtDRCxJQUFJLENBQUM1QyxhQUF2QyxDQUZGLENBREY7QUFLRCxTQVJ1RCxDQVN4RDs7O0FBQ0EsZUFBT2dDLFFBQVEsQ0FBQ1ksSUFBSSxDQUFDMUYsSUFBTixDQUFSLEtBQXdCUCxLQUFLLENBQUNpRyxJQUFJLENBQUMxRixJQUFOLENBQXBDO0FBQ0QsT0FYTSxDQUFQO0FBWUQ7OztXQUVELDZCQUNFUixJQURGLEVBRUVDLEtBRkYsRUFHRXlELFNBSEYsRUFJRTtBQUlBLFVBQU11QixRQUF1QixHQUFHLEVBQWhDOztBQUNBLFdBQUssSUFBSW9CLENBQUMsR0FBR3JHLElBQWIsRUFBbUJxRyxDQUFDLEdBQUczQyxTQUFTLENBQUNQLFdBQVYsQ0FBc0JkLE1BQTdDLEVBQXFEZ0UsQ0FBQyxFQUF0RCxFQUEwRDtBQUN4RCxZQUFNOUMsT0FBTyxHQUFHRyxTQUFTLENBQUNQLFdBQVYsQ0FBc0JrRCxDQUF0QixFQUF5QjlDLE9BQXpDOztBQUNBLFlBQUksT0FBT0EsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQzBCLFVBQUFBLFFBQVEsQ0FBQ3FCLElBQVQsQ0FDRS9DLE9BQU8sQ0FBQ2dELElBQVIsQ0FBYSxJQUFiLEVBQW1CN0MsU0FBUyxDQUFDUCxXQUFWLENBQXNCa0QsQ0FBdEIsQ0FBbkIsRUFBNkNwRyxLQUE3QyxFQUFvRHlELFNBQXBELENBREY7QUFHRDtBQUNGOztBQUVELGFBQU91QixRQUFQO0FBQ0Q7OztXQUVELHlCQUNFdkIsU0FERixFQUVFNEIsUUFGRixFQUdFckYsS0FIRixFQUlFc0YsV0FKRixFQUtFO0FBQUE7O0FBSUEsVUFBSU4sUUFBdUIsR0FBRyxFQUE5QjtBQUNBLFVBQU11QixjQUFjLEdBQUc5QyxTQUFTLENBQUNQLFdBQVYsQ0FBc0JzRCxTQUF0QixDQUFnQyxVQUFBekcsSUFBSTtBQUFBLGVBQ3pELE1BQUksQ0FBQzBHLGVBQUwsQ0FBcUIxRyxJQUFyQixFQUEyQnNGLFFBQTNCLEVBQXFDckYsS0FBckMsRUFBNENzRixXQUE1QyxDQUR5RDtBQUFBLE9BQXBDLENBQXZCOztBQUlBLFVBQUlpQixjQUFjLEdBQUcsQ0FBQyxDQUF0QixFQUF5QjtBQUN2QnZCLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFULENBQWdCLEtBQUtELG1CQUFMLENBQXlCc0IsY0FBekIsRUFBeUN2RyxLQUF6QyxFQUFnRHlELFNBQWhELENBQWhCLENBQVg7QUFDRDs7QUFFRCxhQUFPdUIsUUFBUDtBQUNEOzs7V0FFRCxnQ0FBdUJLLFFBQXZCLEVBQWlDckYsS0FBakMsRUFBd0NzRixXQUF4QyxFQUFxRDtBQUNuRCxVQUFNTixRQUFRLEdBQUcsS0FBSzBCLGVBQUwsQ0FBcUIsS0FBSzlCLGtCQUExQixFQUE4Q1MsUUFBOUMsRUFBd0RyRixLQUF4RCxFQUErRHNGLFdBQS9ELENBQWpCOztBQUNBLGFBQU9OLFFBQVEsQ0FBQzVDLE1BQVQsR0FBa0I0QyxRQUFsQixHQUE2QixJQUFwQztBQUNEOzs7V0FFRCw4QkFBcUJLLFFBQXJCLEVBQStCckYsS0FBL0IsRUFBc0NzRixXQUF0QyxFQUFtRDtBQUNqRCxVQUFJTixRQUE2QixHQUFHLEVBQXBDLENBRGlELENBR2pEOztBQUNBLFdBQUssSUFBTTlFLElBQVgsSUFBa0IsS0FBS3lFLGlCQUF2QixFQUEwQztBQUN4QztBQUNBLFlBQU1sQixTQUFTLEdBQUcsS0FBS2tCLGlCQUFMLENBQXVCekUsSUFBdkIsQ0FBbEI7O0FBQ0EsWUFBTXlFLGlCQUFpQixHQUFHLEtBQUsrQixlQUFMLENBQXFCakQsU0FBckIsRUFBZ0M0QixRQUFoQyxFQUEwQ3JGLEtBQTFDLEVBQWlEc0YsV0FBakQsQ0FBMUI7O0FBQ0FOLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFULENBQWdCUCxpQkFBaEIsQ0FBWDtBQUNEOztBQUVELGFBQU9LLFFBQVEsQ0FBQzVDLE1BQVQsR0FBa0I0QyxRQUFsQixHQUE2QixJQUFwQztBQUNEOzs7V0FFRCwyQkFBa0JoRixLQUFsQixFQUF5QjtBQUFBOztBQUN2QixVQUFNMkcsZUFBZSxHQUFHM0csS0FBSyxDQUFDNEcsY0FBTixJQUF3QixFQUFoRDs7QUFDQSxVQUFNQSxjQUFjLEdBQUcsRUFBdkI7O0FBRnVCLGlDQUlaMUcsS0FKWTtBQUFBLG9DQVEyQixNQUFJLENBQUN5RSxpQkFBTCxDQUF1QnpFLEtBQXZCLENBUjNCO0FBQUEsWUFNbkJqQixRQU5tQix5QkFNbkJBLFFBTm1CO0FBQUEsWUFPbkJpRSxXQVBtQix5QkFPbkJBLFdBUG1CLEVBU3JCOztBQUNBMEQsUUFBQUEsY0FBYyxDQUFDM0gsUUFBRCxDQUFkLEdBQTJCLEVBQTNCO0FBRUFpRSxRQUFBQSxXQUFXLENBQUNpQyxPQUFaLENBQW9CLFVBQUFwRixJQUFJLEVBQUk7QUFDMUIyQyxVQUFBQSxNQUFNLENBQUNxRCxNQUFQLENBQWNoRyxJQUFJLENBQUNJLFFBQUwsSUFBaUIsRUFBL0IsRUFBbUNnRixPQUFuQyxDQUEyQyxnQkFBMkI7QUFBQSxnQkFBekI1RSxJQUF5QixRQUF6QkEsSUFBeUI7QUFBQSxnQkFBbkI4QyxhQUFtQixRQUFuQkEsYUFBbUI7O0FBQ3BFLGdCQUFJQSxhQUFKLEVBQW1CO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGtCQUFNd0QsUUFBUSxHQUFHRixlQUFlLENBQUN0RCxhQUFELENBQWhDOztBQUNBLGtCQUFJLHlCQUFPd0QsUUFBUCxNQUFvQixRQUFwQixJQUFnQyxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0YsUUFBZCxDQUFyQyxFQUE4RDtBQUM1RDtBQUNBbkUsZ0JBQUFBLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjaUUsY0FBYyxDQUFDM0gsUUFBRCxDQUE1QixFQUF3QzRILFFBQXhDO0FBQ0QsZUFIRCxNQUdPLElBQUlBLFFBQVEsS0FBS0csU0FBakIsRUFBNEI7QUFDakNKLGdCQUFBQSxjQUFjLENBQUMzSCxRQUFELENBQWQsQ0FBeUJzQixJQUF6QixJQUFpQ3NHLFFBQWpDO0FBQ0Q7QUFDRixhQVhELE1BV087QUFDTDtBQUNBRCxjQUFBQSxjQUFjLENBQUMzSCxRQUFELENBQWQsQ0FBeUJzQixJQUF6QixJQUFpQ1AsS0FBSyxDQUFDTyxJQUFELENBQXRDO0FBQ0Q7QUFDRixXQWhCRDtBQWlCRCxTQWxCRDtBQVpxQjs7QUFJdkIsV0FBSyxJQUFNTCxLQUFYLElBQWtCLEtBQUt5RSxpQkFBdkIsRUFBMEM7QUFBQSxjQUEvQnpFLEtBQStCO0FBMkJ6Qzs7QUFFRCxhQUFPMEcsY0FBUDtBQUNEOzs7V0FFRCwrQkFBdUJsRCxVQUF2QixFQUFtQztBQUFBLFVBQW5CdUQsSUFBbUIsU0FBbkJBLElBQW1CO0FBQ2pDLFVBQU1DLFFBQVEsR0FBR0QsSUFBSSxDQUFDRSxNQUFMLElBQWVGLElBQUksQ0FBQ25ELEtBQUwsR0FBYSxDQUFDLENBQTlDO0FBQ0EsVUFBSXNELE1BQU0sR0FBRyxJQUFiOztBQUVBLFVBQUlGLFFBQUosRUFBYztBQUNaLFlBQU12RCxLQUFJLEdBQUcsS0FBS2pELEtBQUwsQ0FBV0ksU0FBWCxDQUFxQkMsSUFBckIsQ0FBMEJrRyxJQUFJLENBQUNuRCxLQUEvQixDQUFiO0FBRUEsWUFBSXVELE9BQU8sR0FBRyxFQUFkOztBQUNBLGFBQUssSUFBTW5ILEtBQVgsSUFBa0IsS0FBS3lFLGlCQUF2QixFQUEwQztBQUFBLGNBQ2pDUixjQURpQyxHQUNmLEtBQUtRLGlCQUFMLENBQXVCekUsS0FBdkIsQ0FEZSxDQUNqQ2lFLGNBRGlDOztBQUV4QyxjQUFJLE9BQU9BLGNBQVAsS0FBMEIsVUFBOUIsRUFBMEM7QUFDeENrRCxZQUFBQSxPQUFPLEdBQUczRSxNQUFNLENBQUNDLE1BQVAsQ0FDUixFQURRLEVBRVIwRSxPQUZRLEVBR1JsRCxjQUFjLENBQUMsS0FBS3pELEtBQUwsQ0FBV0MsVUFBWCxDQUFzQlQsS0FBdEIsQ0FBRCxFQUE2QnlELEtBQTdCLEVBQW1DRCxVQUFuQyxDQUhOLENBQVY7QUFLRDtBQUNGOztBQUVEMEQsUUFBQUEsTUFBTSxHQUFHMUUsTUFBTSxDQUFDQyxNQUFQLENBQWMwRSxPQUFkLEVBQXVCMUQsS0FBdkIsRUFBNkI7QUFDcEMyRCxVQUFBQSxNQUFNLEVBQUUzRCxLQUFJLENBQUM0RCxjQUFMLElBQXVCNUQsS0FBSSxDQUFDMkQ7QUFEQSxTQUE3QixDQUFUO0FBR0QsT0F0QmdDLENBd0JqQzs7O0FBQ0EsYUFBTzVFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjc0UsSUFBZCxFQUFvQjtBQUN6QkUsUUFBQUEsTUFBTSxFQUFFSyxPQUFPLENBQUNKLE1BQUQsQ0FEVTtBQUV6QjtBQUNBQSxRQUFBQSxNQUFNLEVBQU5BO0FBSHlCLE9BQXBCLENBQVA7QUFLRDs7O1dBRUQscUJBQVlLLFlBQVosRUFBMEIvRCxVQUExQixFQUFzQztBQUNwQyxVQUFJLENBQUMsS0FBS2lCLGlCQUFMLENBQXVCK0MsY0FBdkIsQ0FBc0NELFlBQXRDLENBQUwsRUFBMEQ7QUFDeEQsZUFBTzVILEdBQVA7QUFDRDs7QUFDRCxhQUFPLEtBQUs4RSxpQkFBTCxDQUF1QjhDLFlBQXZCLEVBQXFDbEUsbUJBQXJDLENBQ0wsS0FBSzdDLEtBQUwsQ0FBV0MsVUFBWCxDQUFzQjhHLFlBQXRCLENBREssRUFFTCxLQUFLOUMsaUJBQUwsQ0FBdUI4QyxZQUF2QixDQUZLLEVBR0wvRCxVQUhLLENBQVA7QUFLRDs7O1dBMU9ELDZCQUEyQjtBQUN6QixhQUFPYSxrQkFBUDtBQUNEOzs7Ozs7aUNBeENrQkMsYTtBQW1SckJBLGFBQWEsQ0FBQzlDLGlCQUFkLEdBQWtDQSxpQkFBbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJy4uLy4uL3V0aWxzL2FnZ3JlZ2F0ZS11dGlscyc7XG5pbXBvcnQge0FHR1JFR0FUSU9OX1RZUEVTLCBTQ0FMRV9GVU5DLCBTQ0FMRV9UWVBFUywgVU5LTk9XTl9DT0xPUn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJy4uLy4uL3JlZHVjZXJzJztcblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoYWdncmVnYXRpb24sIGFjY2Vzc29yKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3Qgc29ydGVkQmlucyA9IG5ldyBCaW5Tb3J0ZXIodGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YSB8fCBbXSwge1xuICAgIGdldFZhbHVlLFxuICAgIGZpbHRlckRhdGE6IHByb3BzLl9maWx0ZXJEYXRhXG4gIH0pO1xuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzb3J0ZWRCaW5zfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZURvbWFpbih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtcbiAgICB0cmlnZ2Vyczoge2xvd2VyUGVyY2VudGlsZSwgdXBwZXJQZXJjZW50aWxlLCBzY2FsZVR5cGV9XG4gIH0gPSBzdGVwO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucykge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgc29ydGVkQmlucywgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZvciBsb2cgYW5kIHNxcnQgc2NhbGUsIHJldHVybnMgbGluZWFyIGRvbWFpbiBieSBkZWZhdWx0XG4gIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgY29uc3QgdmFsdWVEb21haW4gPSB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShcbiAgICBwcm9wc1tzY2FsZVR5cGUucHJvcF0sXG4gICAgW3Byb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSwgcHJvcHNbdXBwZXJQZXJjZW50aWxlLnByb3BdXVxuICApO1xuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge1xuICAgIC8vIEJ5IGRlZmF1bHQgc29ydGVkQmlucyBvcmRlciBieSBhc2NlbmRpbmcgZnJlY3VlbmN5ICBidXQgaWYgd2UndmUgYW4gb3JkaW5hbCBzY2FsZSB3ZSB3YW50IHRvIG9yZGVyIGJ5IGRlc2NlbmRpbmcgZnJlY3VlbmN5XG4gICAgdmFsdWVEb21haW46IHByb3BzW3NjYWxlVHlwZS5wcm9wXSA9PT0gU0NBTEVfVFlQRVMub3JkaW5hbCA/IHZhbHVlRG9tYWluLnJldmVyc2UoKSA6IHZhbHVlRG9tYWluXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uU2NhbGUodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7ZG9tYWluLCByYW5nZSwgc2NhbGVUeXBlfSA9IHN0ZXAudHJpZ2dlcnM7XG4gIGNvbnN0IHtvblNldH0gPSBzdGVwO1xuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCB2YWx1ZURvbWFpbiwgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvblJhbmdlID0gcHJvcHNbcmFuZ2UucHJvcF07XG4gIGNvbnN0IGRpbWVuc2lvbkRvbWFpbiA9IHByb3BzW2RvbWFpbi5wcm9wXSB8fCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbjtcblxuICBjb25zdCBzY2FsZVR5cGVQcm9wID0gc2NhbGVUeXBlICYmIHByb3BzW3NjYWxlVHlwZS5wcm9wXTtcbiAgY29uc3Qgc2NhbGVGdW5jdG9yID0gZ2V0U2NhbGVGdW5jdG9yKHNjYWxlVHlwZVByb3ApKCk7XG5cbiAgY29uc3Qgc2NhbGVGdW5jID0gc2NhbGVGdW5jdG9yXG4gICAgLmRvbWFpbihcbiAgICAgIHNjYWxlVHlwZVByb3AgPT09IFNDQUxFX1RZUEVTLm9yZGluYWxcbiAgICAgICAgPyBkaW1lbnNpb25Eb21haW4uc2xpY2UoMCwgZGltZW5zaW9uUmFuZ2UubGVuZ3RoKVxuICAgICAgICA6IGRpbWVuc2lvbkRvbWFpblxuICAgIClcbiAgICAucmFuZ2UoZGltZW5zaW9uUmFuZ2UpXG4gICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG5cbiAgaWYgKHR5cGVvZiBvblNldCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb3BzW29uU2V0LnByb3BzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3BzW29uU2V0LnByb3BzXSh0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbik7XG4gIH1cbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c2NhbGVGdW5jfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlc3VsdChyZXN1bHQ6IHtoZXhhZ29ucz87IGxheWVyRGF0YT99ID0ge30pIHtcbiAgLy8gc3VwcG9ydCBwcmV2aW91cyBoZXhhZ29uQWdncmVnYXRvciBBUElcbiAgaWYgKHJlc3VsdC5oZXhhZ29ucykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtkYXRhOiByZXN1bHQuaGV4YWdvbnN9LCByZXN1bHQpO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5sYXllckRhdGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmxheWVyRGF0YX0sIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdncmVnYXRlZERhdGEoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikge1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHthZ2dyZWdhdG9yOiBhZ2dyfVxuICB9ID0gc3RlcDtcbiAgY29uc3QgYWdncmVnYXRvciA9IHByb3BzW2FnZ3IucHJvcF07XG5cbiAgLy8gcmVzdWx0IHNob3VsZCBjb250YWluIGEgZGF0YSBhcnJheSBhbmQgb3RoZXIgcHJvcHNcbiAgLy8gcmVzdWx0ID0ge2RhdGE6IFtdLCAuLi5vdGhlciBwcm9wc31cbiAgY29uc3QgcmVzdWx0ID0gYWdncmVnYXRvcihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICB0aGlzLnNldFN0YXRlKHtcbiAgICBsYXllckRhdGE6IG5vcm1hbGl6ZVJlc3VsdChyZXN1bHQpXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUgPSB7XG4gIGtleTogJ3Bvc2l0aW9uJyxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdhZ2dyZWdhdGUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgY2VsbFNpemU6IHtcbiAgICAgICAgICBwcm9wOiAnY2VsbFNpemUnXG4gICAgICAgIH0sXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2dldFBvc2l0aW9uJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0UG9zaXRpb24nXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0b3I6IHtcbiAgICAgICAgICBwcm9wOiAnZ3JpZEFnZ3JlZ2F0b3InXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRBZ2dyZWdhdGVkRGF0YVxuICAgIH1cbiAgXVxufTtcblxuZnVuY3Rpb24gZ2V0U3ViTGF5ZXJBY2Nlc3NvcihkaW1lbnNpb25TdGF0ZSwgZGltZW5zaW9uLCBsYXllclByb3BzKSB7XG4gIHJldHVybiBjZWxsID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmlucywgc2NhbGVGdW5jfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGJpbiA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdO1xuXG4gICAgaWYgKGJpbiAmJiBiaW4uY291bnRzID09PSAwKSB7XG4gICAgICAvLyBubyBwb2ludHMgbGVmdCBpbiBiaW4gYWZ0ZXIgZmlsdGVyaW5nXG4gICAgICByZXR1cm4gZGltZW5zaW9uLm51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdiA9IGJpbiAmJiBiaW4udmFsdWU7XG4gICAgLy8gY29uc3QgZG9tYWluID0gc2NhbGVGdW5jLmRvbWFpbigpO1xuXG4gICAgLy8gY29uc3QgaXNWYWx1ZUluRG9tYWluID0gY3YgPj0gZG9tYWluWzBdICYmIGN2IDw9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07XG5cbiAgICAvLyBpZiBjZWxsIHZhbHVlIGlzIG91dHNpZGUgZG9tYWluLCBzZXQgYWxwaGEgdG8gMFxuICAgIC8vIHJldHVybiBpc1ZhbHVlSW5Eb21haW4gPyBzY2FsZUZ1bmMoY3YpIDogZGltZW5zaW9uLm51bGxWYWx1ZTtcbiAgICByZXR1cm4gc2NhbGVGdW5jKGN2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xvckRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxSR0JBQ29sb3I+ID0ge1xuICBrZXk6ICdmaWxsQ29sb3InLFxuICBhY2Nlc3NvcjogJ2dldEZpbGxDb2xvcicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBjb2xvclZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtjb2xvclZhbHVlfTtcbiAgfSxcbiAgbnVsbFZhbHVlOiBbMCwgMCwgMCwgMF0sXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JWYWx1ZScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldENvbG9yVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvcldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldENvbG9yV2VpZ2h0J1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdjb2xvckFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnbG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAndXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2NvbG9yRG9tYWluJ30sXG4gICAgICAgIHJhbmdlOiB7cHJvcDogJ2NvbG9yUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0Q29sb3JEb21haW4nXG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU2NhbGVcbiAgICB9XG4gIF0sXG4gIGdldFN1YkxheWVyQWNjZXNzb3Jcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uOiBEaW1lbnNpb25UeXBlPG51bWJlcj4gPSB7XG4gIGtleTogJ2VsZXZhdGlvbicsXG4gIGFjY2Vzc29yOiAnZ2V0RWxldmF0aW9uJyxcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCkgPT4ge1xuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge2xheWVyRGF0YToge2RhdGE/fTsgZGltZW5zaW9uczoge319O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDUFVBZ2dyZWdhdG9yIHtcbiAgc3RhdGljIGdldERpbWVuc2lvblNjYWxlOiBhbnk7XG4gIHN0YXRlOiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gIGRpbWVuc2lvblVwZGF0ZXJzOiB7W2tleTogc3RyaW5nXTogRGltZW5zaW9uVHlwZX07XG4gIGFnZ3JlZ2F0aW9uVXBkYXRlcjogQWdncmVnYXRpb25UeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdHM6IHtcbiAgICAgIGluaXRpYWxTdGF0ZT86IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgICAgIGRpbWVuc2lvbnM/OiBEaW1lbnNpb25UeXBlW107XG4gICAgICBhZ2dyZWdhdGlvbj86IEFnZ3JlZ2F0aW9uVHlwZTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxheWVyRGF0YToge30sXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIC8vIGNvbG9yOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gZWxldmF0aW9uOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdHMuaW5pdGlhbFN0YXRlXG4gICAgfTtcblxuICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMgPSB7fTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IG9wdHMuYWdncmVnYXRpb24gfHwgZGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXG4gICAgdGhpcy5fYWRkRGltZW5zaW9uKG9wdHMuZGltZW5zaW9ucyB8fCBkZWZhdWx0RGltZW5zaW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHREaW1lbnNpb25zO1xuICB9XG5cbiAgdXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcykge1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG4gICAgLy8gdXBkYXRlIGFsbCBkaW1lbnNpb25zXG4gICAgZm9yIChjb25zdCBkaW0gaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltXSk7XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gZGltZW5zaW9uQ2hhbmdlcy5jb25jYXQodXBkYXRlcnMpO1xuICAgIH1cblxuICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gIH1cblxuICB1cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIpO1xuICAgIHVwZGF0ZXJzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gIH1cblxuICB1cGRhdGVTdGF0ZShvcHRzLCBhZ2dyZWdhdGlvblBhcmFtcykge1xuICAgIGNvbnN0IHtvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzfSA9IG9wdHM7XG4gICAgbGV0IGRpbWVuc2lvbkNoYW5nZXM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcblxuICAgIGlmIChjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCkge1xuICAgICAgLy8gaWYgZGF0YSBjaGFuZ2VkIHVwZGF0ZSBldmVyeXRoaW5nXG4gICAgICB0aGlzLnVwZGF0ZUFnZ3JlZ2F0aW9uKHByb3BzLCBhZ2dyZWdhdGlvblBhcmFtcyk7XG4gICAgICB0aGlzLnVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpO1xuXG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNoYW5nZXMgPSB0aGlzLl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG5cbiAgICBpZiAoYWdncmVnYXRpb25DaGFuZ2VzICYmIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgIC8vIGdldCBhZ2dyZWdhdGVkRGF0YVxuICAgICAgYWdncmVnYXRpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gICAgICB0aGlzLnVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IHVwZGF0ZSBkaW1lbnNpb25zXG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gdGhpcy5fZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB8fCBbXTtcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZVxuICBzZXRTdGF0ZSh1cGRhdGVPYmplY3QpIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZSwgdXBkYXRlT2JqZWN0KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlLmRpbWVuc2lvbnNcbiAgX3NldERpbWVuc2lvblN0YXRlKGtleSwgdXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBkaW1lbnNpb25zOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnMsIHtcbiAgICAgICAgW2tleV06IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCB1cGRhdGVPYmplY3QpXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgX2FkZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUpIHtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IGFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgX2FkZERpbWVuc2lvbihkaW1lbnNpb25zOiBEaW1lbnNpb25UeXBlW10gPSBbXSkge1xuICAgIGRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuICAgICAgY29uc3Qge2tleX0gPSBkaW1lbnNpb247XG4gICAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV0gPSBkaW1lbnNpb247XG4gICAgfSk7XG4gIH1cblxuICBfbmVlZFVwZGF0ZVN0ZXAoXG4gICAgZGltZW5zaW9uU3RlcDogVXBkYXRlU3RlcHNUeXBlIHwgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUsXG4gICAgb2xkUHJvcHMsXG4gICAgcHJvcHMsXG4gICAgY2hhbmdlRmxhZ3NcbiAgKSB7XG4gICAgLy8gd2hldGhlciBuZWVkIHRvIHVwZGF0ZSBjdXJyZW50IGRpbWVuc2lvbiBzdGVwXG4gICAgLy8gZGltZW5zaW9uIHN0ZXAgaXMgdGhlIHZhbHVlLCBkb21haW4sIHNjYWxlRnVuY3Rpb24gb2YgZWFjaCBkaW1lbnNpb25cbiAgICAvLyBlYWNoIHN0ZXAgaXMgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBsaW5rcyB0byBsYXllciBwcm9wIGFuZCB3aGV0aGVyIHRoZSBwcm9wIGlzXG4gICAgLy8gY29udHJvbGxlZCBieSB1cGRhdGVUcmlnZ2Vyc1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGRpbWVuc2lvblN0ZXAudHJpZ2dlcnMpLnNvbWUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbS51cGRhdGVUcmlnZ2VyKSB7XG4gICAgICAgIC8vIGNoZWNrIGJhc2VkIG9uIHVwZGF0ZVRyaWdnZXJzIGNoYW5nZSBmaXJzdFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCAmJlxuICAgICAgICAgIChjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQuYWxsIHx8XG4gICAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWRbaXRlbS51cGRhdGVUcmlnZ2VyXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIGZhbGxiYWNrIHRvIGRpcmVjdCBjb21wYXJpc29uXG4gICAgICByZXR1cm4gb2xkUHJvcHNbaXRlbS5wcm9wXSAhPT0gcHJvcHNbaXRlbS5wcm9wXTtcbiAgICB9KTtcbiAgfVxuXG4gIF9hY2N1bXVsYXRlVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBzdGVwLFxuICAgIHByb3BzLFxuICAgIGRpbWVuc2lvbjogVXBkYXRlck9iamVjdFR5cGVcbiAgKSB7XG4gICAgdHlwZSBVcGRhdGVyVHlwZSA9IFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZVxuICAgICAgPyBCaW5kZWRVcGRhdGVyVHlwZVxuICAgICAgOiBCaW5kZWRBZ2dyZWdhdGVkVXBkYXRlclR5cGU7XG4gICAgY29uc3QgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RlcDsgaSA8IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyO1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgdXBkYXRlci5iaW5kKHRoaXMsIGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXSwgcHJvcHMsIGRpbWVuc2lvbikgYXMgVXBkYXRlclR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnM7XG4gIH1cblxuICBfZ2V0QWxsVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGxldCB1cGRhdGVyczogVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIGNvbnN0IG5lZWRVcGRhdGVTdGVwID0gZGltZW5zaW9uLnVwZGF0ZVN0ZXBzLmZpbmRJbmRleChzdGVwID0+XG4gICAgICB0aGlzLl9uZWVkVXBkYXRlU3RlcChzdGVwLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKVxuICAgICk7XG5cbiAgICBpZiAobmVlZFVwZGF0ZVN0ZXAgPiAtMSkge1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQodGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKG5lZWRVcGRhdGVTdGVwLCBwcm9wcywgZGltZW5zaW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHtcbiAgICBsZXQgdXBkYXRlcnM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcblxuICAgIC8vIGdldCBkaW1lbnNpb24gdG8gYmUgdXBkYXRlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgdHJpZ2dlcmVkIHVwZGF0ZXIgZm9yIGVhY2ggZGltZW5zaW9uXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICBjb25zdCBkaW1lbnNpb25VcGRhdGVycyA9IHRoaXMuX2dldEFsbFVwZGF0ZXJzKGRpbWVuc2lvbiwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgICB1cGRhdGVycyA9IHVwZGF0ZXJzLmNvbmNhdChkaW1lbnNpb25VcGRhdGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIGdldFVwZGF0ZVRyaWdnZXJzKHByb3BzKSB7XG4gICAgY29uc3QgX3VwZGF0ZVRyaWdnZXJzID0gcHJvcHMudXBkYXRlVHJpZ2dlcnMgfHwge307XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgIHVwZGF0ZVN0ZXBzXG4gICAgICB9OiB7YWNjZXNzb3I7IHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXX0gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAvLyBmb2xkIGRpbWVuc2lvbiB0cmlnZ2VycyBpbnRvIGVhY2ggYWNjZXNzb3JcbiAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHt9O1xuXG4gICAgICB1cGRhdGVTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBPYmplY3QudmFsdWVzKHN0ZXAudHJpZ2dlcnMgfHwgW10pLmZvckVhY2goKHtwcm9wLCB1cGRhdGVUcmlnZ2VyfSkgPT4ge1xuICAgICAgICAgIGlmICh1cGRhdGVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIGJhc2VkIG9uIHVwZGF0ZVRyaWdnZXIgZS5nLiBnZXRDb2xvclZhbHVlLCBnZXRDb2xvcldlaWdodFxuICAgICAgICAgICAgLy8gYW5kIHVwZGF0ZVRyaWdnZXJzIGlzIHBhc3NlZCBpbiBmcm9tIGxheWVyIHByb3BcbiAgICAgICAgICAgIC8vIGZvbGQgdGhlIHVwZGF0ZVRyaWdnZXJzIGludG8gYWNjZXNzb3JcbiAgICAgICAgICAgIGNvbnN0IGZyb21Qcm9wID0gX3VwZGF0ZVRyaWdnZXJzW3VwZGF0ZVRyaWdnZXJdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmcm9tUHJvcCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZnJvbVByb3ApKSB7XG4gICAgICAgICAgICAgIC8vIGlmIHVwZGF0ZVRyaWdnZXIgaXMgYW4gb2JqZWN0IHNwcmVhZCBpdFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSwgZnJvbVByb3ApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXVtwcm9wXSA9IGZyb21Qcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIG5vdCBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgZ2V0UGlja2luZ0luZm8oe2luZm99LCBsYXllclByb3BzKSB7XG4gICAgY29uc3QgaXNQaWNrZWQgPSBpbmZvLnBpY2tlZCAmJiBpbmZvLmluZGV4ID4gLTE7XG4gICAgbGV0IG9iamVjdCA9IG51bGw7XG5cbiAgICBpZiAoaXNQaWNrZWQpIHtcbiAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLnN0YXRlLmxheWVyRGF0YS5kYXRhW2luZm8uaW5kZXhdO1xuXG4gICAgICBsZXQgYmluSW5mbyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgICBjb25zdCB7Z2V0UGlja2luZ0luZm99ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGdldFBpY2tpbmdJbmZvID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgYmluSW5mbyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIGJpbkluZm8sXG4gICAgICAgICAgICBnZXRQaWNraW5nSW5mbyh0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgY2VsbCwgbGF5ZXJQcm9wcylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9iamVjdCA9IE9iamVjdC5hc3NpZ24oYmluSW5mbywgY2VsbCwge1xuICAgICAgICBwb2ludHM6IGNlbGwuZmlsdGVyZWRQb2ludHMgfHwgY2VsbC5wb2ludHNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBiaW4gIGFuZCAgdG8gaW5mb1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGluZm8sIHtcbiAgICAgIHBpY2tlZDogQm9vbGVhbihvYmplY3QpLFxuICAgICAgLy8gb3ZlcnJpZGUgb2JqZWN0IHdpdGggcGlja2VkIGNlbGxcbiAgICAgIG9iamVjdFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QWNjZXNzb3IoZGltZW5zaW9uS2V5LCBsYXllclByb3BzKSB7XG4gICAgaWYgKCF0aGlzLmRpbWVuc2lvblVwZGF0ZXJzLmhhc093blByb3BlcnR5KGRpbWVuc2lvbktleSkpIHtcbiAgICAgIHJldHVybiBub3A7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbWVuc2lvbktleV0uZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgICAgIHRoaXMuc3RhdGUuZGltZW5zaW9uc1tkaW1lbnNpb25LZXldLFxuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLFxuICAgICAgbGF5ZXJQcm9wc1xuICAgICk7XG4gIH1cbn1cblxuQ1BVQWdncmVnYXRvci5nZXREaW1lbnNpb25TY2FsZSA9IGdldERpbWVuc2lvblNjYWxlO1xuIl19
|