@carto/kepler.gl 0.0.85 → 0.0.86-alpha.deck9.1
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/dist/actions/action-wrapper.js +36 -41
- package/dist/actions/actions.js +15 -21
- package/dist/actions/identity-actions.js +14 -20
- package/dist/actions/index.js +16 -16
- package/dist/actions/map-state-actions.js +12 -18
- package/dist/actions/map-style-actions.js +30 -46
- package/dist/actions/provider-actions.js +49 -73
- package/dist/actions/ui-state-actions.js +73 -113
- package/dist/actions/vis-state-actions.js +152 -148
- package/dist/cloud-providers/index.js +6 -7
- package/dist/cloud-providers/provider.js +189 -279
- package/dist/components/bottom-widget.js +105 -117
- package/dist/components/common/action-panel.js +122 -74
- package/dist/components/common/animation-control/animation-control.js +69 -54
- package/dist/components/common/animation-control/animation-controller.js +134 -160
- package/dist/components/common/animation-control/animation-speed-slider.js +47 -54
- package/dist/components/common/animation-control/floating-time-display.js +120 -100
- package/dist/components/common/animation-control/playback-controls.js +147 -144
- package/dist/components/common/animation-control/speed-control.js +31 -23
- package/dist/components/common/checkbox.js +56 -70
- package/dist/components/common/color-legend.js +83 -110
- package/dist/components/common/data-table/button.js +31 -23
- package/dist/components/common/data-table/canvas.js +11 -5
- package/dist/components/common/data-table/cell-size.js +51 -61
- package/dist/components/common/data-table/grid.js +40 -59
- package/dist/components/common/data-table/index.js +464 -348
- package/dist/components/common/data-table/option-dropdown.js +50 -33
- package/dist/components/common/dataset-label.js +17 -13
- package/dist/components/common/error-boundary.js +27 -45
- package/dist/components/common/field-selector.js +99 -139
- package/dist/components/common/field-token.js +24 -9
- package/dist/components/common/file-uploader/file-drop.js +96 -115
- package/dist/components/common/file-uploader/file-upload-progress.js +68 -45
- package/dist/components/common/file-uploader/file-upload.js +215 -187
- package/dist/components/common/file-uploader/upload-button.js +35 -22
- package/dist/components/common/histogram-plot.js +47 -58
- package/dist/components/common/icons/add.js +14 -27
- package/dist/components/common/icons/anchor_window.js +16 -18
- package/dist/components/common/icons/arrow-down-alt.js +14 -27
- package/dist/components/common/icons/arrow-down-solid.js +14 -27
- package/dist/components/common/icons/arrow-down.js +14 -27
- package/dist/components/common/icons/arrow-left.js +17 -30
- package/dist/components/common/icons/arrow-right.js +14 -27
- package/dist/components/common/icons/arrow-up-alt.js +15 -28
- package/dist/components/common/icons/arrow-up-solid.js +14 -27
- package/dist/components/common/icons/arrow-up.js +14 -27
- package/dist/components/common/icons/base.js +39 -57
- package/dist/components/common/icons/bug.js +16 -29
- package/dist/components/common/icons/cancel.js +14 -27
- package/dist/components/common/icons/checkmark.js +18 -31
- package/dist/components/common/icons/chevron-right.js +20 -33
- package/dist/components/common/icons/clipboard.js +15 -28
- package/dist/components/common/icons/clock.js +16 -29
- package/dist/components/common/icons/close.js +19 -32
- package/dist/components/common/icons/code-alt.js +16 -29
- package/dist/components/common/icons/copy.js +18 -31
- package/dist/components/common/icons/crosshairs.js +16 -29
- package/dist/components/common/icons/cube-3d.js +18 -31
- package/dist/components/common/icons/cursor-click.js +18 -31
- package/dist/components/common/icons/data-table.js +15 -28
- package/dist/components/common/icons/db.js +15 -28
- package/dist/components/common/icons/delete.js +16 -29
- package/dist/components/common/icons/docs.js +30 -43
- package/dist/components/common/icons/drag-n-drop.js +16 -29
- package/dist/components/common/icons/draw-polygon.js +33 -46
- package/dist/components/common/icons/email.js +18 -31
- package/dist/components/common/icons/expand.js +16 -29
- package/dist/components/common/icons/eye-seen.js +16 -29
- package/dist/components/common/icons/eye-unseen.js +16 -29
- package/dist/components/common/icons/file-type.js +35 -19
- package/dist/components/common/icons/file.js +14 -27
- package/dist/components/common/icons/files.js +14 -26
- package/dist/components/common/icons/filter-funnel.js +14 -27
- package/dist/components/common/icons/free-window.js +16 -18
- package/dist/components/common/icons/gear.js +16 -29
- package/dist/components/common/icons/hash.js +14 -27
- package/dist/components/common/icons/histogram.js +15 -27
- package/dist/components/common/icons/index.js +156 -156
- package/dist/components/common/icons/info.js +25 -38
- package/dist/components/common/icons/layers.js +14 -27
- package/dist/components/common/icons/left-arrow.js +16 -29
- package/dist/components/common/icons/legend.js +14 -27
- package/dist/components/common/icons/line-chart.js +14 -27
- package/dist/components/common/icons/login.js +17 -30
- package/dist/components/common/icons/logout.js +16 -29
- package/dist/components/common/icons/map-icon.js +18 -32
- package/dist/components/common/icons/map.js +18 -32
- package/dist/components/common/icons/messages.js +14 -27
- package/dist/components/common/icons/minus.js +14 -27
- package/dist/components/common/icons/order-by-dataset.js +15 -17
- package/dist/components/common/icons/order-by-list.js +7 -9
- package/dist/components/common/icons/pause.js +14 -27
- package/dist/components/common/icons/picture.js +14 -26
- package/dist/components/common/icons/pin.js +17 -30
- package/dist/components/common/icons/play.js +14 -27
- package/dist/components/common/icons/polygon.js +35 -48
- package/dist/components/common/icons/rectangle.js +36 -49
- package/dist/components/common/icons/reduce.js +17 -30
- package/dist/components/common/icons/reset.js +14 -27
- package/dist/components/common/icons/rocket.js +14 -27
- package/dist/components/common/icons/save.js +16 -29
- package/dist/components/common/icons/save2.js +20 -33
- package/dist/components/common/icons/search.js +16 -29
- package/dist/components/common/icons/settings.js +16 -29
- package/dist/components/common/icons/share.js +14 -27
- package/dist/components/common/icons/split.js +42 -55
- package/dist/components/common/icons/square-select.js +16 -29
- package/dist/components/common/icons/swap-horizontal.js +18 -31
- package/dist/components/common/icons/table.js +14 -27
- package/dist/components/common/icons/trash.js +16 -29
- package/dist/components/common/icons/upload.js +14 -27
- package/dist/components/common/icons/vert-dots.js +52 -65
- package/dist/components/common/icons/vert-three-dots.js +27 -40
- package/dist/components/common/icons/warning.js +26 -39
- package/dist/components/common/image-preview.js +71 -33
- package/dist/components/common/info-helper.js +36 -29
- package/dist/components/common/item-selector/accessor.js +7 -13
- package/dist/components/common/item-selector/chickleted-input.js +72 -56
- package/dist/components/common/item-selector/dropdown-list.js +182 -214
- package/dist/components/common/item-selector/item-selector-submenu.js +34 -55
- package/dist/components/common/item-selector/item-selector.js +183 -194
- package/dist/components/common/item-selector/typeahead.js +236 -248
- package/dist/components/common/line-chart.js +80 -58
- package/dist/components/common/loading-spinner.js +46 -31
- package/dist/components/common/logo.js +61 -48
- package/dist/components/common/map-layer-selector.js +31 -25
- package/dist/components/common/modal.js +167 -106
- package/dist/components/common/portaled.js +169 -189
- package/dist/components/common/progress-bar.js +27 -24
- package/dist/components/common/range-brush.js +176 -215
- package/dist/components/common/range-plot.js +52 -63
- package/dist/components/common/range-slider.js +206 -231
- package/dist/components/common/slider/mouse-event.js +59 -66
- package/dist/components/common/slider/slider-bar-handle.js +51 -61
- package/dist/components/common/slider/slider-handle.js +127 -102
- package/dist/components/common/slider/slider.js +143 -162
- package/dist/components/common/styled-components.js +518 -256
- package/dist/components/common/switch.js +11 -11
- package/dist/components/common/time-range-slider-time-title.js +49 -32
- package/dist/components/common/time-range-slider.js +56 -45
- package/dist/components/common/time-slider-marker.js +71 -52
- package/dist/components/common/tippy-tooltip.js +89 -59
- package/dist/components/common/toolbar-item.js +53 -45
- package/dist/components/common/toolbar.js +24 -18
- package/dist/components/common/vertical-toolbar.js +13 -6
- package/dist/components/container.js +87 -119
- package/dist/components/context.js +6 -8
- package/dist/components/editor/constants.js +4 -4
- package/dist/components/editor/editor.js +122 -157
- package/dist/components/editor/feature-action-panel.js +52 -59
- package/dist/components/editor/feature-styles.js +46 -29
- package/dist/components/editor/handle-style.js +38 -29
- package/dist/components/filters/components.js +8 -4
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +33 -43
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/new-filter-panel.js +24 -31
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +26 -31
- package/dist/components/filters/filter-panels/range-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +28 -31
- package/dist/components/filters/index.js +10 -10
- package/dist/components/filters/multi-select-filter.js +11 -9
- package/dist/components/filters/polygon-filter.js +26 -41
- package/dist/components/filters/range-filter.js +9 -7
- package/dist/components/filters/single-select-filter.js +11 -13
- package/dist/components/filters/time-range-filter.js +16 -14
- package/dist/components/filters/time-widget.js +125 -84
- package/dist/components/geocoder/geocoder.js +158 -177
- package/dist/components/geocoder-panel.js +66 -87
- package/dist/components/index.js +328 -329
- package/dist/components/injector.js +44 -63
- package/dist/components/kepler-gl.js +325 -361
- package/dist/components/map/coordinate-info.js +18 -16
- package/dist/components/map/layer-hover-info.js +108 -86
- package/dist/components/map/layer-selector-panel.js +50 -48
- package/dist/components/map/locale-panel.js +38 -44
- package/dist/components/map/map-control-panel.js +70 -47
- package/dist/components/map/map-control-toolbar.js +9 -6
- package/dist/components/map/map-control-tooltip.js +10 -8
- package/dist/components/map/map-control.js +35 -27
- package/dist/components/map/map-draw-panel.js +38 -48
- package/dist/components/map/map-legend-panel.js +47 -50
- package/dist/components/map/map-legend.js +133 -116
- package/dist/components/map/map-popover.js +155 -100
- package/dist/components/map/split-map-button.js +30 -34
- package/dist/components/map/toggle-3d-button.js +25 -27
- package/dist/components/map-container.js +313 -359
- package/dist/components/maps-layout.js +16 -26
- package/dist/components/modal-container.js +359 -355
- package/dist/components/modals/add-map-style-modal.js +233 -194
- package/dist/components/modals/cloud-tile.js +96 -67
- package/dist/components/modals/data-table-modal.js +155 -152
- package/dist/components/modals/delete-data-modal.js +20 -20
- package/dist/components/modals/error-display.js +9 -7
- package/dist/components/modals/export-data-modal.js +118 -140
- package/dist/components/modals/export-image-modal.js +82 -69
- package/dist/components/modals/export-map-modal/components.js +20 -18
- package/dist/components/modals/export-map-modal/export-html-map.js +82 -74
- package/dist/components/modals/export-map-modal/export-json-map.js +65 -45
- package/dist/components/modals/export-map-modal/export-map-modal.js +42 -47
- package/dist/components/modals/image-modal-container.js +20 -21
- package/dist/components/modals/load-data-modal.js +28 -30
- package/dist/components/modals/load-storage-map.js +277 -178
- package/dist/components/modals/loading-dialog.js +41 -19
- package/dist/components/modals/modal-dialog.js +4 -6
- package/dist/components/modals/modal-tabs.js +83 -48
- package/dist/components/modals/overwrite-map-modal.js +41 -30
- package/dist/components/modals/provider-modal-container.js +23 -42
- package/dist/components/modals/save-map-modal.js +107 -83
- package/dist/components/modals/share-map-modal.js +101 -95
- package/dist/components/modals/status-panel.js +63 -43
- package/dist/components/modals/storage-map-viewer.js +133 -70
- package/dist/components/notification-panel/notification-item.js +94 -97
- package/dist/components/notification-panel.js +35 -43
- package/dist/components/performance.js +49 -53
- package/dist/components/plot-container.js +151 -169
- package/dist/components/side-panel/cloud-storage-dropdown.js +13 -15
- package/dist/components/side-panel/common/dataset-info.js +16 -12
- package/dist/components/side-panel/common/dataset-tag.js +48 -27
- package/dist/components/side-panel/common/dataset-title.js +119 -116
- package/dist/components/side-panel/common/source-data-catalog.js +31 -32
- package/dist/components/side-panel/common/source-data-selector.js +52 -77
- package/dist/components/side-panel/custom-panel.js +6 -8
- package/dist/components/side-panel/filter-manager.js +48 -62
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +35 -25
- package/dist/components/side-panel/filter-panel/filter-panel.js +46 -64
- package/dist/components/side-panel/interaction-manager.js +20 -18
- package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +76 -95
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +118 -143
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +95 -76
- package/dist/components/side-panel/layer-manager.js +105 -115
- package/dist/components/side-panel/layer-panel/add-layer-button.js +92 -54
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +5 -5
- package/dist/components/side-panel/layer-panel/color-palette.js +50 -37
- package/dist/components/side-panel/layer-panel/color-range-selector.js +196 -207
- package/dist/components/side-panel/layer-panel/color-selector.js +104 -110
- package/dist/components/side-panel/layer-panel/column-selector.js +34 -22
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +4 -4
- package/dist/components/side-panel/layer-panel/custom-palette.js +248 -205
- package/dist/components/side-panel/layer-panel/custom-picker.js +51 -69
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +37 -42
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +31 -27
- package/dist/components/side-panel/layer-panel/dataset-section.js +45 -35
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +14 -13
- package/dist/components/side-panel/layer-panel/hex-column-config.js +32 -55
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +5 -5
- package/dist/components/side-panel/layer-panel/layer-column-config.js +42 -46
- package/dist/components/side-panel/layer-panel/layer-config-group.js +178 -144
- package/dist/components/side-panel/layer-panel/layer-configurator.js +826 -830
- package/dist/components/side-panel/layer-panel/layer-list.js +101 -94
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +124 -82
- package/dist/components/side-panel/layer-panel/layer-panel.js +111 -105
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +67 -58
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +47 -32
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -41
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +42 -43
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +55 -57
- package/dist/components/side-panel/layer-panel/single-color-palette.js +48 -33
- package/dist/components/side-panel/layer-panel/text-label-panel.js +81 -116
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +88 -102
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +99 -85
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +38 -29
- package/dist/components/side-panel/map-manager.js +70 -89
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +72 -60
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +64 -42
- package/dist/components/side-panel/panel-dropdown.js +21 -37
- package/dist/components/side-panel/panel-header-action.js +60 -65
- package/dist/components/side-panel/panel-header.js +165 -184
- package/dist/components/side-panel/panel-tab.js +35 -29
- package/dist/components/side-panel/panel-title.js +15 -18
- package/dist/components/side-panel/panel-toggle.js +30 -31
- package/dist/components/side-panel/side-bar.js +100 -91
- package/dist/components/side-panel.js +108 -123
- package/dist/connect/keplergl-connect.js +17 -26
- package/dist/connect/with-local-selector.js +31 -63
- package/dist/constants/action-types.js +113 -115
- package/dist/constants/color-palette.js +14 -16
- package/dist/constants/color-ranges.js +23 -28
- package/dist/constants/custom-color-ranges.js +12 -12
- package/dist/constants/default-settings.js +323 -254
- package/dist/constants/index.js +63 -63
- package/dist/constants/keyevent.js +4 -4
- package/dist/constants/tooltip.js +5 -5
- package/dist/constants/user-feedbacks.js +9 -5
- package/dist/constants/user-guides.js +10 -10
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +37 -63
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +52 -56
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +165 -168
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +24 -43
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +2 -2
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +27 -40
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +27 -40
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +60 -68
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +4 -4
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +281 -282
- package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
- package/dist/deckgl-layers/line-layer/line-layer.js +62 -70
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +37 -51
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +65 -85
- package/dist/index.js +15 -16
- package/dist/layers/aggregation-layer.js +299 -331
- package/dist/layers/arc-layer/arc-layer-icon.js +27 -41
- package/dist/layers/arc-layer/arc-layer.js +174 -201
- package/dist/layers/base-layer.d.ts +1 -1
- package/dist/layers/base-layer.js +1371 -1544
- package/dist/layers/cluster-layer/cluster-layer-icon.js +30 -44
- package/dist/layers/cluster-layer/cluster-layer.js +89 -103
- package/dist/layers/default-layer-icon.js +39 -53
- package/dist/layers/geojson-layer/geojson-layer-icon.js +42 -55
- package/dist/layers/geojson-layer/geojson-layer.js +292 -353
- package/dist/layers/geojson-layer/geojson-utils.js +31 -36
- package/dist/layers/grid-layer/grid-layer-icon.js +87 -100
- package/dist/layers/grid-layer/grid-layer.js +51 -61
- package/dist/layers/grid-layer/grid-utils.js +13 -9
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +21 -35
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +225 -260
- package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +39 -52
- package/dist/layers/heatmap-layer/heatmap-layer.js +140 -171
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +51 -64
- package/dist/layers/hexagon-layer/hexagon-layer.js +49 -63
- package/dist/layers/hexagon-layer/hexagon-utils.js +15 -14
- package/dist/layers/icon-layer/icon-info-modal.js +82 -75
- package/dist/layers/icon-layer/icon-layer-icon.js +24 -37
- package/dist/layers/icon-layer/icon-layer.js +274 -303
- package/dist/layers/index.js +43 -29
- package/dist/layers/layer-factory.js +25 -41
- package/dist/layers/layer-text-label.js +21 -23
- package/dist/layers/layer-update.js +16 -18
- package/dist/layers/line-layer/line-layer-icon.js +30 -43
- package/dist/layers/line-layer/line-layer.js +123 -142
- package/dist/layers/mapbox-utils.js +61 -62
- package/dist/layers/mapboxgl-layer.js +124 -169
- package/dist/layers/point-layer/point-layer-icon.js +45 -59
- package/dist/layers/point-layer/point-layer.d.ts +2 -2
- package/dist/layers/point-layer/point-layer.js +355 -386
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +208 -238
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +21 -35
- package/dist/layers/s2-geometry-layer/s2-utils.js +9 -8
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +24 -25
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +102 -115
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +148 -172
- package/dist/layers/trip-layer/trip-info-modal.js +50 -30
- package/dist/layers/trip-layer/trip-layer-icon.js +40 -53
- package/dist/layers/trip-layer/trip-layer.js +239 -307
- package/dist/layers/trip-layer/trip-utils.js +34 -50
- package/dist/layers/types.js +2 -2
- package/dist/localization/formatted-message.js +8 -10
- package/dist/localization/index.js +7 -7
- package/dist/localization/locales.js +6 -9
- package/dist/localization/messages.js +13 -10
- package/dist/localization/translations/ca.js +11 -13
- package/dist/localization/translations/cn.js +11 -13
- package/dist/localization/translations/en.js +11 -13
- package/dist/localization/translations/es.js +11 -13
- package/dist/localization/translations/fi.js +11 -13
- package/dist/localization/translations/ja.js +11 -13
- package/dist/localization/translations/pt.js +11 -13
- package/dist/localization/translations/ru.js +11 -13
- package/dist/middleware/index.js +3 -5
- package/dist/processors/data-processor.js +164 -201
- package/dist/processors/file-handler.js +111 -233
- package/dist/processors/index.js +4 -4
- package/dist/reducers/combined-updaters.js +41 -41
- package/dist/reducers/composer-helpers.js +20 -45
- package/dist/reducers/composers.js +9 -8
- package/dist/reducers/core.js +31 -35
- package/dist/reducers/index.js +21 -22
- package/dist/reducers/map-state-updaters.js +65 -47
- package/dist/reducers/map-state.js +23 -15
- package/dist/reducers/map-style-updaters.js +233 -159
- package/dist/reducers/map-style.js +30 -16
- package/dist/reducers/provider-state-updaters.js +217 -229
- package/dist/reducers/provider-state.js +29 -17
- package/dist/reducers/root.js +86 -58
- package/dist/reducers/ui-state-updaters.js +337 -218
- package/dist/reducers/ui-state.js +45 -16
- package/dist/reducers/vis-state-merger.js +205 -209
- package/dist/reducers/vis-state-selectors.js +5 -19
- package/dist/reducers/vis-state-updaters.js +1003 -876
- package/dist/reducers/vis-state.js +75 -16
- package/dist/schemas/dataset-schema.js +84 -108
- package/dist/schemas/index.js +28 -29
- package/dist/schemas/map-state-schema.js +21 -18
- package/dist/schemas/map-style-schema.js +47 -55
- package/dist/schemas/schema-manager.js +147 -161
- package/dist/schemas/schema-utils.js +8 -9
- package/dist/schemas/schema.js +72 -87
- package/dist/schemas/versions.js +3 -3
- package/dist/schemas/vis-state-schema.js +441 -583
- package/dist/styles/base.js +1217 -1021
- package/dist/styles/index.js +3 -3
- package/dist/styles/media-breakpoints.js +23 -18
- package/dist/tasks/tasks.js +36 -39
- package/dist/templates/export-map-html.js +233 -4
- package/dist/utils/aggregate-utils.js +13 -16
- package/dist/utils/color-utils.js +29 -37
- package/dist/utils/custom-scales.js +3 -3
- package/dist/utils/data-scale-utils.js +6 -13
- package/dist/utils/data-utils.js +60 -83
- package/dist/utils/dataset-utils.js +48 -77
- package/dist/utils/dom-to-image.js +108 -163
- package/dist/utils/dom-utils.js +88 -105
- package/dist/utils/export-utils.js +116 -103
- package/dist/utils/filter-utils.js +379 -374
- package/dist/utils/gl-utils.js +16 -15
- package/dist/utils/gpu-filter-utils.js +54 -73
- package/dist/utils/index.js +47 -48
- package/dist/utils/interaction-utils.js +53 -46
- package/dist/utils/layer-utils.js +89 -78
- package/dist/utils/locale-utils.js +24 -16
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +67 -76
- package/dist/utils/map-style-utils/mapbox-utils.js +4 -3
- package/dist/utils/mapbox-utils.js +3 -4
- package/dist/utils/notifications-utils.js +33 -38
- package/dist/utils/observe-dimensions.js +42 -54
- package/dist/utils/projection-utils.js +14 -11
- package/dist/utils/split-map-utils.js +30 -33
- package/dist/utils/table-utils/data-container-utils.js +15 -14
- package/dist/utils/table-utils/data-row.js +58 -65
- package/dist/utils/table-utils/index.js +2 -2
- package/dist/utils/table-utils/indexed-data-container.js +105 -173
- package/dist/utils/table-utils/kepler-table.js +362 -386
- package/dist/utils/table-utils/row-data-container.js +99 -164
- package/dist/utils/utils.js +29 -30
- package/package.json +21 -21
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +2 -2
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +21 -11
- package/src/layers/base-layer.ts +17 -10
|
@@ -22,10 +22,6 @@ exports.validateLayersByDatasets = validateLayersByDatasets;
|
|
|
22
22
|
exports.validateSavedLayerColumns = validateSavedLayerColumns;
|
|
23
23
|
exports.validateSavedTextLabel = validateSavedTextLabel;
|
|
24
24
|
exports.validateSavedVisualChannels = validateSavedVisualChannels;
|
|
25
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
26
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
27
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
28
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
29
25
|
var _uniq = _interopRequireDefault(require("lodash/uniq"));
|
|
30
26
|
var _pick = _interopRequireDefault(require("lodash/pick"));
|
|
31
27
|
var _flattenDeep = _interopRequireDefault(require("lodash/flattenDeep"));
|
|
@@ -35,12 +31,7 @@ var _splitMapUtils = require("../utils/split-map-utils");
|
|
|
35
31
|
var _gpuFilterUtils = require("../utils/gpu-filter-utils");
|
|
36
32
|
var _defaultSettings = require("../constants/default-settings");
|
|
37
33
|
var _schemas = require("../schemas");
|
|
38
|
-
|
|
39
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
40
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
41
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
42
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
43
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // Copyright (c) 2022 Uber Technologies, Inc.
|
|
34
|
+
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
44
35
|
//
|
|
45
36
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
46
37
|
// of this software and associated documentation files (the "Software"), to deal
|
|
@@ -59,6 +50,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
59
50
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
60
51
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
61
52
|
// THE SOFTWARE.
|
|
53
|
+
|
|
62
54
|
/**
|
|
63
55
|
* Merge loaded filters with current state, if no fields or data are loaded
|
|
64
56
|
* save it for later
|
|
@@ -68,45 +60,46 @@ function mergeFilters(state, filtersToMerge, fromConfig) {
|
|
|
68
60
|
if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
|
|
69
61
|
return state;
|
|
70
62
|
}
|
|
71
|
-
|
|
72
|
-
validated
|
|
73
|
-
failed
|
|
74
|
-
updatedDatasets
|
|
63
|
+
const {
|
|
64
|
+
validated,
|
|
65
|
+
failed,
|
|
66
|
+
updatedDatasets
|
|
67
|
+
} = (0, _filterUtils.validateFiltersUpdateDatasets)(state, filtersToMerge);
|
|
75
68
|
|
|
76
69
|
// merge filter with existing
|
|
77
|
-
|
|
70
|
+
let updatedFilters = [...(state.filters || []), ...validated];
|
|
78
71
|
updatedFilters = (0, _gpuFilterUtils.resetFilterGpuMode)(updatedFilters);
|
|
79
72
|
updatedFilters = (0, _gpuFilterUtils.assignGpuChannels)(updatedFilters);
|
|
80
73
|
// filter data
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
74
|
+
const datasetsToFilter = (0, _uniq.default)((0, _flattenDeep.default)(validated.map(f => f.dataId)));
|
|
75
|
+
const filtered = (0, _filterUtils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
|
|
76
|
+
return {
|
|
77
|
+
...state,
|
|
86
78
|
filters: updatedFilters,
|
|
87
79
|
datasets: filtered,
|
|
88
|
-
filterToBeMerged: [
|
|
89
|
-
}
|
|
80
|
+
filterToBeMerged: [...state.filterToBeMerged, ...failed]
|
|
81
|
+
};
|
|
90
82
|
}
|
|
91
83
|
function createLayerFromConfig(state, layerConfig) {
|
|
92
84
|
// first validate config against dataset
|
|
93
|
-
|
|
94
|
-
validated
|
|
95
|
-
failed
|
|
85
|
+
const {
|
|
86
|
+
validated,
|
|
87
|
+
failed
|
|
88
|
+
} = validateLayersByDatasets(state.datasets, state.layerClasses, [layerConfig]);
|
|
96
89
|
if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
|
|
97
90
|
// failed
|
|
98
91
|
return null;
|
|
99
92
|
}
|
|
100
|
-
|
|
93
|
+
const newLayer = validated[0];
|
|
101
94
|
newLayer.updateLayerDomain(state.datasets);
|
|
102
95
|
return newLayer;
|
|
103
96
|
}
|
|
104
97
|
function serializeLayer(newLayer) {
|
|
105
|
-
|
|
98
|
+
const savedVisState = _schemas.visStateSchema[_schemas.CURRENT_VERSION].save({
|
|
106
99
|
layers: [newLayer],
|
|
107
100
|
layerOrder: [0]
|
|
108
101
|
}).visState;
|
|
109
|
-
|
|
102
|
+
const loadedLayer = _schemas.visStateSchema[_schemas.CURRENT_VERSION].load(savedVisState).visState.layers[0];
|
|
110
103
|
return loadedLayer;
|
|
111
104
|
}
|
|
112
105
|
|
|
@@ -116,80 +109,66 @@ function serializeLayer(newLayer) {
|
|
|
116
109
|
*
|
|
117
110
|
*/
|
|
118
111
|
function mergeLayers(state) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return l.id;
|
|
123
|
-
}) : state.preserveLayerOrder;
|
|
112
|
+
let layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
113
|
+
let fromConfig = arguments.length > 2 ? arguments[2] : undefined;
|
|
114
|
+
const preserveLayerOrder = fromConfig ? layersToMerge.map(l => l.id) : state.preserveLayerOrder;
|
|
124
115
|
if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
|
|
125
116
|
return state;
|
|
126
117
|
}
|
|
127
|
-
|
|
128
|
-
mergedLayer
|
|
129
|
-
unmerged
|
|
118
|
+
const {
|
|
119
|
+
validated: mergedLayer,
|
|
120
|
+
failed: unmerged
|
|
121
|
+
} = validateLayersByDatasets(state.datasets, state.layerClasses, layersToMerge);
|
|
130
122
|
|
|
131
123
|
// put new layers in front of current layers
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
124
|
+
const {
|
|
125
|
+
newLayerOrder,
|
|
126
|
+
newLayers
|
|
127
|
+
} = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder,
|
|
128
|
+
// @ts-expect-error
|
|
129
|
+
preserveLayerOrder);
|
|
130
|
+
return {
|
|
131
|
+
...state,
|
|
138
132
|
layers: newLayers,
|
|
139
133
|
layerOrder: newLayerOrder,
|
|
140
134
|
// @ts-expect-error
|
|
141
|
-
preserveLayerOrder
|
|
142
|
-
layerToBeMerged: [
|
|
143
|
-
}
|
|
135
|
+
preserveLayerOrder,
|
|
136
|
+
layerToBeMerged: [...state.layerToBeMerged, ...unmerged]
|
|
137
|
+
};
|
|
144
138
|
}
|
|
145
139
|
function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
|
|
146
|
-
|
|
140
|
+
let preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
147
141
|
// perservedOrder ['a', 'b', 'c'];
|
|
148
142
|
// layerOrder [1, 0, 3]
|
|
149
143
|
// layerOrderMap ['a', 'c']
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
while (i-- > 0 && preceedIdx === -1) {
|
|
168
|
-
var preceedLayer = preservedOrder[i];
|
|
169
|
-
preceedIdx = layerOrderQueue.indexOf(preceedLayer);
|
|
170
|
-
}
|
|
171
|
-
if (preceedIdx > -1) {
|
|
172
|
-
insertAt = preceedIdx + 1;
|
|
173
|
-
}
|
|
144
|
+
let layerOrderQueue = currentOrder.map(i => currentLayers[i].id);
|
|
145
|
+
let newLayers = currentLayers;
|
|
146
|
+
for (const newLayer of layersToInsert) {
|
|
147
|
+
// find where to insert it
|
|
148
|
+
const expectedIdx = preservedOrder.indexOf(newLayer.id);
|
|
149
|
+
// if cant find place to insert, insert at the font
|
|
150
|
+
let insertAt = 0;
|
|
151
|
+
if (expectedIdx > 0) {
|
|
152
|
+
// look for layer to insert after
|
|
153
|
+
let i = expectedIdx + 1;
|
|
154
|
+
let preceedIdx = -1;
|
|
155
|
+
while (i-- > 0 && preceedIdx === -1) {
|
|
156
|
+
const preceedLayer = preservedOrder[i];
|
|
157
|
+
preceedIdx = layerOrderQueue.indexOf(preceedLayer);
|
|
158
|
+
}
|
|
159
|
+
if (preceedIdx > -1) {
|
|
160
|
+
insertAt = preceedIdx + 1;
|
|
174
161
|
}
|
|
175
|
-
layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
|
|
176
|
-
newLayers = newLayers.concat(newLayer);
|
|
177
162
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
} catch (err) {
|
|
181
|
-
_iterator.e(err);
|
|
182
|
-
} finally {
|
|
183
|
-
_iterator.f();
|
|
163
|
+
layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
|
|
164
|
+
newLayers = newLayers.concat(newLayer);
|
|
184
165
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
});
|
|
189
|
-
});
|
|
166
|
+
|
|
167
|
+
// reconstruct layerOrder after insert
|
|
168
|
+
const newLayerOrder = layerOrderQueue.map(id => newLayers.findIndex(l => l.id === id));
|
|
190
169
|
return {
|
|
191
|
-
newLayerOrder
|
|
192
|
-
newLayers
|
|
170
|
+
newLayerOrder,
|
|
171
|
+
newLayers
|
|
193
172
|
};
|
|
194
173
|
}
|
|
195
174
|
|
|
@@ -198,26 +177,31 @@ function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
|
|
|
198
177
|
*
|
|
199
178
|
*/
|
|
200
179
|
function mergeInteractions(state, interactionToBeMerged, fromConfig) {
|
|
201
|
-
|
|
202
|
-
|
|
180
|
+
const merged = {};
|
|
181
|
+
const unmerged = {};
|
|
203
182
|
if (interactionToBeMerged) {
|
|
204
|
-
Object.keys(interactionToBeMerged).forEach(
|
|
183
|
+
Object.keys(interactionToBeMerged).forEach(key => {
|
|
205
184
|
if (!state.interactionConfig[key]) {
|
|
206
185
|
return;
|
|
207
186
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
enabled
|
|
211
|
-
configSaved
|
|
212
|
-
|
|
187
|
+
const currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
|
|
188
|
+
const {
|
|
189
|
+
enabled,
|
|
190
|
+
...configSaved
|
|
191
|
+
} = interactionToBeMerged[key] || {};
|
|
192
|
+
let configToMerge = configSaved;
|
|
213
193
|
if (key === 'tooltip') {
|
|
214
|
-
|
|
215
|
-
mergedTooltip
|
|
216
|
-
unmergedTooltip
|
|
194
|
+
const {
|
|
195
|
+
mergedTooltip,
|
|
196
|
+
unmergedTooltip
|
|
197
|
+
} = mergeInteractionTooltipConfig(state, configSaved);
|
|
217
198
|
|
|
218
199
|
// merge new dataset tooltips with original dataset tooltips
|
|
219
200
|
configToMerge = {
|
|
220
|
-
fieldsToShow:
|
|
201
|
+
fieldsToShow: {
|
|
202
|
+
...currentConfig.fieldsToShow,
|
|
203
|
+
...mergedTooltip
|
|
204
|
+
}
|
|
221
205
|
};
|
|
222
206
|
if (Object.keys(unmergedTooltip).length) {
|
|
223
207
|
// @ts-expect-error
|
|
@@ -229,18 +213,27 @@ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
|
|
|
229
213
|
}
|
|
230
214
|
|
|
231
215
|
// @ts-expect-error
|
|
232
|
-
merged[key] =
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
216
|
+
merged[key] = {
|
|
217
|
+
...state.interactionConfig[key],
|
|
218
|
+
enabled: Boolean(enabled),
|
|
219
|
+
...(currentConfig ? {
|
|
220
|
+
config: (0, _pick.default)({
|
|
221
|
+
...currentConfig,
|
|
222
|
+
...configToMerge
|
|
223
|
+
}, Object.keys(currentConfig))
|
|
224
|
+
} : {})
|
|
225
|
+
};
|
|
237
226
|
});
|
|
238
227
|
}
|
|
239
|
-
return
|
|
228
|
+
return {
|
|
229
|
+
...state,
|
|
240
230
|
// @ts-expect-error
|
|
241
|
-
interactionConfig:
|
|
231
|
+
interactionConfig: {
|
|
232
|
+
...state.interactionConfig,
|
|
233
|
+
...merged
|
|
234
|
+
},
|
|
242
235
|
interactionToBeMerged: unmerged
|
|
243
|
-
}
|
|
236
|
+
};
|
|
244
237
|
}
|
|
245
238
|
|
|
246
239
|
/**
|
|
@@ -251,31 +244,31 @@ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
|
|
|
251
244
|
* : add to splitMaps, and add current layers to splitMaps
|
|
252
245
|
*/
|
|
253
246
|
function mergeSplitMaps(state) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
splitMaps.forEach(
|
|
259
|
-
Object.entries(sm.layers).forEach(
|
|
260
|
-
|
|
261
|
-
id = _ref3[0],
|
|
262
|
-
value = _ref3[1];
|
|
247
|
+
let splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
248
|
+
let fromConfig = arguments.length > 2 ? arguments[2] : undefined;
|
|
249
|
+
const merged = [...state.splitMaps];
|
|
250
|
+
const unmerged = [];
|
|
251
|
+
splitMaps.forEach((sm, i) => {
|
|
252
|
+
Object.entries(sm.layers).forEach(_ref => {
|
|
253
|
+
let [id, value] = _ref;
|
|
263
254
|
// check if layer exists
|
|
264
|
-
|
|
265
|
-
return l.id === id;
|
|
266
|
-
}) ? merged : unmerged;
|
|
255
|
+
const pushTo = state.layers.find(l => l.id === id) ? merged : unmerged;
|
|
267
256
|
|
|
268
257
|
// create map panel if current map is not split
|
|
269
258
|
pushTo[i] = pushTo[i] || {
|
|
270
259
|
layers: pushTo === merged ? (0, _splitMapUtils.getInitialMapLayersForSplitMap)(state.layers) : []
|
|
271
260
|
};
|
|
272
|
-
pushTo[i].layers =
|
|
261
|
+
pushTo[i].layers = {
|
|
262
|
+
...pushTo[i].layers,
|
|
263
|
+
[id]: value
|
|
264
|
+
};
|
|
273
265
|
});
|
|
274
266
|
});
|
|
275
|
-
return
|
|
267
|
+
return {
|
|
268
|
+
...state,
|
|
276
269
|
splitMaps: merged,
|
|
277
|
-
splitMapsToBeMerged: [
|
|
278
|
-
}
|
|
270
|
+
splitMapsToBeMerged: [...state.splitMapsToBeMerged, ...unmerged]
|
|
271
|
+
};
|
|
279
272
|
}
|
|
280
273
|
|
|
281
274
|
/**
|
|
@@ -287,36 +280,29 @@ function mergeSplitMaps(state) {
|
|
|
287
280
|
* @return - {mergedTooltip: {}, unmergedTooltip: {}}
|
|
288
281
|
*/
|
|
289
282
|
function mergeInteractionTooltipConfig(state) {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
283
|
+
let tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
284
|
+
const unmergedTooltip = {};
|
|
285
|
+
const mergedTooltip = {};
|
|
293
286
|
if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
|
|
294
287
|
return {
|
|
295
|
-
mergedTooltip
|
|
296
|
-
unmergedTooltip
|
|
288
|
+
mergedTooltip,
|
|
289
|
+
unmergedTooltip
|
|
297
290
|
};
|
|
298
291
|
}
|
|
299
|
-
|
|
292
|
+
for (const dataId in tooltipConfig.fieldsToShow) {
|
|
300
293
|
if (!state.datasets[dataId]) {
|
|
301
294
|
// is not yet loaded
|
|
302
295
|
unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
|
|
303
296
|
} else {
|
|
304
297
|
// if dataset is loaded
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
});
|
|
308
|
-
var foundFieldsToShow = state.datasets[dataId].metadata.isDynamicSpatialIndex ? tooltipConfig.fieldsToShow[dataId] : tooltipConfig.fieldsToShow[dataId].filter(function (field) {
|
|
309
|
-
return allFields.includes(field.name);
|
|
310
|
-
});
|
|
298
|
+
const allFields = state.datasets[dataId].fields.map(d => d.name);
|
|
299
|
+
const foundFieldsToShow = state.datasets[dataId].metadata.isDynamicSpatialIndex ? tooltipConfig.fieldsToShow[dataId] : tooltipConfig.fieldsToShow[dataId].filter(field => allFields.includes(field.name));
|
|
311
300
|
mergedTooltip[dataId] = foundFieldsToShow;
|
|
312
301
|
}
|
|
313
|
-
};
|
|
314
|
-
for (var dataId in tooltipConfig.fieldsToShow) {
|
|
315
|
-
_loop();
|
|
316
302
|
}
|
|
317
303
|
return {
|
|
318
|
-
mergedTooltip
|
|
319
|
-
unmergedTooltip
|
|
304
|
+
mergedTooltip,
|
|
305
|
+
unmergedTooltip
|
|
320
306
|
};
|
|
321
307
|
}
|
|
322
308
|
/**
|
|
@@ -325,9 +311,10 @@ function mergeInteractionTooltipConfig(state) {
|
|
|
325
311
|
*/
|
|
326
312
|
function mergeLayerBlending(state, layerBlending, fromConfig) {
|
|
327
313
|
if (layerBlending && _defaultSettings.LAYER_BLENDINGS[layerBlending]) {
|
|
328
|
-
return
|
|
329
|
-
|
|
330
|
-
|
|
314
|
+
return {
|
|
315
|
+
...state,
|
|
316
|
+
layerBlending
|
|
317
|
+
};
|
|
331
318
|
}
|
|
332
319
|
return state;
|
|
333
320
|
}
|
|
@@ -337,11 +324,14 @@ function mergeLayerBlending(state, layerBlending, fromConfig) {
|
|
|
337
324
|
*/
|
|
338
325
|
function mergeAnimationConfig(state, animation, fromConfig) {
|
|
339
326
|
if (animation && animation.currentTime) {
|
|
340
|
-
return
|
|
341
|
-
|
|
327
|
+
return {
|
|
328
|
+
...state,
|
|
329
|
+
animationConfig: {
|
|
330
|
+
...state.animationConfig,
|
|
331
|
+
...animation,
|
|
342
332
|
domain: null
|
|
343
|
-
}
|
|
344
|
-
}
|
|
333
|
+
}
|
|
334
|
+
};
|
|
345
335
|
}
|
|
346
336
|
return state;
|
|
347
337
|
}
|
|
@@ -357,17 +347,20 @@ function mergeAnimationConfig(state, animation, fromConfig) {
|
|
|
357
347
|
*/
|
|
358
348
|
|
|
359
349
|
function validateSavedLayerColumns(fields) {
|
|
360
|
-
|
|
361
|
-
|
|
350
|
+
let savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
351
|
+
let emptyCols = arguments.length > 2 ? arguments[2] : undefined;
|
|
362
352
|
// Prepare columns for the validator
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
353
|
+
const columns = {};
|
|
354
|
+
for (const key of Object.keys(emptyCols)) {
|
|
355
|
+
columns[key] = {
|
|
356
|
+
...emptyCols[key]
|
|
357
|
+
};
|
|
358
|
+
const saved = savedCols[key];
|
|
368
359
|
if (saved) {
|
|
369
|
-
|
|
370
|
-
|
|
360
|
+
const fieldIdx = fields.findIndex(_ref2 => {
|
|
361
|
+
let {
|
|
362
|
+
name
|
|
363
|
+
} = _ref2;
|
|
371
364
|
return name === saved;
|
|
372
365
|
});
|
|
373
366
|
if (fieldIdx > -1) {
|
|
@@ -376,15 +369,10 @@ function validateSavedLayerColumns(fields) {
|
|
|
376
369
|
columns[key].value = saved;
|
|
377
370
|
}
|
|
378
371
|
}
|
|
379
|
-
};
|
|
380
|
-
for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
|
|
381
|
-
_loop2();
|
|
382
372
|
}
|
|
383
373
|
|
|
384
374
|
// find actual column fieldIdx, in case it has changed
|
|
385
|
-
|
|
386
|
-
return validateColumn(columns[key], columns, fields);
|
|
387
|
-
});
|
|
375
|
+
const allColFound = Object.keys(columns).every(key => validateColumn(columns[key], columns, fields));
|
|
388
376
|
if (allColFound) {
|
|
389
377
|
return columns;
|
|
390
378
|
}
|
|
@@ -408,21 +396,17 @@ function validateColumn(column, columns, allFields) {
|
|
|
408
396
|
* @param {Object} savedTextLabel
|
|
409
397
|
* @return {Object} - validated textlabel
|
|
410
398
|
*/
|
|
411
|
-
function validateSavedTextLabel(fields,
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
|
|
399
|
+
function validateSavedTextLabel(fields, _ref3, savedTextLabel) {
|
|
400
|
+
let [layerTextLabel] = _ref3;
|
|
401
|
+
const savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
|
|
415
402
|
|
|
416
403
|
// validate field
|
|
417
|
-
return savedTextLabels.map(
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
})
|
|
423
|
-
return Object.keys(layerTextLabel).reduce(function (accu, key) {
|
|
424
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
|
|
425
|
-
}, {});
|
|
404
|
+
return savedTextLabels.map(textLabel => {
|
|
405
|
+
const field = textLabel.field ? fields.find(fd => Object.keys(textLabel.field).every(key => textLabel.field[key] === fd[key])) : null;
|
|
406
|
+
return Object.keys(layerTextLabel).reduce((accu, key) => ({
|
|
407
|
+
...accu,
|
|
408
|
+
[key]: key === 'field' ? field : textLabel[key] || layerTextLabel[key]
|
|
409
|
+
}), {});
|
|
426
410
|
});
|
|
427
411
|
}
|
|
428
412
|
|
|
@@ -431,29 +415,37 @@ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
|
|
|
431
415
|
* refer to vis-state-schema.js VisualChannelSchemaV1
|
|
432
416
|
*/
|
|
433
417
|
function validateSavedVisualChannels(fields, newLayer, savedLayer) {
|
|
434
|
-
Object.values(newLayer.visualChannels).forEach(
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
418
|
+
Object.values(newLayer.visualChannels).forEach(_ref4 => {
|
|
419
|
+
let {
|
|
420
|
+
field,
|
|
421
|
+
scale,
|
|
422
|
+
key
|
|
423
|
+
} = _ref4;
|
|
424
|
+
let foundField;
|
|
425
|
+
const colorFieldProps = {};
|
|
440
426
|
if (savedLayer.config) {
|
|
441
427
|
var _savedLayer$config$fi;
|
|
442
428
|
if (savedLayer.config[field]) {
|
|
443
|
-
foundField = fields.find(
|
|
444
|
-
return savedLayer.config && fd.name === savedLayer.config[field].name;
|
|
445
|
-
});
|
|
429
|
+
foundField = fields.find(fd => savedLayer.config && fd.name === savedLayer.config[field].name);
|
|
446
430
|
}
|
|
447
431
|
if ((_savedLayer$config$fi = savedLayer.config[field]) !== null && _savedLayer$config$fi !== void 0 && _savedLayer$config$fi.colorColumn) {
|
|
448
|
-
|
|
449
|
-
return savedLayer.config && fd.name === savedLayer.config[field].colorColumn;
|
|
450
|
-
});
|
|
432
|
+
const colorColumnField = fields.find(fd => savedLayer.config && fd.name === savedLayer.config[field].colorColumn);
|
|
451
433
|
if (colorColumnField) {
|
|
452
434
|
colorFieldProps.colorColumn = colorColumnField.name;
|
|
453
435
|
colorFieldProps.colorColumnIdx = colorColumnField.fieldIdx;
|
|
454
436
|
}
|
|
455
437
|
}
|
|
456
|
-
|
|
438
|
+
const foundChannel = {
|
|
439
|
+
...(foundField ? {
|
|
440
|
+
[field]: {
|
|
441
|
+
...foundField,
|
|
442
|
+
...colorFieldProps
|
|
443
|
+
}
|
|
444
|
+
} : {}),
|
|
445
|
+
...(savedLayer.config[scale] ? {
|
|
446
|
+
[scale]: savedLayer.config[scale]
|
|
447
|
+
} : {})
|
|
448
|
+
};
|
|
457
449
|
if (Object.keys(foundChannel).length) {
|
|
458
450
|
newLayer.updateLayerConfig(foundChannel);
|
|
459
451
|
}
|
|
@@ -463,12 +455,12 @@ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
|
|
|
463
455
|
return newLayer;
|
|
464
456
|
}
|
|
465
457
|
function validateLayersByDatasets(datasets, layerClasses) {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
layers.forEach(
|
|
458
|
+
let layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
459
|
+
const validated = [];
|
|
460
|
+
const failed = [];
|
|
461
|
+
layers.forEach(layer => {
|
|
470
462
|
var _layer$config;
|
|
471
|
-
|
|
463
|
+
let validateLayer = null;
|
|
472
464
|
if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
|
|
473
465
|
if (datasets[layer.config.dataId]) {
|
|
474
466
|
// datasets are already loaded
|
|
@@ -483,26 +475,30 @@ function validateLayersByDatasets(datasets, layerClasses) {
|
|
|
483
475
|
}
|
|
484
476
|
});
|
|
485
477
|
return {
|
|
486
|
-
validated
|
|
487
|
-
failed
|
|
478
|
+
validated,
|
|
479
|
+
failed
|
|
488
480
|
};
|
|
489
481
|
}
|
|
490
482
|
/**
|
|
491
483
|
* Validate saved layer config with new data,
|
|
492
484
|
* update fieldIdx based on new fields
|
|
493
485
|
*/
|
|
494
|
-
function validateLayerWithData(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
486
|
+
function validateLayerWithData(_ref5, savedLayer, layerClasses) {
|
|
487
|
+
let {
|
|
488
|
+
fields,
|
|
489
|
+
id: dataId
|
|
490
|
+
} = _ref5;
|
|
491
|
+
let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
492
|
+
const {
|
|
493
|
+
type
|
|
494
|
+
} = savedLayer;
|
|
499
495
|
// layer doesnt have a valid type
|
|
500
496
|
if (!type || !layerClasses.hasOwnProperty(type) || !savedLayer.config) {
|
|
501
497
|
return null;
|
|
502
498
|
}
|
|
503
|
-
|
|
499
|
+
let newLayer = new layerClasses[type]({
|
|
504
500
|
id: savedLayer.id,
|
|
505
|
-
dataId
|
|
501
|
+
dataId,
|
|
506
502
|
label: savedLayer.config.label,
|
|
507
503
|
color: savedLayer.config.color,
|
|
508
504
|
isVisible: savedLayer.config.isVisible,
|
|
@@ -512,12 +508,12 @@ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
|
|
|
512
508
|
});
|
|
513
509
|
|
|
514
510
|
// find column fieldIdx
|
|
515
|
-
|
|
511
|
+
const columnConfig = newLayer.getLayerColumns();
|
|
516
512
|
if (Object.keys(columnConfig).length) {
|
|
517
|
-
|
|
513
|
+
const columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig);
|
|
518
514
|
if (columns) {
|
|
519
515
|
newLayer.updateLayerConfig({
|
|
520
|
-
columns
|
|
516
|
+
columns
|
|
521
517
|
});
|
|
522
518
|
} else if (!options.allowEmptyColumn) {
|
|
523
519
|
return null;
|
|
@@ -528,22 +524,22 @@ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
|
|
|
528
524
|
// find visual channel field by matching both name and type
|
|
529
525
|
// refer to vis-state-schema.js VisualChannelSchemaV1
|
|
530
526
|
newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer);
|
|
531
|
-
|
|
527
|
+
const textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel) : newLayer.config.textLabel;
|
|
532
528
|
|
|
533
529
|
// copy visConfig over to emptyLayer to make sure it has all the props
|
|
534
|
-
|
|
530
|
+
const visConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
|
|
535
531
|
shallowCopy: ['colorRange', 'strokeColorRange']
|
|
536
532
|
});
|
|
537
533
|
newLayer.updateLayerConfig({
|
|
538
|
-
visConfig
|
|
539
|
-
textLabel
|
|
534
|
+
visConfig,
|
|
535
|
+
textLabel
|
|
540
536
|
});
|
|
541
537
|
return newLayer;
|
|
542
538
|
}
|
|
543
539
|
function isValidMerger(merger) {
|
|
544
540
|
return (0, _utils.isObject)(merger) && typeof merger.merge === 'function' && typeof merger.prop === 'string';
|
|
545
541
|
}
|
|
546
|
-
|
|
542
|
+
const VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
|
|
547
543
|
merge: mergeLayers,
|
|
548
544
|
prop: 'layers',
|
|
549
545
|
toMergeProp: 'layerToBeMerged'
|
|
@@ -566,4 +562,4 @@ var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
|
|
|
566
562
|
merge: mergeAnimationConfig,
|
|
567
563
|
prop: 'animationConfig'
|
|
568
564
|
}];
|
|
569
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfdXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfc3BsaXRNYXBVdGlscyIsIl9ncHVGaWx0ZXJVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJfc2NoZW1hcyIsIl9leGNsdWRlZCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiX3ZhbGlkYXRlRmlsdGVyc1VwZGF0IiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJ2YWxpZGF0ZWQiLCJmYWlsZWQiLCJ1cGRhdGVkRGF0YXNldHMiLCJ1cGRhdGVkRmlsdGVycyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJmaWx0ZXJzIiwicmVzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbHMiLCJkYXRhc2V0c1RvRmlsdGVyIiwidW5pcSIsImZsYXR0ZW5EZWVwIiwibWFwIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwibGF5ZXJDb25maWciLCJfdmFsaWRhdGVMYXllcnNCeURhdGEiLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplTGF5ZXIiLCJzYXZlZFZpc1N0YXRlIiwidmlzU3RhdGVTY2hlbWEiLCJDVVJSRU5UX1ZFUlNJT04iLCJzYXZlIiwibGF5ZXJPcmRlciIsInZpc1N0YXRlIiwibG9hZGVkTGF5ZXIiLCJsb2FkIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwidW5kZWZpbmVkIiwicHJlc2VydmVMYXllck9yZGVyIiwibCIsImlkIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhMiIsIm1lcmdlZExheWVyIiwidW5tZXJnZWQiLCJfaW5zZXJ0TGF5ZXJBdFJpZ2h0T3IiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJsYXllclRvQmVNZXJnZWQiLCJjdXJyZW50TGF5ZXJzIiwibGF5ZXJzVG9JbnNlcnQiLCJjdXJyZW50T3JkZXIiLCJwcmVzZXJ2ZWRPcmRlciIsImxheWVyT3JkZXJRdWV1ZSIsImkiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwicHJlY2VlZElkeCIsInByZWNlZWRMYXllciIsImFycmF5SW5zZXJ0IiwiZXJyIiwiZmluZEluZGV4IiwibWVyZ2VJbnRlcmFjdGlvbnMiLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJtZXJnZWQiLCJrZXkiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImN1cnJlbnRDb25maWciLCJjb25maWciLCJfcmVmIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNvbmZpZ1RvTWVyZ2UiLCJfbWVyZ2VJbnRlcmFjdGlvblRvb2wiLCJtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyIsIm1lcmdlZFRvb2x0aXAiLCJ1bm1lcmdlZFRvb2x0aXAiLCJmaWVsZHNUb1Nob3ciLCJ0b29sdGlwIiwiQm9vbGVhbiIsInBpY2siLCJtZXJnZVNwbGl0TWFwcyIsInNwbGl0TWFwcyIsInNtIiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheTIiLCJwdXNoVG8iLCJmaW5kIiwiZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwIiwic3BsaXRNYXBzVG9CZU1lcmdlZCIsInRvb2x0aXBDb25maWciLCJfbG9vcCIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJmb3VuZEZpZWxkc1RvU2hvdyIsIm1ldGFkYXRhIiwiaXNEeW5hbWljU3BhdGlhbEluZGV4IiwiZmllbGQiLCJpbmNsdWRlcyIsIm1lcmdlTGF5ZXJCbGVuZGluZyIsImxheWVyQmxlbmRpbmciLCJMQVlFUl9CTEVORElOR1MiLCJtZXJnZUFuaW1hdGlvbkNvbmZpZyIsImFuaW1hdGlvbiIsImN1cnJlbnRUaW1lIiwiYW5pbWF0aW9uQ29uZmlnIiwiZG9tYWluIiwidmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyIsInNhdmVkQ29scyIsImVtcHR5Q29scyIsImNvbHVtbnMiLCJfbG9vcDIiLCJfT2JqZWN0JGtleXMiLCJfaSIsInNhdmVkIiwiZmllbGRJZHgiLCJfcmVmNCIsImFsbENvbEZvdW5kIiwiZXZlcnkiLCJ2YWxpZGF0ZUNvbHVtbiIsImNvbHVtbiIsIm9wdGlvbmFsIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsIl9yZWY1Iiwic2F2ZWRUZXh0TGFiZWwiLCJfcmVmNiIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiX3JlZjciLCJzY2FsZSIsImZvdW5kRmllbGQiLCJjb2xvckZpZWxkUHJvcHMiLCJfc2F2ZWRMYXllciRjb25maWckZmkiLCJjb2xvckNvbHVtbiIsImNvbG9yQ29sdW1uRmllbGQiLCJjb2xvckNvbHVtbklkeCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwibGF5ZXIiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsIl9yZWYxMCIsIm9wdGlvbnMiLCJ0eXBlIiwiaGFzT3duUHJvcGVydHkiLCJsYWJlbCIsImNvbG9yIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJ2aXNpYmlsaXR5Qnlab29tIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiYWxsb3dFbXB0eUNvbHVtbiIsInZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInNoYWxsb3dDb3B5IiwiaXNWYWxpZE1lcmdlciIsIm1lcmdlciIsImlzT2JqZWN0IiwibWVyZ2UiLCJwcm9wIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwidG9NZXJnZVByb3AiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVkdWNlcnMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCB7aXNPYmplY3QsIGFycmF5SW5zZXJ0fSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2FwcGx5RmlsdGVyc1RvRGF0YXNldHMsIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuXG5pbXBvcnQge2dldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcH0gZnJvbSAndXRpbHMvc3BsaXQtbWFwLXV0aWxzJztcbmltcG9ydCB7cmVzZXRGaWx0ZXJHcHVNb2RlLCBhc3NpZ25HcHVDaGFubmVsc30gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDVVJSRU5UX1ZFUlNJT04sIHZpc1N0YXRlU2NoZW1hfSBmcm9tICdzY2hlbWFzJztcblxuaW1wb3J0IHtWaXNTdGF0ZSwgRGF0YXNldHN9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7UGFyc2VkQ29uZmlnLCBQYXJzZWRMYXllcn0gZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge0xheWVyLCBMYXllckNvbHVtbnMsIExheWVyQ29sdW1ufSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtUb29sdGlwSW5mb30gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtTYXZlZEludGVyYWN0aW9uQ29uZmlnfSBmcm9tICdzY2hlbWFzL3NjaGVtYS1tYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgTWVyZ2VyID0ge1xuICBtZXJnZTogKHN0YXRlOiBWaXNTdGF0ZSwgY29uZmlnOiBhbnksIGZyb21Db25maWc/OiBib29sZWFuKSA9PiBWaXNTdGF0ZTtcbiAgcHJvcDogc3RyaW5nO1xuICB0b01lcmdlUHJvcD86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWaXNTdGF0ZU1lcmdlcnMgPSBNZXJnZXJbXTtcblxuLyoqXG4gKiBNZXJnZSBsb2FkZWQgZmlsdGVycyB3aXRoIGN1cnJlbnQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG5cbiAgLy8gbWVyZ2UgZmlsdGVyIHdpdGggZXhpc3RpbmdcbiAgbGV0IHVwZGF0ZWRGaWx0ZXJzID0gWy4uLihzdGF0ZS5maWx0ZXJzIHx8IFtdKSwgLi4udmFsaWRhdGVkXTtcbiAgdXBkYXRlZEZpbHRlcnMgPSByZXNldEZpbHRlckdwdU1vZGUodXBkYXRlZEZpbHRlcnMpO1xuICB1cGRhdGVkRmlsdGVycyA9IGFzc2lnbkdwdUNoYW5uZWxzKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZGF0YXNldHNUb0ZpbHRlciA9IHVuaXEoZmxhdHRlbkRlZXAodmFsaWRhdGVkLm1hcChmID0+IGYuZGF0YUlkKSkpO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0c1RvRmlsdGVyLFxuICAgIHVwZGF0ZWREYXRhc2V0cyxcbiAgICB1cGRhdGVkRmlsdGVycyxcbiAgICBzdGF0ZS5sYXllcnNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHVwZGF0ZWRGaWx0ZXJzLFxuICAgIGRhdGFzZXRzOiBmaWx0ZXJlZCxcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGZpcnN0IHZhbGlkYXRlIGNvbmZpZyBhZ2FpbnN0IGRhdGFzZXRcbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzLCBbXG4gICAgbGF5ZXJDb25maWdcbiAgXSk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihuZXdMYXllcik6IFBhcnNlZExheWVyIHtcbiAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0uc2F2ZSh7XG4gICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgIGxheWVyT3JkZXI6IFswXVxuICB9KS52aXNTdGF0ZTtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLmxvYWQoc2F2ZWRWaXNTdGF0ZSkudmlzU3RhdGUubGF5ZXJzWzBdO1xuICByZXR1cm4gbG9hZGVkTGF5ZXI7XG59XG5cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBsYXllcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnID8gbGF5ZXJzVG9NZXJnZS5tYXAobCA9PiBsLmlkKSA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZDogdW5tZXJnZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBsYXllcnNUb01lcmdlXG4gICk7XG5cbiAgLy8gcHV0IG5ldyBsYXllcnMgaW4gZnJvbnQgb2YgY3VycmVudCBsYXllcnNcbiAgY29uc3Qge25ld0xheWVyT3JkZXIsIG5ld0xheWVyc30gPSBpbnNlcnRMYXllckF0UmlnaHRPcmRlcihcbiAgICBzdGF0ZS5sYXllcnMsXG4gICAgbWVyZ2VkTGF5ZXIsXG4gICAgc3RhdGUubGF5ZXJPcmRlcixcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmb250XG4gICAgbGV0IGluc2VydEF0ID0gMDtcblxuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgcHJlY2VlZExheWVyID0gcHJlc2VydmVkT3JkZXJbaV07XG4gICAgICAgIHByZWNlZWRJZHggPSBsYXllck9yZGVyUXVldWUuaW5kZXhPZihwcmVjZWVkTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogdW5tZXJnZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIE9iamVjdC5lbnRyaWVzKHNtLmxheWVycykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgIGxheWVyczogcHVzaFRvID09PSBtZXJnZWQgPyBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAoc3RhdGUubGF5ZXJzKSA6IFtdXG4gICAgICB9O1xuICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgLi4ucHVzaFRvW2ldLmxheWVycyxcbiAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBtZXJnZWQsXG4gICAgc3BsaXRNYXBzVG9CZU1lcmdlZDogWy4uLnN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IChzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLm1ldGFkYXRhIGFzIGFueSkuaXNEeW5hbWljU3BhdGlhbEluZGV4XG4gICAgICAgID8gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICA6IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+IGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKSk7XG5cbiAgICAgIG1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IGZvdW5kRmllbGRzVG9TaG93O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJCbGVuZGluZyB3aXRoIHNhdmVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckJsZW5kaW5nKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiBhbmltYXRpb24uY3VycmVudFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICAuLi5hbmltYXRpb24sXG4gICAgICAgIGRvbWFpbjogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29sdW1ucyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcGFyYW0gc2F2ZWRDb2xzXG4gKiBAcGFyYW0gZW1wdHlDb2xzXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zXG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGlmIChhbGxDb2xGb3VuZCkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKGZpZWxkcywgW2xheWVyVGV4dExhYmVsXSwgc2F2ZWRUZXh0TGFiZWwpIHtcbiAgY29uc3Qgc2F2ZWRUZXh0TGFiZWxzID0gQXJyYXkuaXNBcnJheShzYXZlZFRleHRMYWJlbCkgPyBzYXZlZFRleHRMYWJlbCA6IFtzYXZlZFRleHRMYWJlbF07XG5cbiAgLy8gdmFsaWRhdGUgZmllbGRcbiAgcmV0dXJuIHNhdmVkVGV4dExhYmVscy5tYXAodGV4dExhYmVsID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRleHRMYWJlbC5maWVsZFxuICAgICAgPyBmaWVsZHMuZmluZChmZCA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRleHRMYWJlbC5maWVsZCkuZXZlcnkoa2V5ID0+IHRleHRMYWJlbC5maWVsZFtrZXldID09PSBmZFtrZXldKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllclxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGNvbnN0IGNvbG9yRmllbGRQcm9wcyA9IHt9O1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sb3JDb2x1bW5GaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5jb2xvckNvbHVtblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb2xvckNvbHVtbkZpZWxkKSB7XG4gICAgICAgICAgKGNvbG9yRmllbGRQcm9wcyBhcyBhbnkpLmNvbG9yQ29sdW1uID0gY29sb3JDb2x1bW5GaWVsZC5uYW1lO1xuICAgICAgICAgIChjb2xvckZpZWxkUHJvcHMgYXMgYW55KS5jb2xvckNvbHVtbklkeCA9IGNvbG9yQ29sdW1uRmllbGQuZmllbGRJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiB7Li4uZm91bmRGaWVsZCwgLi4uY29sb3JGaWVsZFByb3BzfX0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICB2aXNpYmlsaXR5Qnlab29tOiAoc2F2ZWRMYXllci5jb25maWcgYXMgYW55KS52aXNpYmlsaXR5Qnlab29tIFxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxjQUFBLEdB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VUFBVSxDQUFDdEUsTUFBTSxDQUFDaUUsU0FBUyxJQUFJaEgsUUFBUSxDQUFDK0MsTUFBTSxDQUFDaUUsU0FBUyxHQUNwRE4sc0JBQXNCLENBQUMvQixNQUFNLEVBQUUzRSxRQUFRLENBQUMrQyxNQUFNLENBQUNpRSxTQUFTLEVBQUVLLFVBQVUsQ0FBQ3RFLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQyxHQUN0RmhILFFBQVEsQ0FBQytDLE1BQU0sQ0FBQ2lFLFNBQVM7O0VBRS9CO0VBQ0EsSUFBTW9DLFNBQVMsR0FBR3BKLFFBQVEsQ0FBQ3FKLGVBQWUsQ0FDeENySixRQUFRLENBQUMrQyxNQUFNLENBQUNxRyxTQUFTLEVBQ3pCL0IsVUFBVSxDQUFDdEUsTUFBTSxDQUFDcUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUNqQztJQUFDRSxXQUFXLEVBQUUsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCO0VBQUMsQ0FDbEQsQ0FBQztFQUVEdEosUUFBUSxDQUFDaUksaUJBQWlCLENBQUM7SUFDekJtQixTQUFTLEVBQVRBLFNBQVM7SUFDVHBDLFNBQVMsRUFBVEE7RUFDRixDQUFDLENBQUM7RUFFRixPQUFPaEgsUUFBUTtBQUNqQjtBQUVPLFNBQVN1SixhQUFhQSxDQUFDQyxNQUFjLEVBQVc7RUFDckQsT0FBTyxJQUFBQyxlQUFRLEVBQUNELE1BQU0sQ0FBQyxJQUFJLE9BQU9BLE1BQU0sQ0FBQ0UsS0FBSyxLQUFLLFVBQVUsSUFBSSxPQUFPRixNQUFNLENBQUNHLElBQUksS0FBSyxRQUFRO0FBQ2xHO0FBRU8sSUFBTUMsaUJBQWtDLEdBQUFDLE9BQUEsQ0FBQUQsaUJBQUEsR0FBRyxDQUNoRDtFQUFDRixLQUFLLEVBQUUvSSxXQUFXO0VBQUVnSixJQUFJLEVBQUUsUUFBUTtFQUFFRyxXQUFXLEVBQUU7QUFBaUIsQ0FBQyxFQUNwRTtFQUFDSixLQUFLLEVBQUV4TCxZQUFZO0VBQUV5TCxJQUFJLEVBQUUsU0FBUztFQUFFRyxXQUFXLEVBQUU7QUFBa0IsQ0FBQyxFQUN2RTtFQUFDSixLQUFLLEVBQUVqSCxpQkFBaUI7RUFBRWtILElBQUksRUFBRSxtQkFBbUI7RUFBRUcsV0FBVyxFQUFFO0FBQXVCLENBQUMsRUFDM0Y7RUFBQ0osS0FBSyxFQUFFeEUsa0JBQWtCO0VBQUV5RSxJQUFJLEVBQUU7QUFBZSxDQUFDLEVBQ2xEO0VBQUNELEtBQUssRUFBRTdGLGNBQWM7RUFBRThGLElBQUksRUFBRSxXQUFXO0VBQUVHLFdBQVcsRUFBRTtBQUFxQixDQUFDLEVBQzlFO0VBQUNKLEtBQUssRUFBRXJFLG9CQUFvQjtFQUFFc0UsSUFBSSxFQUFFO0FBQWlCLENBQUMsQ0FDdkQiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
565
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfdXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfc3BsaXRNYXBVdGlscyIsIl9ncHVGaWx0ZXJVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJfc2NoZW1hcyIsIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJ1cGRhdGVkRmlsdGVycyIsImZpbHRlcnMiLCJyZXNldEZpbHRlckdwdU1vZGUiLCJhc3NpZ25HcHVDaGFubmVscyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJ1bmlxIiwiZmxhdHRlbkRlZXAiLCJtYXAiLCJmIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwibGF5ZXJDb25maWciLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplTGF5ZXIiLCJzYXZlZFZpc1N0YXRlIiwidmlzU3RhdGVTY2hlbWEiLCJDVVJSRU5UX1ZFUlNJT04iLCJzYXZlIiwibGF5ZXJPcmRlciIsInZpc1N0YXRlIiwibG9hZGVkTGF5ZXIiLCJsb2FkIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicHJlc2VydmVMYXllck9yZGVyIiwibCIsImlkIiwibWVyZ2VkTGF5ZXIiLCJ1bm1lcmdlZCIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsImxheWVyVG9CZU1lcmdlZCIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsInByZXNlcnZlZE9yZGVyIiwibGF5ZXJPcmRlclF1ZXVlIiwiaSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwicHJlY2VlZElkeCIsInByZWNlZWRMYXllciIsImFycmF5SW5zZXJ0IiwiY29uY2F0IiwiZmluZEluZGV4IiwibWVyZ2VJbnRlcmFjdGlvbnMiLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJtZXJnZWQiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImludGVyYWN0aW9uQ29uZmlnIiwiY3VycmVudENvbmZpZyIsImNvbmZpZyIsImVuYWJsZWQiLCJjb25maWdTYXZlZCIsImNvbmZpZ1RvTWVyZ2UiLCJtZXJnZWRUb29sdGlwIiwidW5tZXJnZWRUb29sdGlwIiwibWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWciLCJmaWVsZHNUb1Nob3ciLCJ0b29sdGlwIiwiQm9vbGVhbiIsInBpY2siLCJtZXJnZVNwbGl0TWFwcyIsInNwbGl0TWFwcyIsInNtIiwiZW50cmllcyIsIl9yZWYiLCJ2YWx1ZSIsInB1c2hUbyIsImZpbmQiLCJnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwidG9vbHRpcENvbmZpZyIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJuYW1lIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJtZXRhZGF0YSIsImlzRHluYW1pY1NwYXRpYWxJbmRleCIsImZpbHRlciIsImZpZWxkIiwiaW5jbHVkZXMiLCJtZXJnZUxheWVyQmxlbmRpbmciLCJsYXllckJsZW5kaW5nIiwiTEFZRVJfQkxFTkRJTkdTIiwibWVyZ2VBbmltYXRpb25Db25maWciLCJhbmltYXRpb24iLCJjdXJyZW50VGltZSIsImFuaW1hdGlvbkNvbmZpZyIsImRvbWFpbiIsInZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMiLCJzYXZlZENvbHMiLCJlbXB0eUNvbHMiLCJjb2x1bW5zIiwic2F2ZWQiLCJmaWVsZElkeCIsIl9yZWYyIiwiYWxsQ29sRm91bmQiLCJldmVyeSIsInZhbGlkYXRlQ29sdW1uIiwiY29sdW1uIiwib3B0aW9uYWwiLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0ZVNhdmVkVGV4dExhYmVsIiwiX3JlZjMiLCJzYXZlZFRleHRMYWJlbCIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiX3JlZjQiLCJzY2FsZSIsImZvdW5kRmllbGQiLCJjb2xvckZpZWxkUHJvcHMiLCJfc2F2ZWRMYXllciRjb25maWckZmkiLCJjb2xvckNvbHVtbiIsImNvbG9yQ29sdW1uRmllbGQiLCJjb2xvckNvbHVtbklkeCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwibGF5ZXIiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsInB1c2giLCJfcmVmNSIsIm9wdGlvbnMiLCJ0eXBlIiwiaGFzT3duUHJvcGVydHkiLCJsYWJlbCIsImNvbG9yIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJ2aXNpYmlsaXR5Qnlab29tIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiYWxsb3dFbXB0eUNvbHVtbiIsInZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInNoYWxsb3dDb3B5IiwiaXNWYWxpZE1lcmdlciIsIm1lcmdlciIsImlzT2JqZWN0IiwibWVyZ2UiLCJwcm9wIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwidG9NZXJnZVByb3AiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVkdWNlcnMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCB7aXNPYmplY3QsIGFycmF5SW5zZXJ0fSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2FwcGx5RmlsdGVyc1RvRGF0YXNldHMsIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuXG5pbXBvcnQge2dldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcH0gZnJvbSAndXRpbHMvc3BsaXQtbWFwLXV0aWxzJztcbmltcG9ydCB7cmVzZXRGaWx0ZXJHcHVNb2RlLCBhc3NpZ25HcHVDaGFubmVsc30gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDVVJSRU5UX1ZFUlNJT04sIHZpc1N0YXRlU2NoZW1hfSBmcm9tICdzY2hlbWFzJztcblxuaW1wb3J0IHtWaXNTdGF0ZSwgRGF0YXNldHN9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7UGFyc2VkQ29uZmlnLCBQYXJzZWRMYXllcn0gZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge0xheWVyLCBMYXllckNvbHVtbnMsIExheWVyQ29sdW1ufSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtUb29sdGlwSW5mb30gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtTYXZlZEludGVyYWN0aW9uQ29uZmlnfSBmcm9tICdzY2hlbWFzL3NjaGVtYS1tYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgTWVyZ2VyID0ge1xuICBtZXJnZTogKHN0YXRlOiBWaXNTdGF0ZSwgY29uZmlnOiBhbnksIGZyb21Db25maWc/OiBib29sZWFuKSA9PiBWaXNTdGF0ZTtcbiAgcHJvcDogc3RyaW5nO1xuICB0b01lcmdlUHJvcD86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWaXNTdGF0ZU1lcmdlcnMgPSBNZXJnZXJbXTtcblxuLyoqXG4gKiBNZXJnZSBsb2FkZWQgZmlsdGVycyB3aXRoIGN1cnJlbnQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG5cbiAgLy8gbWVyZ2UgZmlsdGVyIHdpdGggZXhpc3RpbmdcbiAgbGV0IHVwZGF0ZWRGaWx0ZXJzID0gWy4uLihzdGF0ZS5maWx0ZXJzIHx8IFtdKSwgLi4udmFsaWRhdGVkXTtcbiAgdXBkYXRlZEZpbHRlcnMgPSByZXNldEZpbHRlckdwdU1vZGUodXBkYXRlZEZpbHRlcnMpO1xuICB1cGRhdGVkRmlsdGVycyA9IGFzc2lnbkdwdUNoYW5uZWxzKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZGF0YXNldHNUb0ZpbHRlciA9IHVuaXEoZmxhdHRlbkRlZXAodmFsaWRhdGVkLm1hcChmID0+IGYuZGF0YUlkKSkpO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0c1RvRmlsdGVyLFxuICAgIHVwZGF0ZWREYXRhc2V0cyxcbiAgICB1cGRhdGVkRmlsdGVycyxcbiAgICBzdGF0ZS5sYXllcnNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHVwZGF0ZWRGaWx0ZXJzLFxuICAgIGRhdGFzZXRzOiBmaWx0ZXJlZCxcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGZpcnN0IHZhbGlkYXRlIGNvbmZpZyBhZ2FpbnN0IGRhdGFzZXRcbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzLCBbXG4gICAgbGF5ZXJDb25maWdcbiAgXSk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihuZXdMYXllcik6IFBhcnNlZExheWVyIHtcbiAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0uc2F2ZSh7XG4gICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgIGxheWVyT3JkZXI6IFswXVxuICB9KS52aXNTdGF0ZTtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLmxvYWQoc2F2ZWRWaXNTdGF0ZSkudmlzU3RhdGUubGF5ZXJzWzBdO1xuICByZXR1cm4gbG9hZGVkTGF5ZXI7XG59XG5cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBsYXllcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnID8gbGF5ZXJzVG9NZXJnZS5tYXAobCA9PiBsLmlkKSA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZDogdW5tZXJnZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBsYXllcnNUb01lcmdlXG4gICk7XG5cbiAgLy8gcHV0IG5ldyBsYXllcnMgaW4gZnJvbnQgb2YgY3VycmVudCBsYXllcnNcbiAgY29uc3Qge25ld0xheWVyT3JkZXIsIG5ld0xheWVyc30gPSBpbnNlcnRMYXllckF0UmlnaHRPcmRlcihcbiAgICBzdGF0ZS5sYXllcnMsXG4gICAgbWVyZ2VkTGF5ZXIsXG4gICAgc3RhdGUubGF5ZXJPcmRlcixcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmb250XG4gICAgbGV0IGluc2VydEF0ID0gMDtcblxuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgcHJlY2VlZExheWVyID0gcHJlc2VydmVkT3JkZXJbaV07XG4gICAgICAgIHByZWNlZWRJZHggPSBsYXllck9yZGVyUXVldWUuaW5kZXhPZihwcmVjZWVkTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogdW5tZXJnZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIE9iamVjdC5lbnRyaWVzKHNtLmxheWVycykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgIGxheWVyczogcHVzaFRvID09PSBtZXJnZWQgPyBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAoc3RhdGUubGF5ZXJzKSA6IFtdXG4gICAgICB9O1xuICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgLi4ucHVzaFRvW2ldLmxheWVycyxcbiAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBtZXJnZWQsXG4gICAgc3BsaXRNYXBzVG9CZU1lcmdlZDogWy4uLnN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IChzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLm1ldGFkYXRhIGFzIGFueSkuaXNEeW5hbWljU3BhdGlhbEluZGV4XG4gICAgICAgID8gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICA6IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+IGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKSk7XG5cbiAgICAgIG1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IGZvdW5kRmllbGRzVG9TaG93O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJCbGVuZGluZyB3aXRoIHNhdmVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckJsZW5kaW5nKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiBhbmltYXRpb24uY3VycmVudFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICAuLi5hbmltYXRpb24sXG4gICAgICAgIGRvbWFpbjogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29sdW1ucyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcGFyYW0gc2F2ZWRDb2xzXG4gKiBAcGFyYW0gZW1wdHlDb2xzXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zXG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGlmIChhbGxDb2xGb3VuZCkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKGZpZWxkcywgW2xheWVyVGV4dExhYmVsXSwgc2F2ZWRUZXh0TGFiZWwpIHtcbiAgY29uc3Qgc2F2ZWRUZXh0TGFiZWxzID0gQXJyYXkuaXNBcnJheShzYXZlZFRleHRMYWJlbCkgPyBzYXZlZFRleHRMYWJlbCA6IFtzYXZlZFRleHRMYWJlbF07XG5cbiAgLy8gdmFsaWRhdGUgZmllbGRcbiAgcmV0dXJuIHNhdmVkVGV4dExhYmVscy5tYXAodGV4dExhYmVsID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRleHRMYWJlbC5maWVsZFxuICAgICAgPyBmaWVsZHMuZmluZChmZCA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRleHRMYWJlbC5maWVsZCkuZXZlcnkoa2V5ID0+IHRleHRMYWJlbC5maWVsZFtrZXldID09PSBmZFtrZXldKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllclxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGNvbnN0IGNvbG9yRmllbGRQcm9wcyA9IHt9O1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sb3JDb2x1bW5GaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5jb2xvckNvbHVtblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb2xvckNvbHVtbkZpZWxkKSB7XG4gICAgICAgICAgKGNvbG9yRmllbGRQcm9wcyBhcyBhbnkpLmNvbG9yQ29sdW1uID0gY29sb3JDb2x1bW5GaWVsZC5uYW1lO1xuICAgICAgICAgIChjb2xvckZpZWxkUHJvcHMgYXMgYW55KS5jb2xvckNvbHVtbklkeCA9IGNvbG9yQ29sdW1uRmllbGQuZmllbGRJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiB7Li4uZm91bmRGaWVsZCwgLi4uY29sb3JGaWVsZFByb3BzfX0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICB2aXNpYmlsaXR5Qnlab29tOiAoc2F2ZWRMYXllci5jb25maWcgYXMgYW55KS52aXNpYmlsaXR5Qnlab29tIFxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7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QzBELFNBQVMsSUFBSXpHLFFBQVEsQ0FBQytDLE1BQU0sQ0FBQzBELFNBQVMsR0FDcERMLHNCQUFzQixDQUFDOUIsTUFBTSxFQUFFdEUsUUFBUSxDQUFDK0MsTUFBTSxDQUFDMEQsU0FBUyxFQUFFSyxVQUFVLENBQUMvRCxNQUFNLENBQUMwRCxTQUFTLENBQUMsR0FDdEZ6RyxRQUFRLENBQUMrQyxNQUFNLENBQUMwRCxTQUFTOztFQUUvQjtFQUNBLE1BQU1xQyxTQUFTLEdBQUc5SSxRQUFRLENBQUMrSSxlQUFlLENBQ3hDL0ksUUFBUSxDQUFDK0MsTUFBTSxDQUFDK0YsU0FBUyxFQUN6QmhDLFVBQVUsQ0FBQy9ELE1BQU0sQ0FBQytGLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFDakM7SUFBQ0UsV0FBVyxFQUFFLENBQUMsWUFBWSxFQUFFLGtCQUFrQjtFQUFDLENBQ2xELENBQUM7RUFFRGhKLFFBQVEsQ0FBQzBILGlCQUFpQixDQUFDO0lBQ3pCb0IsU0FBUztJQUNUckM7RUFDRixDQUFDLENBQUM7RUFFRixPQUFPekcsUUFBUTtBQUNqQjtBQUVPLFNBQVNpSixhQUFhQSxDQUFDQyxNQUFjLEVBQVc7RUFDckQsT0FBTyxJQUFBQyxlQUFRLEVBQUNELE1BQU0sQ0FBQyxJQUFJLE9BQU9BLE1BQU0sQ0FBQ0UsS0FBSyxLQUFLLFVBQVUsSUFBSSxPQUFPRixNQUFNLENBQUNHLElBQUksS0FBSyxRQUFRO0FBQ2xHO0FBRU8sTUFBTUMsaUJBQWtDLEdBQUFDLE9BQUEsQ0FBQUQsaUJBQUEsR0FBRyxDQUNoRDtFQUFDRixLQUFLLEVBQUV6SSxXQUFXO0VBQUUwSSxJQUFJLEVBQUUsUUFBUTtFQUFFRyxXQUFXLEVBQUU7QUFBaUIsQ0FBQyxFQUNwRTtFQUFDSixLQUFLLEVBQUVsTCxZQUFZO0VBQUVtTCxJQUFJLEVBQUUsU0FBUztFQUFFRyxXQUFXLEVBQUU7QUFBa0IsQ0FBQyxFQUN2RTtFQUFDSixLQUFLLEVBQUU5RyxpQkFBaUI7RUFBRStHLElBQUksRUFBRSxtQkFBbUI7RUFBRUcsV0FBVyxFQUFFO0FBQXVCLENBQUMsRUFDM0Y7RUFBQ0osS0FBSyxFQUFFckUsa0JBQWtCO0VBQUVzRSxJQUFJLEVBQUU7QUFBZSxDQUFDLEVBQ2xEO0VBQUNELEtBQUssRUFBRTFGLGNBQWM7RUFBRTJGLElBQUksRUFBRSxXQUFXO0VBQUVHLFdBQVcsRUFBRTtBQUFxQixDQUFDLEVBQzlFO0VBQUNKLEtBQUssRUFBRWxFLG9CQUFvQjtFQUFFbUUsSUFBSSxFQUFFO0FBQWlCLENBQUMsQ0FDdkQiLCJpZ25vcmVMaXN0IjpbXX0=
|