@kepler.gl/deckgl-layers 3.3.0-alpha.1 → 3.3.0-alpha.11
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/cjs/3d-building-layer/3d-building-layer.js +66 -0
- package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/cjs/3d-building-layer/types.js +6 -0
- package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
- package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
- package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
- package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
- package/dist/cjs/globe/atmosphere-layer.js +341 -0
- package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
- package/dist/cjs/globe/globe-layers.js +574 -0
- package/dist/cjs/globe/globe-stars-layer.js +99 -0
- package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
- package/dist/cjs/globe/globe-view.js +404 -0
- package/dist/cjs/globe/index.js +140 -0
- package/dist/cjs/globe/mvt-label-layer.js +190 -0
- package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
- package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
- package/dist/cjs/index.js +163 -0
- package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
- package/dist/cjs/layer-utils/cluster-utils.js +95 -0
- package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
- package/dist/cjs/layer-utils/globe-cell-utils.js +203 -0
- package/dist/cjs/layer-utils/globe-cell-utils.spec.js +118 -0
- package/dist/cjs/layer-utils/shader-utils.js +38 -0
- package/dist/cjs/line-layer/line-layer.js +95 -0
- package/dist/cjs/raster/images.js +271 -0
- package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
- package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
- package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
- package/dist/cjs/raster/types.js +6 -0
- package/dist/cjs/raster/util.js +139 -0
- package/dist/cjs/raster/webgl/color/colormap.js +45 -0
- package/dist/cjs/raster/webgl/color/filter.js +58 -0
- package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
- package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
- package/dist/cjs/raster/webgl/color/saturation.js +42 -0
- package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
- package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
- package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
- package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
- package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
- package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
- package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
- package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
- package/dist/{raster → cjs/raster}/webgl/texture/mask.js +5 -2
- package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
- package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
- package/dist/cjs/raster/webgl/types.js +6 -0
- package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
- package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
- package/dist/cjs/wms/wms-layer.js +624 -0
- package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
- package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
- package/dist/esm/3d-building-layer/types.js +3 -0
- package/dist/esm/cluster-layer/cluster-layer.js +286 -0
- package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
- package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
- package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
- package/dist/esm/globe/atmosphere-layer.js +335 -0
- package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
- package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
- package/dist/esm/globe/globe-layers.js +566 -0
- package/dist/esm/globe/globe-stars-layer.js +92 -0
- package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
- package/dist/esm/globe/globe-view.js +398 -0
- package/dist/esm/globe/index.js +26 -0
- package/dist/esm/globe/mvt-label-layer.js +187 -0
- package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
- package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/layer-utils/aggregation-utils.js +172 -0
- package/dist/esm/layer-utils/cluster-utils.js +89 -0
- package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
- package/dist/esm/layer-utils/globe-cell-utils.js +197 -0
- package/dist/esm/layer-utils/globe-cell-utils.spec.js +115 -0
- package/dist/esm/layer-utils/shader-utils.js +32 -0
- package/dist/esm/line-layer/line-layer.js +91 -0
- package/dist/esm/raster/images.js +267 -0
- package/dist/esm/raster/pipeline-validation-patch.js +94 -0
- package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
- package/dist/esm/raster/raster-processing-uniforms.js +118 -0
- package/dist/esm/raster/types.js +3 -0
- package/dist/esm/raster/util.js +134 -0
- package/dist/esm/raster/webgl/color/colormap.js +39 -0
- package/dist/esm/raster/webgl/color/filter.js +52 -0
- package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
- package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
- package/dist/esm/raster/webgl/color/saturation.js +36 -0
- package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
- package/dist/esm/raster/webgl/index.js +26 -0
- package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
- package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
- package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
- package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
- package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
- package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
- package/dist/esm/raster/webgl/texture/mask.js +47 -0
- package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
- package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
- package/dist/esm/raster/webgl/types.js +3 -0
- package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
- package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
- package/dist/esm/wms/wms-layer.js +619 -0
- package/dist/globe/atmosphere-layer.d.ts +58 -0
- package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
- package/dist/globe/globe-depth-disk-layer.d.ts +19 -0
- package/dist/globe/globe-layers.d.ts +108 -0
- package/dist/globe/globe-stars-layer.d.ts +10 -0
- package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
- package/dist/globe/globe-view.d.ts +23 -0
- package/dist/globe/index.d.ts +8 -0
- package/dist/globe/mvt-label-layer.d.ts +7928 -0
- package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +138 -56
- package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +138 -56
- package/dist/index.d.ts +1 -0
- package/dist/layer-utils/cluster-utils.d.ts +6 -1
- package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
- package/dist/layer-utils/globe-cell-utils.spec.d.ts +1 -0
- package/dist/raster/images.d.ts +10 -1
- package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
- package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
- package/dist/wms/wms-layer.d.ts +27 -0
- package/package.json +22 -13
- package/dist/3d-building-layer/3d-building-layer.js +0 -66
- package/dist/3d-building-layer/3d-building-utils.js +0 -166
- package/dist/3d-building-layer/types.js +0 -6
- package/dist/cluster-layer/cluster-layer.js +0 -293
- package/dist/column-layer/enhanced-column-layer.js +0 -135
- package/dist/deckgl-extensions/filter-shader-module.js +0 -26
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -90
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -108
- package/dist/index.js +0 -152
- package/dist/layer-utils/aggregation-utils.js +0 -181
- package/dist/layer-utils/cluster-utils.js +0 -93
- package/dist/layer-utils/cpu-aggregator.js +0 -798
- package/dist/layer-utils/shader-utils.js +0 -38
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -259
- package/dist/raster/pipeline-validation-patch.js +0 -101
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
- package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer.js +0 -237
- package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
- package/dist/raster/raster-mesh-layer/matrix.js +0 -18
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
- package/dist/raster/raster-processing-uniforms.js +0 -124
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -139
- package/dist/raster/webgl/color/colormap.js +0 -45
- package/dist/raster/webgl/color/filter.js +0 -58
- package/dist/raster/webgl/color/gamma-contrast.js +0 -68
- package/dist/raster/webgl/color/linear-rescale.js +0 -35
- package/dist/raster/webgl/color/saturation.js +0 -42
- package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
- package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
- package/dist/raster/webgl/spectral-indices/evi.js +0 -26
- package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
- package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
- package/dist/raster/webgl/spectral-indices/savi.js +0 -21
- package/dist/raster/webgl/texture/combine-bands.js +0 -65
- package/dist/raster/webgl/texture/reorder-bands.js +0 -72
- package/dist/raster/webgl/texture/rgba-image.js +0 -34
- package/dist/raster/webgl/types.js +0 -6
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -51
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -424
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
4
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn";
|
|
5
|
+
import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf";
|
|
6
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
7
|
+
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; }
|
|
8
|
+
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) { _defineProperty(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; }
|
|
9
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
10
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
11
|
+
// SPDX-License-Identifier: MIT
|
|
12
|
+
// Copyright contributors to the kepler.gl project
|
|
13
|
+
|
|
14
|
+
import { CompositeLayer } from '@deck.gl/core';
|
|
15
|
+
import { TileLayer as DeckGLTileLayer } from '@deck.gl/geo-layers';
|
|
16
|
+
import { SolidPolygonLayer } from '@deck.gl/layers';
|
|
17
|
+
import { BLEND_PARAMS_ALPHA } from '@kepler.gl/constants';
|
|
18
|
+
import { getTileData as _getTileData } from './3d-building-utils';
|
|
19
|
+
var ThreeDBuildingLayer = /*#__PURE__*/function (_CompositeLayer) {
|
|
20
|
+
function ThreeDBuildingLayer() {
|
|
21
|
+
_classCallCheck(this, ThreeDBuildingLayer);
|
|
22
|
+
return _callSuper(this, ThreeDBuildingLayer, arguments);
|
|
23
|
+
}
|
|
24
|
+
_inherits(ThreeDBuildingLayer, _CompositeLayer);
|
|
25
|
+
return _createClass(ThreeDBuildingLayer, [{
|
|
26
|
+
key: "renderSubLayers",
|
|
27
|
+
value:
|
|
28
|
+
// this layer add its subLayers to the redux store, and push sample data
|
|
29
|
+
|
|
30
|
+
function renderSubLayers(props) {
|
|
31
|
+
return new SolidPolygonLayer(_objectSpread(_objectSpread({}, props), {}, {
|
|
32
|
+
parameters: BLEND_PARAMS_ALPHA,
|
|
33
|
+
extruded: true,
|
|
34
|
+
opacity: 1,
|
|
35
|
+
filled: true,
|
|
36
|
+
getElevation: function getElevation(feature) {
|
|
37
|
+
return feature.properties.height || 0;
|
|
38
|
+
},
|
|
39
|
+
getPolygon: function getPolygon(feature) {
|
|
40
|
+
return feature.coordinates;
|
|
41
|
+
},
|
|
42
|
+
getFillColor: this.props.threeDBuildingColor
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
key: "renderLayers",
|
|
47
|
+
value: function renderLayers() {
|
|
48
|
+
var _this = this;
|
|
49
|
+
return [new DeckGLTileLayer({
|
|
50
|
+
id: "".concat(this.id, "-deck-3d-building"),
|
|
51
|
+
getTileData: function getTileData(tile) {
|
|
52
|
+
return _getTileData(_this.props.mapboxApiUrl, _this.props.mapboxApiAccessToken, tile);
|
|
53
|
+
},
|
|
54
|
+
minZoom: 13,
|
|
55
|
+
renderSubLayers: this.renderSubLayers.bind(this),
|
|
56
|
+
updateTriggers: this.props.updateTriggers
|
|
57
|
+
})];
|
|
58
|
+
}
|
|
59
|
+
}]);
|
|
60
|
+
}(CompositeLayer);
|
|
61
|
+
export { ThreeDBuildingLayer as default };
|
|
62
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb21wb3NpdGVMYXllciIsIlRpbGVMYXllciIsIkRlY2tHTFRpbGVMYXllciIsIlNvbGlkUG9seWdvbkxheWVyIiwiQkxFTkRfUEFSQU1TX0FMUEhBIiwiZ2V0VGlsZURhdGEiLCJUaHJlZURCdWlsZGluZ0xheWVyIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NhbGxTdXBlciIsImFyZ3VtZW50cyIsIl9pbmhlcml0cyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwicmVuZGVyU3ViTGF5ZXJzIiwicHJvcHMiLCJfb2JqZWN0U3ByZWFkIiwicGFyYW1ldGVycyIsImV4dHJ1ZGVkIiwib3BhY2l0eSIsImZpbGxlZCIsImdldEVsZXZhdGlvbiIsImZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiaGVpZ2h0IiwiZ2V0UG9seWdvbiIsImNvb3JkaW5hdGVzIiwiZ2V0RmlsbENvbG9yIiwidGhyZWVEQnVpbGRpbmdDb2xvciIsInJlbmRlckxheWVycyIsIl90aGlzIiwiaWQiLCJjb25jYXQiLCJ0aWxlIiwibWFwYm94QXBpVXJsIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtaW5ab29tIiwiYmluZCIsInVwZGF0ZVRyaWdnZXJzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy8zZC1idWlsZGluZy1sYXllci8zZC1idWlsZGluZy1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0NvbXBvc2l0ZUxheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGlsZUxheWVyIGFzIERlY2tHTFRpbGVMYXllcn0gZnJvbSAnQGRlY2suZ2wvZ2VvLWxheWVycyc7XG5pbXBvcnQge1NvbGlkUG9seWdvbkxheWVyLCBTb2xpZFBvbHlnb25MYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtCTEVORF9QQVJBTVNfQUxQSEF9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtnZXRUaWxlRGF0YX0gZnJvbSAnLi8zZC1idWlsZGluZy11dGlscyc7XG5pbXBvcnQge1RocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcywgVGlsZURhdGFJdGVtLCBUaWxlTG9hZFByb3BzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVEQnVpbGRpbmdMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyPFRocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcz4ge1xuICAvLyB0aGlzIGxheWVyIGFkZCBpdHMgc3ViTGF5ZXJzIHRvIHRoZSByZWR1eCBzdG9yZSwgYW5kIHB1c2ggc2FtcGxlIGRhdGFcblxuICByZW5kZXJTdWJMYXllcnMocHJvcHM6IFNvbGlkUG9seWdvbkxheWVyUHJvcHM8YW55Pikge1xuICAgIHJldHVybiBuZXcgU29saWRQb2x5Z29uTGF5ZXI8VGlsZURhdGFJdGVtPih7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHBhcmFtZXRlcnM6IEJMRU5EX1BBUkFNU19BTFBIQSxcbiAgICAgIGV4dHJ1ZGVkOiB0cnVlLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIGZpbGxlZDogdHJ1ZSxcbiAgICAgIGdldEVsZXZhdGlvbjogKGZlYXR1cmU6IFRpbGVEYXRhSXRlbSkgPT4gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCAwLFxuICAgICAgZ2V0UG9seWdvbjogKGZlYXR1cmU6IFRpbGVEYXRhSXRlbSkgPT4gZmVhdHVyZS5jb29yZGluYXRlcyxcbiAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5wcm9wcy50aHJlZURCdWlsZGluZ0NvbG9yXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXJMYXllcnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBEZWNrR0xUaWxlTGF5ZXIoe1xuICAgICAgICBpZDogYCR7dGhpcy5pZH0tZGVjay0zZC1idWlsZGluZ2AgYXMgc3RyaW5nLFxuICAgICAgICBnZXRUaWxlRGF0YTogKHRpbGU6IFRpbGVMb2FkUHJvcHMpID0+XG4gICAgICAgICAgZ2V0VGlsZURhdGEodGhpcy5wcm9wcy5tYXBib3hBcGlVcmwsIHRoaXMucHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW4sIHRpbGUpLFxuICAgICAgICBtaW5ab29tOiAxMyxcbiAgICAgICAgcmVuZGVyU3ViTGF5ZXJzOiB0aGlzLnJlbmRlclN1YkxheWVycy5iaW5kKHRoaXMpLFxuICAgICAgICB1cGRhdGVUcmlnZ2VyczogdGhpcy5wcm9wcy51cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGNBQWMsUUFBTyxlQUFlO0FBQzVDLFNBQVFDLFNBQVMsSUFBSUMsZUFBZSxRQUFPLHFCQUFxQjtBQUNoRSxTQUFRQyxpQkFBaUIsUUFBK0IsaUJBQWlCO0FBQ3pFLFNBQVFDLGtCQUFrQixRQUFPLHNCQUFzQjtBQUV2RCxTQUFRQyxXQUFXLElBQVhBLFlBQVcsUUFBTyxxQkFBcUI7QUFBQyxJQUczQkMsbUJBQW1CLDBCQUFBQyxlQUFBO0VBQUEsU0FBQUQsb0JBQUE7SUFBQUUsZUFBQSxPQUFBRixtQkFBQTtJQUFBLE9BQUFHLFVBQUEsT0FBQUgsbUJBQUEsRUFBQUksU0FBQTtFQUFBO0VBQUFDLFNBQUEsQ0FBQUwsbUJBQUEsRUFBQUMsZUFBQTtFQUFBLE9BQUFLLFlBQUEsQ0FBQU4sbUJBQUE7SUFBQU8sR0FBQTtJQUFBQyxLQUFBO0lBQ3RDOztJQUVBLFNBQUFDLGVBQWVBLENBQUNDLEtBQWtDLEVBQUU7TUFDbEQsT0FBTyxJQUFJYixpQkFBaUIsQ0FBQWMsYUFBQSxDQUFBQSxhQUFBLEtBQ3ZCRCxLQUFLO1FBQ1JFLFVBQVUsRUFBRWQsa0JBQWtCO1FBQzlCZSxRQUFRLEVBQUUsSUFBSTtRQUNkQyxPQUFPLEVBQUUsQ0FBQztRQUNWQyxNQUFNLEVBQUUsSUFBSTtRQUNaQyxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBR0MsT0FBcUI7VUFBQSxPQUFLQSxPQUFPLENBQUNDLFVBQVUsQ0FBQ0MsTUFBTSxJQUFJLENBQUM7UUFBQTtRQUN2RUMsVUFBVSxFQUFFLFNBQVpBLFVBQVVBLENBQUdILE9BQXFCO1VBQUEsT0FBS0EsT0FBTyxDQUFDSSxXQUFXO1FBQUE7UUFDMURDLFlBQVksRUFBRSxJQUFJLENBQUNaLEtBQUssQ0FBQ2E7TUFBbUIsRUFDN0MsQ0FBQztJQUNKO0VBQUM7SUFBQWhCLEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFnQixZQUFZQSxDQUFBLEVBQUc7TUFBQSxJQUFBQyxLQUFBO01BQ2IsT0FBTyxDQUNMLElBQUk3QixlQUFlLENBQUM7UUFDbEI4QixFQUFFLEtBQUFDLE1BQUEsQ0FBSyxJQUFJLENBQUNELEVBQUUsc0JBQTZCO1FBQzNDM0IsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUc2QixJQUFtQjtVQUFBLE9BQy9CN0IsWUFBVyxDQUFDMEIsS0FBSSxDQUFDZixLQUFLLENBQUNtQixZQUFZLEVBQUVKLEtBQUksQ0FBQ2YsS0FBSyxDQUFDb0Isb0JBQW9CLEVBQUVGLElBQUksQ0FBQztRQUFBO1FBQzdFRyxPQUFPLEVBQUUsRUFBRTtRQUNYdEIsZUFBZSxFQUFFLElBQUksQ0FBQ0EsZUFBZSxDQUFDdUIsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoREMsY0FBYyxFQUFFLElBQUksQ0FBQ3ZCLEtBQUssQ0FBQ3VCO01BQzdCLENBQUMsQ0FBQyxDQUNIO0lBQ0g7RUFBQztBQUFBLEVBM0I4Q3ZDLGNBQWM7QUFBQSxTQUExQ00sbUJBQW1CLElBQUFrQyxPQUFBIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright contributors to the kepler.gl project
|
|
3
|
+
|
|
4
|
+
import Protobuf from 'pbf';
|
|
5
|
+
import { VectorTile } from '@mapbox/vector-tile';
|
|
6
|
+
import { worldToLngLat } from 'viewport-mercator-project';
|
|
7
|
+
/* global fetch */
|
|
8
|
+
var TILE_SIZE = 512;
|
|
9
|
+
var MAPBOX_HOST = 'https://a.tiles.mapbox.com';
|
|
10
|
+
var MAP_SOURCE = '/v4/mapbox.mapbox-streets-v7';
|
|
11
|
+
export function getTileData(host, token, _ref) {
|
|
12
|
+
var _ref$index = _ref.index,
|
|
13
|
+
x = _ref$index.x,
|
|
14
|
+
y = _ref$index.y,
|
|
15
|
+
z = _ref$index.z;
|
|
16
|
+
var mapSource = "".concat(host || MAPBOX_HOST).concat(MAP_SOURCE, "/").concat(z, "/").concat(x, "/").concat(y, ".vector.pbf?access_token=").concat(token);
|
|
17
|
+
return fetch(mapSource).then(function (response) {
|
|
18
|
+
return response.arrayBuffer();
|
|
19
|
+
}).then(function (buffer) {
|
|
20
|
+
return decodeTile(x, y, z, buffer);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function decodeTile(x, y, z, arrayBuffer) {
|
|
24
|
+
var tile = new VectorTile(new Protobuf(arrayBuffer));
|
|
25
|
+
var result = [];
|
|
26
|
+
var xProj = x * TILE_SIZE;
|
|
27
|
+
var yProj = y * TILE_SIZE;
|
|
28
|
+
var scale = Math.pow(2, z);
|
|
29
|
+
var projectFunc = project.bind(null, xProj, yProj, scale);
|
|
30
|
+
|
|
31
|
+
/* eslint-disable guard-for-in */
|
|
32
|
+
var layerName = 'building';
|
|
33
|
+
var vectorTileLayer = tile.layers[layerName];
|
|
34
|
+
if (!vectorTileLayer) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
for (var i = 0; i < vectorTileLayer.length; i++) {
|
|
38
|
+
var vectorTileFeature = vectorTileLayer.feature(i);
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
var features = vectorTileFeatureToProp(vectorTileFeature, projectFunc);
|
|
41
|
+
features.forEach(function (f) {
|
|
42
|
+
f.properties.layer = layerName;
|
|
43
|
+
if (f.properties.height) {
|
|
44
|
+
result.push(f);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function project(x, y, scale, line, extent) {
|
|
51
|
+
var sizeToPixel = extent / TILE_SIZE;
|
|
52
|
+
for (var ii = 0; ii < line.length; ii++) {
|
|
53
|
+
var p = line[ii];
|
|
54
|
+
// LNGLAT
|
|
55
|
+
line[ii] = worldToLngLat([x + p[0] / sizeToPixel, y + p[1] / sizeToPixel], scale);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* adapted from @mapbox/vector-tile/lib/vectortilefeature.js for better perf */
|
|
60
|
+
/* eslint-disable */
|
|
61
|
+
export function vectorTileFeatureToProp(vectorTileFeature, project) {
|
|
62
|
+
var coords = getCoordinates(vectorTileFeature);
|
|
63
|
+
var extent = vectorTileFeature.extent;
|
|
64
|
+
var i;
|
|
65
|
+
var j;
|
|
66
|
+
coords = classifyRings(coords);
|
|
67
|
+
for (i = 0; i < coords.length; i++) {
|
|
68
|
+
for (j = 0; j < coords[i].length; j++) {
|
|
69
|
+
project(coords[i][j], extent);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return coords.map(function (coordinates) {
|
|
73
|
+
return {
|
|
74
|
+
coordinates: coordinates,
|
|
75
|
+
properties: vectorTileFeature.properties
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function getCoordinates(vectorTileFeature) {
|
|
80
|
+
var pbf = vectorTileFeature._pbf;
|
|
81
|
+
pbf.pos = vectorTileFeature._geometry;
|
|
82
|
+
var end = pbf.readVarint() + pbf.pos;
|
|
83
|
+
var cmd = 1;
|
|
84
|
+
var length = 0;
|
|
85
|
+
var x = 0;
|
|
86
|
+
var y = 0;
|
|
87
|
+
var lines = [];
|
|
88
|
+
var line;
|
|
89
|
+
while (pbf.pos < end) {
|
|
90
|
+
if (length <= 0) {
|
|
91
|
+
var cmdLen = pbf.readVarint();
|
|
92
|
+
cmd = cmdLen & 0x7;
|
|
93
|
+
length = cmdLen >> 3;
|
|
94
|
+
}
|
|
95
|
+
length--;
|
|
96
|
+
if (cmd === 1 || cmd === 2) {
|
|
97
|
+
x += pbf.readSVarint();
|
|
98
|
+
y += pbf.readSVarint();
|
|
99
|
+
if (cmd === 1) {
|
|
100
|
+
// moveTo
|
|
101
|
+
if (line) lines.push(line);
|
|
102
|
+
line = [];
|
|
103
|
+
}
|
|
104
|
+
if (line) line.push([x, y]);
|
|
105
|
+
} else if (cmd === 7) {
|
|
106
|
+
// Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
|
|
107
|
+
if (line) {
|
|
108
|
+
line.push(line[0].slice()); // closePolygon
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
throw new Error("unknown command ".concat(cmd));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (line) lines.push(line);
|
|
115
|
+
return lines;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// classifies an array of rings into polygons with outer rings and holes
|
|
119
|
+
|
|
120
|
+
function classifyRings(rings) {
|
|
121
|
+
var len = rings.length;
|
|
122
|
+
if (len <= 1) return [rings];
|
|
123
|
+
var polygons = [];
|
|
124
|
+
var polygon;
|
|
125
|
+
var ccw;
|
|
126
|
+
for (var i = 0; i < len; i++) {
|
|
127
|
+
var area = signedArea(rings[i]);
|
|
128
|
+
if (area === 0) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (ccw === undefined) {
|
|
132
|
+
ccw = area < 0;
|
|
133
|
+
}
|
|
134
|
+
if (ccw === area < 0) {
|
|
135
|
+
if (polygon) {
|
|
136
|
+
polygons.push(polygon);
|
|
137
|
+
}
|
|
138
|
+
polygon = [rings[i]];
|
|
139
|
+
} else if (polygon) {
|
|
140
|
+
polygon.push(rings[i]);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (polygon) {
|
|
144
|
+
polygons.push(polygon);
|
|
145
|
+
}
|
|
146
|
+
return polygons;
|
|
147
|
+
}
|
|
148
|
+
function signedArea(ring) {
|
|
149
|
+
var sum = 0;
|
|
150
|
+
for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
|
|
151
|
+
p1 = ring[i];
|
|
152
|
+
p2 = ring[j];
|
|
153
|
+
sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);
|
|
154
|
+
}
|
|
155
|
+
return sum;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm90b2J1ZiIsIlZlY3RvclRpbGUiLCJ3b3JsZFRvTG5nTGF0IiwiVElMRV9TSVpFIiwiTUFQQk9YX0hPU1QiLCJNQVBfU09VUkNFIiwiZ2V0VGlsZURhdGEiLCJob3N0IiwidG9rZW4iLCJfcmVmIiwiX3JlZiRpbmRleCIsImluZGV4IiwieCIsInkiLCJ6IiwibWFwU291cmNlIiwiY29uY2F0IiwiZmV0Y2giLCJ0aGVuIiwicmVzcG9uc2UiLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsImRlY29kZVRpbGUiLCJ0aWxlIiwicmVzdWx0IiwieFByb2oiLCJ5UHJvaiIsInNjYWxlIiwiTWF0aCIsInBvdyIsInByb2plY3RGdW5jIiwicHJvamVjdCIsImJpbmQiLCJsYXllck5hbWUiLCJ2ZWN0b3JUaWxlTGF5ZXIiLCJsYXllcnMiLCJpIiwibGVuZ3RoIiwidmVjdG9yVGlsZUZlYXR1cmUiLCJmZWF0dXJlIiwiZmVhdHVyZXMiLCJ2ZWN0b3JUaWxlRmVhdHVyZVRvUHJvcCIsImZvckVhY2giLCJmIiwicHJvcGVydGllcyIsImxheWVyIiwiaGVpZ2h0IiwicHVzaCIsImxpbmUiLCJleHRlbnQiLCJzaXplVG9QaXhlbCIsImlpIiwicCIsImNvb3JkcyIsImdldENvb3JkaW5hdGVzIiwiaiIsImNsYXNzaWZ5UmluZ3MiLCJtYXAiLCJjb29yZGluYXRlcyIsInBiZiIsIl9wYmYiLCJwb3MiLCJfZ2VvbWV0cnkiLCJlbmQiLCJyZWFkVmFyaW50IiwiY21kIiwibGluZXMiLCJjbWRMZW4iLCJyZWFkU1ZhcmludCIsInNsaWNlIiwiRXJyb3IiLCJyaW5ncyIsImxlbiIsInBvbHlnb25zIiwicG9seWdvbiIsImNjdyIsImFyZWEiLCJzaWduZWRBcmVhIiwidW5kZWZpbmVkIiwicmluZyIsInN1bSIsInAxIiwicDIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvM2QtYnVpbGRpbmctbGF5ZXIvM2QtYnVpbGRpbmctdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGV9IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuaW1wb3J0IHt3b3JsZFRvTG5nTGF0fSBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCB7XG4gIENvb3JkaW5hdGVzLFxuICBGbGF0RmlndXJlLFxuICBUaWxlRGF0YUl0ZW0sXG4gIFZlY3RvclRpbGVGZWF0dXJlLFxuICBWZWN0b3JUaWxlRmVhdHVyZVByb3BlcnRpZXNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qIGdsb2JhbCBmZXRjaCAqL1xuY29uc3QgVElMRV9TSVpFID0gNTEyO1xuY29uc3QgTUFQQk9YX0hPU1QgPSAnaHR0cHM6Ly9hLnRpbGVzLm1hcGJveC5jb20nO1xuY29uc3QgTUFQX1NPVVJDRSA9ICcvdjQvbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY3JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbGVEYXRhKFxuICBob3N0OiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHtpbmRleDoge3gsIHksIHp9fToge2luZGV4OiBDb29yZGluYXRlc31cbik6IFByb21pc2U8VGlsZURhdGFJdGVtW10+IHtcbiAgY29uc3QgbWFwU291cmNlID0gYCR7XG4gICAgaG9zdCB8fCBNQVBCT1hfSE9TVFxuICB9JHtNQVBfU09VUkNFfS8ke3p9LyR7eH0vJHt5fS52ZWN0b3IucGJmP2FjY2Vzc190b2tlbj0ke3Rva2VufWA7XG5cbiAgcmV0dXJuIGZldGNoKG1hcFNvdXJjZSlcbiAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgIC50aGVuKGJ1ZmZlciA9PiBkZWNvZGVUaWxlKHgsIHksIHosIGJ1ZmZlcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVGlsZShcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHo6IG51bWJlcixcbiAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyXG4pOiBUaWxlRGF0YUl0ZW1bXSB7XG4gIGNvbnN0IHRpbGUgPSBuZXcgVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoYXJyYXlCdWZmZXIpKTtcblxuICBjb25zdCByZXN1bHQ6IFRpbGVEYXRhSXRlbVtdID0gW107XG4gIGNvbnN0IHhQcm9qID0geCAqIFRJTEVfU0laRTtcbiAgY29uc3QgeVByb2ogPSB5ICogVElMRV9TSVpFO1xuICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHopO1xuXG4gIGNvbnN0IHByb2plY3RGdW5jID0gcHJvamVjdC5iaW5kKG51bGwsIHhQcm9qLCB5UHJvaiwgc2NhbGUpO1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIGd1YXJkLWZvci1pbiAqL1xuICBjb25zdCBsYXllck5hbWUgPSAnYnVpbGRpbmcnO1xuICBjb25zdCB2ZWN0b3JUaWxlTGF5ZXIgPSB0aWxlLmxheWVyc1tsYXllck5hbWVdO1xuICBpZiAoIXZlY3RvclRpbGVMYXllcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZlY3RvclRpbGVMYXllci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZlY3RvclRpbGVGZWF0dXJlID0gdmVjdG9yVGlsZUxheWVyLmZlYXR1cmUoaSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGZlYXR1cmVzID0gdmVjdG9yVGlsZUZlYXR1cmVUb1Byb3AodmVjdG9yVGlsZUZlYXR1cmUsIHByb2plY3RGdW5jKTtcbiAgICBmZWF0dXJlcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgZi5wcm9wZXJ0aWVzLmxheWVyID0gbGF5ZXJOYW1lO1xuICAgICAgaWYgKGYucHJvcGVydGllcy5oZWlnaHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlciwgc2NhbGU6IG51bWJlciwgbGluZTogRmxhdEZpZ3VyZSwgZXh0ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3Qgc2l6ZVRvUGl4ZWwgPSBleHRlbnQgLyBUSUxFX1NJWkU7XG5cbiAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpbmUubGVuZ3RoOyBpaSsrKSB7XG4gICAgY29uc3QgcCA9IGxpbmVbaWldO1xuICAgIC8vIExOR0xBVFxuICAgIGxpbmVbaWldID0gd29ybGRUb0xuZ0xhdChbeCArIHBbMF0gLyBzaXplVG9QaXhlbCwgeSArIHBbMV0gLyBzaXplVG9QaXhlbF0sIHNjYWxlKTtcbiAgfVxufVxuXG4vKiBhZGFwdGVkIGZyb20gQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMgZm9yIGJldHRlciBwZXJmICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvclRpbGVGZWF0dXJlVG9Qcm9wKFxuICB2ZWN0b3JUaWxlRmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gIHByb2plY3Q6IChyOiBGbGF0RmlndXJlLCBuOiBudW1iZXIpID0+IHZvaWRcbik6IHtjb29yZGluYXRlczogRmxhdEZpZ3VyZVtdOyBwcm9wZXJ0aWVzOiBWZWN0b3JUaWxlRmVhdHVyZVByb3BlcnRpZXN9W10ge1xuICBsZXQgY29vcmRzOiBGbGF0RmlndXJlW11bXSB8IEZsYXRGaWd1cmVbXSA9IGdldENvb3JkaW5hdGVzKHZlY3RvclRpbGVGZWF0dXJlKTtcbiAgY29uc3QgZXh0ZW50ID0gdmVjdG9yVGlsZUZlYXR1cmUuZXh0ZW50O1xuICBsZXQgaTogbnVtYmVyO1xuICBsZXQgajogbnVtYmVyO1xuXG4gIGNvb3JkcyA9IGNsYXNzaWZ5UmluZ3MoY29vcmRzKTtcbiAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIHByb2plY3QoY29vcmRzW2ldW2pdLCBleHRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb29yZHMubWFwKGNvb3JkaW5hdGVzID0+ICh7XG4gICAgY29vcmRpbmF0ZXMsXG4gICAgcHJvcGVydGllczogdmVjdG9yVGlsZUZlYXR1cmUucHJvcGVydGllc1xuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGdldENvb3JkaW5hdGVzKHZlY3RvclRpbGVGZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSk6IEZsYXRGaWd1cmVbXSB7XG4gIGNvbnN0IHBiZiA9IHZlY3RvclRpbGVGZWF0dXJlLl9wYmY7XG4gIHBiZi5wb3MgPSB2ZWN0b3JUaWxlRmVhdHVyZS5fZ2VvbWV0cnk7XG5cbiAgY29uc3QgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG4gIGxldCBjbWQgPSAxO1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgY29uc3QgbGluZXM6IEZsYXRGaWd1cmVbXSA9IFtdO1xuICBsZXQgbGluZTogRmxhdEZpZ3VyZSB8IHVuZGVmaW5lZDtcblxuICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgY29uc3QgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgIH1cblxuICAgIGxlbmd0aC0tO1xuXG4gICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICBpZiAoY21kID09PSAxKSB7XG4gICAgICAgIC8vIG1vdmVUb1xuICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgbGluZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAobGluZSkgbGluZS5wdXNoKFt4LCB5XSk7XG4gICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwbmlrLXZlY3Rvci10aWxlL2lzc3Vlcy85MFxuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uc2xpY2UoKSBhcyBbbnVtYmVyLCBudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gIHJldHVybiBsaW5lcztcbn1cblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3M6IEZsYXRGaWd1cmVbXSk6IEZsYXRGaWd1cmVbXVtdIHtcbiAgY29uc3QgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgY29uc3QgcG9seWdvbnM6IEZsYXRGaWd1cmVbXVtdID0gW107XG4gIGxldCBwb2x5Z29uOiBGbGF0RmlndXJlW10gfCB1bmRlZmluZWQ7XG4gIGxldCBjY3c6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGFyZWEgPSBzaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICBpZiAoYXJlYSA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjY3cgPSBhcmVhIDwgMDtcbiAgICB9XG5cbiAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgaWYgKHBvbHlnb24pIHtcbiAgICAgICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgIH1cbiAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuICAgIH0gZWxzZSBpZiAocG9seWdvbikge1xuICAgICAgcG9seWdvbi5wdXNoKHJpbmdzW2ldKTtcbiAgICB9XG4gIH1cbiAgaWYgKHBvbHlnb24pIHtcbiAgICBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICB9XG5cbiAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKHJpbmc6IEZsYXRGaWd1cmUpOiBudW1iZXIge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDE6IG51bWJlcltdLCBwMjogbnVtYmVyW107IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICBwMSA9IHJpbmdbaV07XG4gICAgcDIgPSByaW5nW2pdO1xuICAgIHN1bSArPSAocDJbMF0gLSBwMVswXSkgKiAocDFbMV0gKyBwMlsxXSk7XG4gIH1cbiAgcmV0dXJuIHN1bTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQSxPQUFPQSxRQUFRLE1BQU0sS0FBSztBQUMxQixTQUFRQyxVQUFVLFFBQU8scUJBQXFCO0FBQzlDLFNBQVFDLGFBQWEsUUFBTywyQkFBMkI7QUFTdkQ7QUFDQSxJQUFNQyxTQUFTLEdBQUcsR0FBRztBQUNyQixJQUFNQyxXQUFXLEdBQUcsNEJBQTRCO0FBQ2hELElBQU1DLFVBQVUsR0FBRyw4QkFBOEI7QUFFakQsT0FBTyxTQUFTQyxXQUFXQSxDQUN6QkMsSUFBWSxFQUNaQyxLQUFhLEVBQUFDLElBQUEsRUFFWTtFQUFBLElBQUFDLFVBQUEsR0FBQUQsSUFBQSxDQUR4QkUsS0FB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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
export {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjLzNkLWJ1aWxkaW5nLWxheWVyL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7UkdCQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBUaWxlSW5kZXggPSB7eDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIFRpbGVMb2FkUHJvcHMgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIGluZGV4OiBUaWxlSW5kZXg7XG4gIGJib3g6IGFueTtcbiAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHVzZXJEYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgem9vbT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRocmVlREJ1aWxkaW5nTGF5ZXJQcm9wcyA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHN0cmluZztcbiAgbWFwYm94QXBpVXJsOiBzdHJpbmc7XG4gIHRocmVlREJ1aWxkaW5nQ29sb3I6IFJHQkNvbG9yO1xuICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgIGdldEZpbGxDb2xvcjogUkdCQ29sb3I7XG4gIH07XG59O1xuZXhwb3J0IHR5cGUgQ29vcmRpbmF0ZXMgPSB7eDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcn07XG4vLyBUT0RPIHJlbmFtZVxuZXhwb3J0IHR5cGUgRmxhdEZpZ3VyZSA9IChbbnVtYmVyLCBudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdO1xuZXhwb3J0IHR5cGUgVGlsZURhdGFJdGVtID0ge2Nvb3JkaW5hdGVzOiBGbGF0RmlndXJlW107IHByb3BlcnRpZXM6IFZlY3RvclRpbGVGZWF0dXJlUHJvcGVydGllc307XG5leHBvcnQgdHlwZSBWZWN0b3JUaWxlRmVhdHVyZVByb3BlcnRpZXMgPSB7bGF5ZXI6IHN0cmluZzsgaGVpZ2h0PzogbnVtYmVyfTtcbmV4cG9ydCB0eXBlIFZlY3RvclRpbGVGZWF0dXJlID0ge1xuICBleHRlbnQ6IG51bWJlcjtcbiAgcHJvcGVydGllczogVmVjdG9yVGlsZUZlYXR1cmVQcm9wZXJ0aWVzO1xuICBfcGJmOiB7XG4gICAgYnVmOiBBcnJheUJ1ZmZlcjtcbiAgICBwb3M6IG51bWJlcjtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgcmVhZFZhcmludDogKGI/OiBib29sZWFuKSA9PiBudW1iZXI7XG4gICAgcmVhZFNWYXJpbnQ6ICgpID0+IG51bWJlcjtcbiAgfTtcbiAgX2dlb21ldHJ5OiBudW1iZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
4
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn";
|
|
5
|
+
import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf";
|
|
6
|
+
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
|
7
|
+
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; }
|
|
8
|
+
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) { _defineProperty(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; }
|
|
9
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
10
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
11
|
+
// SPDX-License-Identifier: MIT
|
|
12
|
+
// Copyright contributors to the kepler.gl project
|
|
13
|
+
|
|
14
|
+
import { CompositeLayer } from '@deck.gl/core';
|
|
15
|
+
import { ScatterplotLayer } from '@deck.gl/layers';
|
|
16
|
+
import geoViewport from '@mapbox/geo-viewport';
|
|
17
|
+
import CPUAggregator, { defaultColorDimension, getDimensionScale } from '../layer-utils/cpu-aggregator';
|
|
18
|
+
import { getDistanceScales } from 'viewport-mercator-project';
|
|
19
|
+
import { max } from 'd3-array';
|
|
20
|
+
import { SCALE_TYPES, DEFAULT_COLOR_RANGE, LAYER_VIS_CONFIGS } from '@kepler.gl/constants';
|
|
21
|
+
import ClusterBuilder, { getGeoJSON } from '../layer-utils/cluster-utils';
|
|
22
|
+
var defaultRadius = LAYER_VIS_CONFIGS.clusterRadius.defaultValue;
|
|
23
|
+
var defaultRadiusRange = LAYER_VIS_CONFIGS.clusterRadiusRange.defaultValue;
|
|
24
|
+
var defaultGetColorValue = function defaultGetColorValue(points) {
|
|
25
|
+
return points.length;
|
|
26
|
+
};
|
|
27
|
+
var defaultGetRadiusValue = function defaultGetRadiusValue(cell) {
|
|
28
|
+
return cell.filteredPoints ? cell.filteredPoints.length : cell.points.length;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
32
|
+
function processGeoJSON(step, props, aggregation, _ref) {
|
|
33
|
+
var viewport = _ref.viewport;
|
|
34
|
+
var data = props.data,
|
|
35
|
+
getPosition = props.getPosition,
|
|
36
|
+
filterData = props.filterData;
|
|
37
|
+
var geoJSON = getGeoJSON(data, getPosition, filterData);
|
|
38
|
+
var clusterBuilder = new ClusterBuilder();
|
|
39
|
+
this.setState({
|
|
40
|
+
geoJSON: geoJSON,
|
|
41
|
+
clusterBuilder: clusterBuilder
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
46
|
+
function getClusters(step, props, aggregation, _ref2) {
|
|
47
|
+
var _clusterBuilder$clust;
|
|
48
|
+
var viewport = _ref2.viewport;
|
|
49
|
+
var _this$state = this.state,
|
|
50
|
+
geoJSON = _this$state.geoJSON,
|
|
51
|
+
clusterBuilder = _this$state.clusterBuilder;
|
|
52
|
+
var clusterRadius = props.clusterRadius,
|
|
53
|
+
zoom = props.zoom,
|
|
54
|
+
width = props.width,
|
|
55
|
+
height = props.height;
|
|
56
|
+
var longitude = viewport.longitude,
|
|
57
|
+
latitude = viewport.latitude;
|
|
58
|
+
|
|
59
|
+
// zoom needs to be an integer for the different map utils. Also helps with cache key.
|
|
60
|
+
var bbox = geoViewport.bounds([longitude, latitude], zoom, [width, height]);
|
|
61
|
+
var clusters = (_clusterBuilder$clust = clusterBuilder === null || clusterBuilder === void 0 ? void 0 : clusterBuilder.clustersAtZoom({
|
|
62
|
+
bbox: bbox,
|
|
63
|
+
clusterRadius: clusterRadius,
|
|
64
|
+
geoJSON: geoJSON,
|
|
65
|
+
zoom: zoom
|
|
66
|
+
})) !== null && _clusterBuilder$clust !== void 0 ? _clusterBuilder$clust : [];
|
|
67
|
+
this.setState({
|
|
68
|
+
layerData: {
|
|
69
|
+
data: clusters
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function getSubLayerRadius(dimensionState, dimension, layerProps) {
|
|
74
|
+
return function (cell) {
|
|
75
|
+
var getRadiusValue = layerProps.getRadiusValue;
|
|
76
|
+
var scaleFunc = dimensionState.scaleFunc;
|
|
77
|
+
return scaleFunc(getRadiusValue(cell));
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export var clusterAggregation = {
|
|
81
|
+
key: 'position',
|
|
82
|
+
updateSteps: [{
|
|
83
|
+
key: 'geojson',
|
|
84
|
+
triggers: {
|
|
85
|
+
position: {
|
|
86
|
+
prop: 'getPosition',
|
|
87
|
+
updateTrigger: 'getPosition'
|
|
88
|
+
},
|
|
89
|
+
filterData: {
|
|
90
|
+
prop: 'filterData',
|
|
91
|
+
updateTrigger: 'filterData'
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
updater: processGeoJSON
|
|
95
|
+
}, {
|
|
96
|
+
key: 'clustering',
|
|
97
|
+
triggers: {
|
|
98
|
+
clusterRadius: {
|
|
99
|
+
prop: 'clusterRadius'
|
|
100
|
+
},
|
|
101
|
+
zoom: {
|
|
102
|
+
prop: 'zoom'
|
|
103
|
+
},
|
|
104
|
+
width: {
|
|
105
|
+
prop: 'width'
|
|
106
|
+
},
|
|
107
|
+
height: {
|
|
108
|
+
prop: 'height'
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
updater: getClusters
|
|
112
|
+
}]
|
|
113
|
+
};
|
|
114
|
+
function getRadiusValueDomain(step, props, dimensionUpdater) {
|
|
115
|
+
var key = dimensionUpdater.key;
|
|
116
|
+
var getRadiusValue = props.getRadiusValue;
|
|
117
|
+
var layerData = this.state.layerData;
|
|
118
|
+
var valueDomain = [0, max(layerData.data, getRadiusValue)];
|
|
119
|
+
this._setDimensionState(key, {
|
|
120
|
+
valueDomain: valueDomain
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
var clusterLayerDimensions = [defaultColorDimension, {
|
|
124
|
+
key: 'radius',
|
|
125
|
+
accessor: 'getRadius',
|
|
126
|
+
nullValue: 0,
|
|
127
|
+
updateSteps: [{
|
|
128
|
+
key: 'getDomain',
|
|
129
|
+
triggers: {
|
|
130
|
+
value: {
|
|
131
|
+
prop: 'getRadiusValue',
|
|
132
|
+
updateTrigger: 'getRadiusValue'
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
updater: getRadiusValueDomain
|
|
136
|
+
}, {
|
|
137
|
+
key: 'getScaleFunc',
|
|
138
|
+
triggers: {
|
|
139
|
+
domain: {
|
|
140
|
+
prop: 'radiusDomain'
|
|
141
|
+
},
|
|
142
|
+
range: {
|
|
143
|
+
prop: 'radiusRange'
|
|
144
|
+
},
|
|
145
|
+
scaleType: {
|
|
146
|
+
prop: 'radiusScaleType'
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
updater: getDimensionScale
|
|
150
|
+
}],
|
|
151
|
+
getSubLayerAccessor: getSubLayerRadius,
|
|
152
|
+
getPickingInfo: function getPickingInfo(dimensionState, cell, layerProps) {
|
|
153
|
+
var radiusValue = layerProps.getRadiusValue(cell);
|
|
154
|
+
var scaleFunc = dimensionState.scaleFunc;
|
|
155
|
+
var scaledRadiusValue = scaleFunc ? scaleFunc(radiusValue) : radiusValue;
|
|
156
|
+
return {
|
|
157
|
+
radiusValue: radiusValue,
|
|
158
|
+
scaledRadiusValue: scaledRadiusValue
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}];
|
|
162
|
+
var defaultProps = {
|
|
163
|
+
clusterRadius: defaultRadius,
|
|
164
|
+
colorDomain: null,
|
|
165
|
+
colorRange: DEFAULT_COLOR_RANGE,
|
|
166
|
+
colorScaleType: SCALE_TYPES.quantize,
|
|
167
|
+
radiusScaleType: SCALE_TYPES.sqrt,
|
|
168
|
+
radiusRange: defaultRadiusRange,
|
|
169
|
+
getPosition: {
|
|
170
|
+
type: 'accessor',
|
|
171
|
+
value: function value(x) {
|
|
172
|
+
return x.position;
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
getColorValue: {
|
|
176
|
+
type: 'accessor',
|
|
177
|
+
value: defaultGetColorValue
|
|
178
|
+
},
|
|
179
|
+
getRadiusValue: {
|
|
180
|
+
type: 'accessor',
|
|
181
|
+
value: defaultGetRadiusValue
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
var ClusterLayer = /*#__PURE__*/function (_CompositeLayer) {
|
|
185
|
+
function ClusterLayer() {
|
|
186
|
+
_classCallCheck(this, ClusterLayer);
|
|
187
|
+
return _callSuper(this, ClusterLayer, arguments);
|
|
188
|
+
}
|
|
189
|
+
_inherits(ClusterLayer, _CompositeLayer);
|
|
190
|
+
return _createClass(ClusterLayer, [{
|
|
191
|
+
key: "initializeState",
|
|
192
|
+
value: function initializeState() {
|
|
193
|
+
var cpuAggregator = new CPUAggregator({
|
|
194
|
+
aggregation: clusterAggregation,
|
|
195
|
+
dimensions: clusterLayerDimensions
|
|
196
|
+
});
|
|
197
|
+
this.state = {
|
|
198
|
+
cpuAggregator: cpuAggregator,
|
|
199
|
+
aggregatorState: cpuAggregator.state
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}, {
|
|
203
|
+
key: "updateState",
|
|
204
|
+
value: function updateState(_ref3) {
|
|
205
|
+
var oldProps = _ref3.oldProps,
|
|
206
|
+
props = _ref3.props,
|
|
207
|
+
changeFlags = _ref3.changeFlags;
|
|
208
|
+
this.setState({
|
|
209
|
+
aggregatorState: this.state.cpuAggregator.updateState({
|
|
210
|
+
oldProps: oldProps,
|
|
211
|
+
props: props,
|
|
212
|
+
changeFlags: changeFlags
|
|
213
|
+
}, {
|
|
214
|
+
viewport: this.context.viewport,
|
|
215
|
+
// @ts-expect-error props passed for internal calculation
|
|
216
|
+
numInstances: this.getNumInstances(props)
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}, {
|
|
221
|
+
key: "getPickingInfo",
|
|
222
|
+
value: function getPickingInfo(_ref4) {
|
|
223
|
+
var info = _ref4.info;
|
|
224
|
+
var obj = this.state.cpuAggregator.getPickingInfo({
|
|
225
|
+
info: info
|
|
226
|
+
}, this.props);
|
|
227
|
+
if (obj !== null && obj !== void 0 && obj.object) {
|
|
228
|
+
var distanceScale = getDistanceScales(this.context.viewport);
|
|
229
|
+
var metersPerPixel = distanceScale.metersPerPixel[0];
|
|
230
|
+
obj.object.scaledRadiusValue = obj.object.scaledRadiusValue * metersPerPixel;
|
|
231
|
+
}
|
|
232
|
+
return obj;
|
|
233
|
+
}
|
|
234
|
+
}, {
|
|
235
|
+
key: "_getSublayerUpdateTriggers",
|
|
236
|
+
value: function _getSublayerUpdateTriggers() {
|
|
237
|
+
return this.state.cpuAggregator.getUpdateTriggers(this.props);
|
|
238
|
+
}
|
|
239
|
+
}, {
|
|
240
|
+
key: "_getSubLayerAccessors",
|
|
241
|
+
value: function _getSubLayerAccessors() {
|
|
242
|
+
return {
|
|
243
|
+
getRadius: this.state.cpuAggregator.getAccessor('radius', this.props),
|
|
244
|
+
getFillColor: this.state.cpuAggregator.getAccessor('fillColor', this.props)
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}, {
|
|
248
|
+
key: "renderLayers",
|
|
249
|
+
value: function renderLayers() {
|
|
250
|
+
var _ref5 = this.props,
|
|
251
|
+
id = _ref5.id,
|
|
252
|
+
radiusScale = _ref5.radiusScale,
|
|
253
|
+
visible = _ref5.visible,
|
|
254
|
+
opacity = _ref5.opacity,
|
|
255
|
+
pickable = _ref5.pickable,
|
|
256
|
+
autoHighlight = _ref5.autoHighlight,
|
|
257
|
+
highlightColor = _ref5.highlightColor;
|
|
258
|
+
var _ref6 = this.state,
|
|
259
|
+
cpuAggregator = _ref6.cpuAggregator;
|
|
260
|
+
var updateTriggers = this._getSublayerUpdateTriggers();
|
|
261
|
+
var accessors = this._getSubLayerAccessors();
|
|
262
|
+
var distanceScale = getDistanceScales(this.context.viewport);
|
|
263
|
+
var metersPerPixel = distanceScale.metersPerPixel[0];
|
|
264
|
+
|
|
265
|
+
// return props to the sublayer constructor
|
|
266
|
+
return new ScatterplotLayer(_objectSpread({
|
|
267
|
+
id: "".concat(id, "-cluster"),
|
|
268
|
+
data: cpuAggregator.state.layerData.data,
|
|
269
|
+
radiusScale: metersPerPixel * radiusScale,
|
|
270
|
+
visible: visible,
|
|
271
|
+
opacity: opacity,
|
|
272
|
+
pickable: pickable,
|
|
273
|
+
autoHighlight: autoHighlight,
|
|
274
|
+
highlightColor: highlightColor,
|
|
275
|
+
updateTriggers: updateTriggers,
|
|
276
|
+
parameters: {
|
|
277
|
+
depthMask: false
|
|
278
|
+
}
|
|
279
|
+
}, accessors));
|
|
280
|
+
}
|
|
281
|
+
}]);
|
|
282
|
+
}(CompositeLayer);
|
|
283
|
+
export { ClusterLayer as default };
|
|
284
|
+
ClusterLayer.layerName = 'ClusterLayer';
|
|
285
|
+
ClusterLayer.defaultProps = defaultProps;
|
|
286
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb21wb3NpdGVMYXllciIsIlNjYXR0ZXJwbG90TGF5ZXIiLCJnZW9WaWV3cG9ydCIsIkNQVUFnZ3JlZ2F0b3IiLCJkZWZhdWx0Q29sb3JEaW1lbnNpb24iLCJnZXREaW1lbnNpb25TY2FsZSIsImdldERpc3RhbmNlU2NhbGVzIiwibWF4IiwiU0NBTEVfVFlQRVMiLCJERUZBVUxUX0NPTE9SX1JBTkdFIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJDbHVzdGVyQnVpbGRlciIsImdldEdlb0pTT04iLCJkZWZhdWx0UmFkaXVzIiwiY2x1c3RlclJhZGl1cyIsImRlZmF1bHRWYWx1ZSIsImRlZmF1bHRSYWRpdXNSYW5nZSIsImNsdXN0ZXJSYWRpdXNSYW5nZSIsImRlZmF1bHRHZXRDb2xvclZhbHVlIiwicG9pbnRzIiwibGVuZ3RoIiwiZGVmYXVsdEdldFJhZGl1c1ZhbHVlIiwiY2VsbCIsImZpbHRlcmVkUG9pbnRzIiwicHJvY2Vzc0dlb0pTT04iLCJzdGVwIiwicHJvcHMiLCJhZ2dyZWdhdGlvbiIsIl9yZWYiLCJ2aWV3cG9ydCIsImRhdGEiLCJnZXRQb3NpdGlvbiIsImZpbHRlckRhdGEiLCJnZW9KU09OIiwiY2x1c3RlckJ1aWxkZXIiLCJzZXRTdGF0ZSIsImdldENsdXN0ZXJzIiwiX3JlZjIiLCJfY2x1c3RlckJ1aWxkZXIkY2x1c3QiLCJfdGhpcyRzdGF0ZSIsInN0YXRlIiwiem9vbSIsIndpZHRoIiwiaGVpZ2h0IiwibG9uZ2l0dWRlIiwibGF0aXR1ZGUiLCJiYm94IiwiYm91bmRzIiwiY2x1c3RlcnMiLCJjbHVzdGVyc0F0Wm9vbSIsImxheWVyRGF0YSIsImdldFN1YkxheWVyUmFkaXVzIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJsYXllclByb3BzIiwiZ2V0UmFkaXVzVmFsdWUiLCJzY2FsZUZ1bmMiLCJjbHVzdGVyQWdncmVnYXRpb24iLCJrZXkiLCJ1cGRhdGVTdGVwcyIsInRyaWdnZXJzIiwicG9zaXRpb24iLCJwcm9wIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRSYWRpdXNWYWx1ZURvbWFpbiIsImRpbWVuc2lvblVwZGF0ZXIiLCJ2YWx1ZURvbWFpbiIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImNsdXN0ZXJMYXllckRpbWVuc2lvbnMiLCJhY2Nlc3NvciIsIm51bGxWYWx1ZSIsInZhbHVlIiwiZG9tYWluIiwicmFuZ2UiLCJzY2FsZVR5cGUiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZ2V0UGlja2luZ0luZm8iLCJyYWRpdXNWYWx1ZSIsInNjYWxlZFJhZGl1c1ZhbHVlIiwiZGVmYXVsdFByb3BzIiwiY29sb3JEb21haW4iLCJjb2xvclJhbmdlIiwiY29sb3JTY2FsZVR5cGUiLCJxdWFudGl6ZSIsInJhZGl1c1NjYWxlVHlwZSIsInNxcnQiLCJyYWRpdXNSYW5nZSIsInR5cGUiLCJ4IiwiZ2V0Q29sb3JWYWx1ZSIsIkNsdXN0ZXJMYXllciIsIl9Db21wb3NpdGVMYXllciIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJhcmd1bWVudHMiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJpbml0aWFsaXplU3RhdGUiLCJjcHVBZ2dyZWdhdG9yIiwiZGltZW5zaW9ucyIsImFnZ3JlZ2F0b3JTdGF0ZSIsInVwZGF0ZVN0YXRlIiwiX3JlZjMiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwiY29udGV4dCIsIm51bUluc3RhbmNlcyIsImdldE51bUluc3RhbmNlcyIsIl9yZWY0IiwiaW5mbyIsIm9iaiIsIm9iamVjdCIsImRpc3RhbmNlU2NhbGUiLCJtZXRlcnNQZXJQaXhlbCIsIl9nZXRTdWJsYXllclVwZGF0ZVRyaWdnZXJzIiwiZ2V0VXBkYXRlVHJpZ2dlcnMiLCJfZ2V0U3ViTGF5ZXJBY2Nlc3NvcnMiLCJnZXRSYWRpdXMiLCJnZXRBY2Nlc3NvciIsImdldEZpbGxDb2xvciIsInJlbmRlckxheWVycyIsIl9yZWY1IiwiaWQiLCJyYWRpdXNTY2FsZSIsInZpc2libGUiLCJvcGFjaXR5IiwicGlja2FibGUiLCJhdXRvSGlnaGxpZ2h0IiwiaGlnaGxpZ2h0Q29sb3IiLCJfcmVmNiIsInVwZGF0ZVRyaWdnZXJzIiwiYWNjZXNzb3JzIiwiX29iamVjdFNwcmVhZCIsImNvbmNhdCIsInBhcmFtZXRlcnMiLCJkZXB0aE1hc2siLCJkZWZhdWx0IiwibGF5ZXJOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsdXN0ZXItbGF5ZXIvY2x1c3Rlci1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0NvbXBvc2l0ZUxheWVyLCBHZXRQaWNraW5nSW5mb1BhcmFtcywgUGlja2luZ0luZm99IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTY2F0dGVycGxvdExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IENQVUFnZ3JlZ2F0b3IsIHtcbiAgQWdncmVnYXRpb25UeXBlLFxuICBkZWZhdWx0Q29sb3JEaW1lbnNpb24sXG4gIERpbWVuc2lvblR5cGUsXG4gIGdldERpbWVuc2lvblNjYWxlXG59IGZyb20gJy4uL2xheWVyLXV0aWxzL2NwdS1hZ2dyZWdhdG9yJztcbmltcG9ydCB7Z2V0RGlzdGFuY2VTY2FsZXN9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHttYXh9IGZyb20gJ2QzLWFycmF5JztcblxuaW1wb3J0IHtTQ0FMRV9UWVBFUywgREVGQVVMVF9DT0xPUl9SQU5HRSwgTEFZRVJfVklTX0NPTkZJR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBDbHVzdGVyQnVpbGRlciwge2dldEdlb0pTT059IGZyb20gJy4uL2xheWVyLXV0aWxzL2NsdXN0ZXItdXRpbHMnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5jb25zdCBkZWZhdWx0UmFkaXVzID0gTEFZRVJfVklTX0NPTkZJR1MuY2x1c3RlclJhZGl1cy5kZWZhdWx0VmFsdWU7XG5jb25zdCBkZWZhdWx0UmFkaXVzUmFuZ2UgPSBMQVlFUl9WSVNfQ09ORklHUy5jbHVzdGVyUmFkaXVzUmFuZ2UuZGVmYXVsdFZhbHVlO1xuXG5jb25zdCBkZWZhdWx0R2V0Q29sb3JWYWx1ZSA9IChwb2ludHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pID0+IHBvaW50cy5sZW5ndGg7XG5jb25zdCBkZWZhdWx0R2V0UmFkaXVzVmFsdWUgPSAoY2VsbDoge2ZpbHRlcmVkUG9pbnRzPzogdW5rbm93bltdOyBwb2ludHM6IHVua25vd25bXX0pID0+XG4gIGNlbGwuZmlsdGVyZWRQb2ludHMgPyBjZWxsLmZpbHRlcmVkUG9pbnRzLmxlbmd0aCA6IGNlbGwucG9pbnRzLmxlbmd0aDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gcHJvY2Vzc0dlb0pTT04odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGFnZ3JlZ2F0aW9uLCB7dmlld3BvcnR9KSB7XG4gIGNvbnN0IHtkYXRhLCBnZXRQb3NpdGlvbiwgZmlsdGVyRGF0YX0gPSBwcm9wcztcbiAgY29uc3QgZ2VvSlNPTiA9IGdldEdlb0pTT04oZGF0YSwgZ2V0UG9zaXRpb24sIGZpbHRlckRhdGEpO1xuICBjb25zdCBjbHVzdGVyQnVpbGRlciA9IG5ldyBDbHVzdGVyQnVpbGRlcigpO1xuXG4gIHRoaXMuc2V0U3RhdGUoe2dlb0pTT04sIGNsdXN0ZXJCdWlsZGVyfSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIGdldENsdXN0ZXJzKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBhZ2dyZWdhdGlvbiwge3ZpZXdwb3J0fSkge1xuICBjb25zdCB7Z2VvSlNPTiwgY2x1c3RlckJ1aWxkZXJ9ID0gdGhpcy5zdGF0ZTtcbiAgY29uc3Qge2NsdXN0ZXJSYWRpdXMsIHpvb20sIHdpZHRoLCBoZWlnaHR9ID0gcHJvcHM7XG4gIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlfSA9IHZpZXdwb3J0O1xuXG4gIC8vIHpvb20gbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBmb3IgdGhlIGRpZmZlcmVudCBtYXAgdXRpbHMuIEFsc28gaGVscHMgd2l0aCBjYWNoZSBrZXkuXG4gIGNvbnN0IGJib3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbd2lkdGgsIGhlaWdodF0pO1xuICBjb25zdCBjbHVzdGVycyA9IGNsdXN0ZXJCdWlsZGVyPy5jbHVzdGVyc0F0Wm9vbSh7YmJveCwgY2x1c3RlclJhZGl1cywgZ2VvSlNPTiwgem9vbX0pID8/IFtdO1xuXG4gIHRoaXMuc2V0U3RhdGUoe1xuICAgIGxheWVyRGF0YToge2RhdGE6IGNsdXN0ZXJzfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3ViTGF5ZXJSYWRpdXMoXG4gIGRpbWVuc2lvblN0YXRlOiB7c2NhbGVGdW5jOiAodjogbnVtYmVyKSA9PiBudW1iZXJ9LFxuICBkaW1lbnNpb246IERpbWVuc2lvblR5cGUsXG4gIGxheWVyUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICByZXR1cm4gKGNlbGw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogbnVtYmVyID0+IHtcbiAgICBjb25zdCB7Z2V0UmFkaXVzVmFsdWV9ID0gbGF5ZXJQcm9wcztcbiAgICBjb25zdCB7c2NhbGVGdW5jfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIHJldHVybiBzY2FsZUZ1bmMoZ2V0UmFkaXVzVmFsdWUoY2VsbCkpO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgY2x1c3RlckFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUgPSB7XG4gIGtleTogJ3Bvc2l0aW9uJyxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZW9qc29uJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2dldFBvc2l0aW9uJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0UG9zaXRpb24nXG4gICAgICAgIH0sXG4gICAgICAgIGZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBwcm9jZXNzR2VvSlNPTlxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnY2x1c3RlcmluZycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBjbHVzdGVyUmFkaXVzOiB7XG4gICAgICAgICAgcHJvcDogJ2NsdXN0ZXJSYWRpdXMnXG4gICAgICAgIH0sXG4gICAgICAgIHpvb206IHtcbiAgICAgICAgICBwcm9wOiAnem9vbSdcbiAgICAgICAgfSxcbiAgICAgICAgd2lkdGg6IHtcbiAgICAgICAgICBwcm9wOiAnd2lkdGgnXG4gICAgICAgIH0sXG4gICAgICAgIGhlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdoZWlnaHQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRDbHVzdGVyc1xuICAgIH1cbiAgXVxufTtcblxuZnVuY3Rpb24gZ2V0UmFkaXVzVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0UmFkaXVzVmFsdWV9ID0gcHJvcHM7XG4gIGNvbnN0IHtsYXllckRhdGF9ID0gdGhpcy5zdGF0ZTtcblxuICBjb25zdCB2YWx1ZURvbWFpbiA9IFswLCBtYXgobGF5ZXJEYXRhLmRhdGEgYXMgdW5rbm93biBhcyBudW1iZXJbXSwgZ2V0UmFkaXVzVmFsdWUpXTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7dmFsdWVEb21haW59KTtcbn1cblxuY29uc3QgY2x1c3RlckxheWVyRGltZW5zaW9uczogW0RpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiwgRGltZW5zaW9uVHlwZTxudW1iZXI+XSA9IFtcbiAgZGVmYXVsdENvbG9yRGltZW5zaW9uLFxuICB7XG4gICAga2V5OiAncmFkaXVzJyxcbiAgICBhY2Nlc3NvcjogJ2dldFJhZGl1cycsXG4gICAgbnVsbFZhbHVlOiAwLFxuICAgIHVwZGF0ZVN0ZXBzOiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIHByb3A6ICdnZXRSYWRpdXNWYWx1ZScsXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0UmFkaXVzVmFsdWUnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVyOiBnZXRSYWRpdXNWYWx1ZURvbWFpblxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICBkb21haW46IHtwcm9wOiAncmFkaXVzRG9tYWluJ30sXG4gICAgICAgICAgcmFuZ2U6IHtwcm9wOiAncmFkaXVzUmFuZ2UnfSxcbiAgICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAncmFkaXVzU2NhbGVUeXBlJ31cbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU2NhbGVcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldFN1YkxheWVyQWNjZXNzb3I6IGdldFN1YkxheWVyUmFkaXVzLFxuICAgIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwsIGxheWVyUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IHJhZGl1c1ZhbHVlID0gbGF5ZXJQcm9wcy5nZXRSYWRpdXNWYWx1ZShjZWxsKTtcbiAgICAgIGNvbnN0IHtzY2FsZUZ1bmN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgICBjb25zdCBzY2FsZWRSYWRpdXNWYWx1ZSA9IHNjYWxlRnVuYyA/IHNjYWxlRnVuYyhyYWRpdXNWYWx1ZSkgOiByYWRpdXNWYWx1ZTtcblxuICAgICAgcmV0dXJuIHtyYWRpdXNWYWx1ZSwgc2NhbGVkUmFkaXVzVmFsdWV9O1xuICAgIH1cbiAgfVxuXTtcblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbHVzdGVyUmFkaXVzOiBkZWZhdWx0UmFkaXVzLFxuICBjb2xvckRvbWFpbjogbnVsbCxcbiAgY29sb3JSYW5nZTogREVGQVVMVF9DT0xPUl9SQU5HRSxcbiAgY29sb3JTY2FsZVR5cGU6IFNDQUxFX1RZUEVTLnF1YW50aXplLFxuICByYWRpdXNTY2FsZVR5cGU6IFNDQUxFX1RZUEVTLnNxcnQsXG4gIHJhZGl1c1JhbmdlOiBkZWZhdWx0UmFkaXVzUmFuZ2UsXG4gIGdldFBvc2l0aW9uOiB7dHlwZTogJ2FjY2Vzc29yJywgdmFsdWU6IHggPT4geC5wb3NpdGlvbn0sXG4gIGdldENvbG9yVmFsdWU6IHt0eXBlOiAnYWNjZXNzb3InLCB2YWx1ZTogZGVmYXVsdEdldENvbG9yVmFsdWV9LFxuICBnZXRSYWRpdXNWYWx1ZToge3R5cGU6ICdhY2Nlc3NvcicsIHZhbHVlOiBkZWZhdWx0R2V0UmFkaXVzVmFsdWV9XG59O1xuXG5pbnRlcmZhY2UgQ2x1c3RlckxheWVyU3RhdGUge1xuICBjcHVBZ2dyZWdhdG9yOiBDUFVBZ2dyZWdhdG9yO1xuICBhZ2dyZWdhdG9yU3RhdGU6IENQVUFnZ3JlZ2F0b3JbJ3N0YXRlJ107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsdXN0ZXJMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyIHtcbiAgaW5pdGlhbGl6ZVN0YXRlKCkge1xuICAgIGNvbnN0IGNwdUFnZ3JlZ2F0b3IgPSBuZXcgQ1BVQWdncmVnYXRvcih7XG4gICAgICBhZ2dyZWdhdGlvbjogY2x1c3RlckFnZ3JlZ2F0aW9uLFxuICAgICAgZGltZW5zaW9uczogY2x1c3RlckxheWVyRGltZW5zaW9uc1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNwdUFnZ3JlZ2F0b3IsXG4gICAgICBhZ2dyZWdhdG9yU3RhdGU6IGNwdUFnZ3JlZ2F0b3Iuc3RhdGVcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlU3RhdGUoe1xuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gIH06IHtcbiAgICBvbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjaGFuZ2VGbGFnczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYWdncmVnYXRvclN0YXRlOiAodGhpcy5zdGF0ZSBhcyB1bmtub3duIGFzIENsdXN0ZXJMYXllclN0YXRlKS5jcHVBZ2dyZWdhdG9yLnVwZGF0ZVN0YXRlKFxuICAgICAgICB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30sXG4gICAgICAgIHtcbiAgICAgICAgICB2aWV3cG9ydDogdGhpcy5jb250ZXh0LnZpZXdwb3J0LFxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcHJvcHMgcGFzc2VkIGZvciBpbnRlcm5hbCBjYWxjdWxhdGlvblxuICAgICAgICAgIG51bUluc3RhbmNlczogdGhpcy5nZXROdW1JbnN0YW5jZXMocHJvcHMpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfTogR2V0UGlja2luZ0luZm9QYXJhbXMpOiBQaWNraW5nSW5mbyB7XG4gICAgY29uc3Qgb2JqID0gKHRoaXMuc3RhdGUgYXMgdW5rbm93biBhcyBDbHVzdGVyTGF5ZXJTdGF0ZSkuY3B1QWdncmVnYXRvci5nZXRQaWNraW5nSW5mbyhcbiAgICAgIHtpbmZvfSxcbiAgICAgIHRoaXMucHJvcHNcbiAgICApO1xuICAgIGlmIChvYmo/Lm9iamVjdCkge1xuICAgICAgY29uc3QgZGlzdGFuY2VTY2FsZSA9IGdldERpc3RhbmNlU2NhbGVzKHRoaXMuY29udGV4dC52aWV3cG9ydCk7XG4gICAgICBjb25zdCBtZXRlcnNQZXJQaXhlbCA9IGRpc3RhbmNlU2NhbGUubWV0ZXJzUGVyUGl4ZWxbMF07XG4gICAgICBvYmoub2JqZWN0LnNjYWxlZFJhZGl1c1ZhbHVlID0gb2JqLm9iamVjdC5zY2FsZWRSYWRpdXNWYWx1ZSAqIG1ldGVyc1BlclBpeGVsO1xuICAgIH1cblxuICAgIHJldHVybiBvYmogYXMgUGlja2luZ0luZm87XG4gIH1cblxuICBfZ2V0U3VibGF5ZXJVcGRhdGVUcmlnZ2VycygpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RhdGUgYXMgdW5rbm93biBhcyBDbHVzdGVyTGF5ZXJTdGF0ZSkuY3B1QWdncmVnYXRvci5nZXRVcGRhdGVUcmlnZ2Vycyh0aGlzLnByb3BzKTtcbiAgfVxuXG4gIF9nZXRTdWJMYXllckFjY2Vzc29ycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0UmFkaXVzOiAodGhpcy5zdGF0ZSBhcyB1bmtub3duIGFzIENsdXN0ZXJMYXllclN0YXRlKS5jcHVBZ2dyZWdhdG9yLmdldEFjY2Vzc29yKFxuICAgICAgICAncmFkaXVzJyxcbiAgICAgICAgdGhpcy5wcm9wc1xuICAgICAgKSxcbiAgICAgIGdldEZpbGxDb2xvcjogKHRoaXMuc3RhdGUgYXMgdW5rbm93biBhcyBDbHVzdGVyTGF5ZXJTdGF0ZSkuY3B1QWdncmVnYXRvci5nZXRBY2Nlc3NvcihcbiAgICAgICAgJ2ZpbGxDb2xvcicsXG4gICAgICAgIHRoaXMucHJvcHNcbiAgICAgIClcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyTGF5ZXJzKCkge1xuICAgIGNvbnN0IHtpZCwgcmFkaXVzU2NhbGUsIHZpc2libGUsIG9wYWNpdHksIHBpY2thYmxlLCBhdXRvSGlnaGxpZ2h0LCBoaWdobGlnaHRDb2xvcn0gPSB0aGlzXG4gICAgICAucHJvcHMgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCB7Y3B1QWdncmVnYXRvcn0gPSB0aGlzLnN0YXRlIGFzIHVua25vd24gYXMgQ2x1c3RlckxheWVyU3RhdGU7XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB0aGlzLl9nZXRTdWJsYXllclVwZGF0ZVRyaWdnZXJzKCk7XG4gICAgY29uc3QgYWNjZXNzb3JzID0gdGhpcy5fZ2V0U3ViTGF5ZXJBY2Nlc3NvcnMoKTtcblxuICAgIGNvbnN0IGRpc3RhbmNlU2NhbGUgPSBnZXREaXN0YW5jZVNjYWxlcyh0aGlzLmNvbnRleHQudmlld3BvcnQpO1xuICAgIGNvbnN0IG1ldGVyc1BlclBpeGVsID0gZGlzdGFuY2VTY2FsZS5tZXRlcnNQZXJQaXhlbFswXTtcblxuICAgIC8vIHJldHVybiBwcm9wcyB0byB0aGUgc3VibGF5ZXIgY29uc3RydWN0b3JcbiAgICByZXR1cm4gbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgaWQ6IGAke2lkfS1jbHVzdGVyYCxcbiAgICAgIGRhdGE6IGNwdUFnZ3JlZ2F0b3Iuc3RhdGUubGF5ZXJEYXRhLmRhdGEsXG4gICAgICByYWRpdXNTY2FsZTogbWV0ZXJzUGVyUGl4ZWwgKiByYWRpdXNTY2FsZSxcbiAgICAgIHZpc2libGUsXG4gICAgICBvcGFjaXR5LFxuICAgICAgcGlja2FibGUsXG4gICAgICBhdXRvSGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0Q29sb3IsXG4gICAgICB1cGRhdGVUcmlnZ2VycyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgZGVwdGhNYXNrOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmFjY2Vzc29yc1xuICAgIH0pO1xuICB9XG59XG5cbkNsdXN0ZXJMYXllci5sYXllck5hbWUgPSAnQ2x1c3RlckxheWVyJztcbkNsdXN0ZXJMYXllci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGNBQWMsUUFBMEMsZUFBZTtBQUMvRSxTQUFRQyxnQkFBZ0IsUUFBTyxpQkFBaUI7QUFFaEQsT0FBT0MsV0FBVyxNQUFNLHNCQUFzQjtBQUM5QyxPQUFPQyxhQUFhLElBRWxCQyxxQkFBcUIsRUFFckJDLGlCQUFpQixRQUNaLCtCQUErQjtBQUN0QyxTQUFRQyxpQkFBaUIsUUFBTywyQkFBMkI7QUFDM0QsU0FBUUMsR0FBRyxRQUFPLFVBQVU7QUFFNUIsU0FBUUMsV0FBVyxFQUFFQyxtQkFBbUIsRUFBRUMsaUJBQWlCLFFBQU8sc0JBQXNCO0FBQ3hGLE9BQU9DLGNBQWMsSUFBR0MsVUFBVSxRQUFPLDhCQUE4QjtBQUd2RSxJQUFNQyxhQUFhLEdBQUdILGlCQUFpQixDQUFDSSxhQUFhLENBQUNDLFlBQVk7QUFDbEUsSUFBTUMsa0JBQWtCLEdBQUdOLGlCQUFpQixDQUFDTyxrQkFBa0IsQ0FBQ0YsWUFBWTtBQUU1RSxJQUFNRyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxNQUFpQztFQUFBLE9BQUtBLE1BQU0sQ0FBQ0MsTUFBTTtBQUFBO0FBQ2pGLElBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUlDLElBQXFEO0VBQUEsT0FDbEZBLElBQUksQ0FBQ0MsY0FBYyxHQUFHRCxJQUFJLENBQUNDLGNBQWMsQ0FBQ0gsTUFBTSxHQUFHRSxJQUFJLENBQUNILE1BQU0sQ0FBQ0MsTUFBTTtBQUFBOztBQUV2RTtBQUNBLFNBQVNJLGNBQWNBLENBQXNCQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsV0FBVyxFQUFBQyxJQUFBLEVBQWM7RUFBQSxJQUFYQyxRQUFRLEdBQUFELElBQUEsQ0FBUkMsUUFBUTtFQUM5RSxJQUFPQyxJQUFJLEdBQTZCSixLQUFLLENBQXRDSSxJQUFJO0lBQUVDLFdBQVcsR0FBZ0JMLEtBQUssQ0FBaENLLFdBQVc7SUFBRUMsVUFBVSxHQUFJTixLQUFLLENBQW5CTSxVQUFVO0VBQ3BDLElBQU1DLE9BQU8sR0FBR3JCLFVBQVUsQ0FBQ2tCLElBQUksRUFBRUMsV0FBVyxFQUFFQyxVQUFVLENBQUM7RUFDekQsSUFBTUUsY0FBYyxHQUFHLElBQUl2QixjQUFjLENBQUMsQ0FBQztFQUUzQyxJQUFJLENBQUN3QixRQUFRLENBQUM7SUFBQ0YsT0FBTyxFQUFQQSxPQUFPO0lBQUVDLGNBQWMsRUFBZEE7RUFBYyxDQUFDLENBQUM7QUFDMUM7O0FBRUE7QUFDQSxTQUFTRSxXQUFXQSxDQUFzQlgsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLFdBQVcsRUFBQVUsS0FBQSxFQUFjO0VBQUEsSUFBQUMscUJBQUE7RUFBQSxJQUFYVCxRQUFRLEdBQUFRLEtBQUEsQ0FBUlIsUUFBUTtFQUMzRSxJQUFBVSxXQUFBLEdBQWtDLElBQUksQ0FBQ0MsS0FBSztJQUFyQ1AsT0FBTyxHQUFBTSxXQUFBLENBQVBOLE9BQU87SUFBRUMsY0FBYyxHQUFBSyxXQUFBLENBQWRMLGNBQWM7RUFDOUIsSUFBT3BCLGFBQWEsR0FBeUJZLEtBQUssQ0FBM0NaLGFBQWE7SUFBRTJCLElBQUksR0FBbUJmLEtBQUssQ0FBNUJlLElBQUk7SUFBRUMsS0FBSyxHQUFZaEIsS0FBSyxDQUF0QmdCLEtBQUs7SUFBRUMsTUFBTSxHQUFJakIsS0FBSyxDQUFmaUIsTUFBTTtFQUN6QyxJQUFPQyxTQUFTLEdBQWNmLFFBQVEsQ0FBL0JlLFNBQVM7SUFBRUMsUUFBUSxHQUFJaEIsUUFBUSxDQUFwQmdCLFFBQVE7O0VBRTFCO0VBQ0EsSUFBTUMsSUFBSSxHQUFHNUMsV0FBVyxDQUFDNkMsTUFBTSxDQUFDLENBQUNILFNBQVMsRUFBRUMsUUFBUSxDQUFDLEVBQUVKLElBQUksRUFBRSxDQUFDQyxLQUFLLEVBQUVDLE1BQU0sQ0FBQyxDQUFDO0VBQzdFLElBQU1LLFFBQVEsSUFBQVYscUJBQUEsR0FBR0osY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVlLGNBQWMsQ0FBQztJQUFDSCxJQUFJLEVBQUpBLElBQUk7SUFBRWhDLGFBQWEsRUFBYkEsYUFBYTtJQUFFbUIsT0FBTyxFQUFQQSxPQUFPO0lBQUVRLElBQUksRUFBSkE7RUFBSSxDQUFDLENBQUMsY0FBQUgscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxFQUFFO0VBRTNGLElBQUksQ0FBQ0gsUUFBUSxDQUFDO0lBQ1plLFNBQVMsRUFBRTtNQUFDcEIsSUFBSSxFQUFFa0I7SUFBUTtFQUM1QixDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVNHLGlCQUFpQkEsQ0FDeEJDLGNBQWtELEVBQ2xEQyxTQUF3QixFQUN4QkMsVUFBK0IsRUFDL0I7RUFDQSxPQUFPLFVBQUNoQyxJQUE2QixFQUFhO0lBQ2hELElBQU9pQyxjQUFjLEdBQUlELFVBQVUsQ0FBNUJDLGNBQWM7SUFDckIsSUFBT0MsU0FBUyxHQUFJSixjQUFjLENBQTNCSSxTQUFTO0lBQ2hCLE9BQU9BLFNBQVMsQ0FBQ0QsY0FBYyxDQUFDakMsSUFBSSxDQUFDLENBQUM7RUFDeEMsQ0FBQztBQUNIO0FBRUEsT0FBTyxJQUFNbUMsa0JBQW1DLEdBQUc7RUFDakRDLEdBQUcsRUFBRSxVQUFVO0VBQ2ZDLFdBQVcsRUFBRSxDQUNYO0lBQ0VELEdBQUcsRUFBRSxTQUFTO0lBQ2RFLFFBQVEsRUFBRTtNQUNSQyxRQUFRLEVBQUU7UUFDUkMsSUFBSSxFQUFFLGFBQWE7UUFDbkJDLGFBQWEsRUFBRTtNQUNqQixDQUFDO01BQ0QvQixVQUFVLEVBQUU7UUFDVjhCLElBQUksRUFBRSxZQUFZO1FBQ2xCQyxhQUFhLEVBQUU7TUFDakI7SUFDRixDQUFDO0lBQ0RDLE9BQU8sRUFBRXhDO0VBQ1gsQ0FBQyxFQUNEO0lBQ0VrQyxHQUFHLEVBQUUsWUFBWTtJQUNqQkUsUUFBUSxFQUFFO01BQ1I5QyxhQUFhLEVBQUU7UUFDYmdELElBQUksRUFBRTtNQUNSLENBQUM7TUFDRHJCLElBQUksRUFBRTtRQUNKcUIsSUFBSSxFQUFFO01BQ1IsQ0FBQztNQUNEcEIsS0FBSyxFQUFFO1FBQ0xvQixJQUFJLEVBQUU7TUFDUixDQUFDO01BQ0RuQixNQUFNLEVBQUU7UUFDTm1CLElBQUksRUFBRTtNQUNSO0lBQ0YsQ0FBQztJQUNERSxPQUFPLEVBQUU1QjtFQUNYLENBQUM7QUFFTCxDQUFDO0FBRUQsU0FBUzZCLG9CQUFvQkEsQ0FBc0J4QyxJQUFJLEVBQUVDLEtBQUssRUFBRXdDLGdCQUFnQixFQUFFO0VBQ2hGLElBQU9SLEdBQUcsR0FBSVEsZ0JBQWdCLENBQXZCUixHQUFHO0VBQ1YsSUFBT0gsY0FBYyxHQUFJN0IsS0FBSyxDQUF2QjZCLGNBQWM7RUFDckIsSUFBT0wsU0FBUyxHQUFJLElBQUksQ0FBQ1YsS0FBSyxDQUF2QlUsU0FBUztFQUVoQixJQUFNaUIsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFNUQsR0FBRyxDQUFDMkMsU0FBUyxDQUFDcEIsSUFBSSxFQUF5QnlCLGNBQWMsQ0FBQyxDQUFDO0VBQ25GLElBQUksQ0FBQ2Esa0JBQWtCLENBQUNWLEdBQUcsRUFBRTtJQUFDUyxXQUFXLEVBQVhBO0VBQVcsQ0FBQyxDQUFDO0FBQzdDO0FBRUEsSUFBTUUsc0JBQXlFLEdBQUcsQ0FDaEZqRSxxQkFBcUIsRUFDckI7RUFDRXNELEdBQUcsRUFBRSxRQUFRO0VBQ2JZLFFBQVEsRUFBRSxXQUFXO0VBQ3JCQyxTQUFTLEVBQUUsQ0FBQztFQUNaWixXQUFXLEVBQUUsQ0FDWDtJQUNFRCxHQUFHLEVBQUUsV0FBVztJQUNoQkUsUUFBUSxFQUFFO01BQ1JZLEtBQUssRUFBRTtRQUNMVixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCQyxhQUFhLEVBQUU7TUFDakI7SUFDRixDQUFDO0lBQ0RDLE9BQU8sRUFBRUM7RUFDWCxDQUFDLEVBQ0Q7SUFDRVAsR0FBRyxFQUFFLGNBQWM7SUFDbkJFLFFBQVEsRUFBRTtNQUNSYSxNQUFNLEVBQUU7UUFBQ1gsSUFBSSxFQUFFO01BQWMsQ0FBQztNQUM5QlksS0FBSyxFQUFFO1FBQUNaLElBQUksRUFBRTtNQUFhLENBQUM7TUFDNUJhLFNBQVMsRUFBRTtRQUFDYixJQUFJLEVBQUU7TUFBaUI7SUFDckMsQ0FBQztJQUNERSxPQUFPLEVBQUUzRDtFQUNYLENBQUMsQ0FDRjtFQUNEdUUsbUJBQW1CLEVBQUV6QixpQkFBaUI7RUFDdEMwQixjQUFjLEVBQUUsU0FBaEJBLGNBQWNBLENBQUd6QixjQUFjLEVBQUU5QixJQUFJLEVBQUVnQyxVQUFVLEVBQUs7SUFDcEQsSUFBTXdCLFdBQVcsR0FBR3hCLFVBQVUsQ0FBQ0MsY0FBYyxDQUFDakMsSUFBSSxDQUFDO0lBQ25ELElBQU9rQyxTQUFTLEdBQUlKLGNBQWMsQ0FBM0JJLFNBQVM7SUFDaEIsSUFBTXVCLGlCQUFpQixHQUFHdkIsU0FBUyxHQUFHQSxTQUFTLENBQUNzQixXQUFXLENBQUMsR0FBR0EsV0FBVztJQUUxRSxPQUFPO01BQUNBLFdBQVcsRUFBWEEsV0FBVztNQUFFQyxpQkFBaUIsRUFBakJBO0lBQWlCLENBQUM7RUFDekM7QUFDRixDQUFDLENBQ0Y7QUFFRCxJQUFNQyxZQUFZLEdBQUc7RUFDbkJsRSxhQUFhLEVBQUVELGFBQWE7RUFDNUJvRSxXQUFXLEVBQUUsSUFBSTtFQUNqQkMsVUFBVSxFQUFFekUsbUJBQW1CO0VBQy9CMEUsY0FBYyxFQUFFM0UsV0FBVyxDQUFDNEUsUUFBUTtFQUNwQ0MsZUFBZSxFQUFFN0UsV0FBVyxDQUFDOEUsSUFBSTtFQUNqQ0MsV0FBVyxFQUFFdkUsa0JBQWtCO0VBQy9CZSxXQUFXLEVBQUU7SUFBQ3lELElBQUksRUFBRSxVQUFVO0lBQUVoQixLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBRWlCLENBQUM7TUFBQSxPQUFJQSxDQUFDLENBQUM1QixRQUFRO0lBQUE7RUFBQSxDQUFDO0VBQ3ZENkIsYUFBYSxFQUFFO0lBQUNGLElBQUksRUFBRSxVQUFVO0lBQUVoQixLQUFLLEVBQUV0RDtFQUFvQixDQUFDO0VBQzlEcUMsY0FBYyxFQUFFO0lBQUNpQyxJQUFJLEVBQUUsVUFBVTtJQUFFaEIsS0FBSyxFQUFFbkQ7RUFBcUI7QUFDakUsQ0FBQztBQUFDLElBT21Cc0UsWUFBWSwwQkFBQUMsZUFBQTtFQUFBLFNBQUFELGFBQUE7SUFBQUUsZUFBQSxPQUFBRixZQUFBO0lBQUEsT0FBQUcsVUFBQSxPQUFBSCxZQUFBLEVBQUFJLFNBQUE7RUFBQTtFQUFBQyxTQUFBLENBQUFMLFlBQUEsRUFBQUMsZUFBQTtFQUFBLE9BQUFLLFlBQUEsQ0FBQU4sWUFBQTtJQUFBakMsR0FBQTtJQUFBYyxLQUFBLEVBQy9CLFNBQUEwQixlQUFlQSxDQUFBLEVBQUc7TUFDaEIsSUFBTUMsYUFBYSxHQUFHLElBQUloRyxhQUFhLENBQUM7UUFDdEN3QixXQUFXLEVBQUU4QixrQkFBa0I7UUFDL0IyQyxVQUFVLEVBQUUvQjtNQUNkLENBQUMsQ0FBQztNQUVGLElBQUksQ0FBQzdCLEtBQUssR0FBRztRQUNYMkQsYUFBYSxFQUFiQSxhQUFhO1FBQ2JFLGVBQWUsRUFBRUYsYUFBYSxDQUFDM0Q7TUFDakMsQ0FBQztJQUNIO0VBQUM7SUFBQWtCLEdBQUE7SUFBQWMsS0FBQSxFQUVELFNBQUE4QixXQUFXQSxDQUFBQyxLQUFBLEVBUVI7TUFBQSxJQVBEQyxRQUFRLEdBQUFELEtBQUEsQ0FBUkMsUUFBUTtRQUNSOUUsS0FBSyxHQUFBNkUsS0FBQSxDQUFMN0UsS0FBSztRQUNMK0UsV0FBVyxHQUFBRixLQUFBLENBQVhFLFdBQVc7TUFNWCxJQUFJLENBQUN0RSxRQUFRLENBQUM7UUFDWmtFLGVBQWUsRUFBRyxJQUFJLENBQUM3RCxLQUFLLENBQWtDMkQsYUFBYSxDQUFDRyxXQUFXLENBQ3JGO1VBQUNFLFFBQVEsRUFBUkEsUUFBUTtVQUFFOUUsS0FBSyxFQUFMQSxLQUFLO1VBQUUrRSxXQUFXLEVBQVhBO1FBQVcsQ0FBQyxFQUM5QjtVQUNFNUUsUUFBUSxFQUFFLElBQUksQ0FBQzZFLE9BQU8sQ0FBQzdFLFFBQVE7VUFDL0I7VUFDQThFLFlBQVksRUFBRSxJQUFJLENBQUNDLGVBQWUsQ0FBQ2xGLEtBQUs7UUFDMUMsQ0FDRjtNQUNGLENBQUMsQ0FBQztJQUNKO0VBQUM7SUFBQWdDLEdBQUE7SUFBQWMsS0FBQSxFQUVELFNBQUFLLGNBQWNBLENBQUFnQyxLQUFBLEVBQTRDO01BQUEsSUFBMUNDLElBQUksR0FBQUQsS0FBQSxDQUFKQyxJQUFJO01BQ2xCLElBQU1DLEdBQUcsR0FBSSxJQUFJLENBQUN2RSxLQUFLLENBQWtDMkQsYUFBYSxDQUFDdEIsY0FBYyxDQUNuRjtRQUFDaUMsSUFBSSxFQUFKQTtNQUFJLENBQUMsRUFDTixJQUFJLENBQUNwRixLQUNQLENBQUM7TUFDRCxJQUFJcUYsR0FBRyxhQUFIQSxHQUFHLGVBQUhBLEdBQUcsQ0FBRUMsTUFBTSxFQUFFO1FBQ2YsSUFBTUMsYUFBYSxHQUFHM0csaUJBQWlCLENBQUMsSUFBSSxDQUFDb0csT0FBTyxDQUFDN0UsUUFBUSxDQUFDO1FBQzlELElBQU1xRixjQUFjLEdBQUdELGFBQWEsQ0FBQ0MsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUN0REgsR0FBRyxDQUFDQyxNQUFNLENBQUNqQyxpQkFBaUIsR0FBR2dDLEdBQUcsQ0FBQ0MsTUFBTSxDQUFDakMsaUJBQWlCLEdBQUdtQyxjQUFjO01BQzlFO01BRUEsT0FBT0gsR0FBRztJQUNaO0VBQUM7SUFBQXJELEdBQUE7SUFBQWMsS0FBQSxFQUVELFNBQUEyQywwQkFBMEJBLENBQUEsRUFBRztNQUMzQixPQUFRLElBQUksQ0FBQzNFLEtBQUssQ0FBa0MyRCxhQUFhLENBQUNpQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMxRixLQUFLLENBQUM7SUFDakc7RUFBQztJQUFBZ0MsR0FBQTtJQUFBYyxLQUFBLEVBRUQsU0FBQTZDLHFCQUFxQkEsQ0FBQSxFQUFHO01BQ3RCLE9BQU87UUFDTEMsU0FBUyxFQUFHLElBQUksQ0FBQzlFLEtBQUssQ0FBa0MyRCxhQUFhLENBQUNvQixXQUFXLENBQy9FLFFBQVEsRUFDUixJQUFJLENBQUM3RixLQUNQLENBQUM7UUFDRDhGLFlBQVksRUFBRyxJQUFJLENBQUNoRixLQUFLLENBQWtDMkQsYUFBYSxDQUFDb0IsV0FBVyxDQUNsRixXQUFXLEVBQ1gsSUFBSSxDQUFDN0YsS0FDUDtNQUNGLENBQUM7SUFDSDtFQUFDO0lBQUFnQyxHQUFBO0lBQUFjLEtBQUEsRUFFRCxTQUFBaUQsWUFBWUEsQ0FBQSxFQUFHO01BQ2IsSUFBQUMsS0FBQSxHQUFxRixJQUFJLENBQ3RGaEcsS0FBSztRQUREaUcsRUFBRSxHQUFBRCxLQUFBLENBQUZDLEVBQUU7UUFBRUMsV0FBVyxHQUFBRixLQUFBLENBQVhFLFdBQVc7UUFBRUMsT0FBTyxHQUFBSCxLQUFBLENBQVBHLE9BQU87UUFBRUMsT0FBTyxHQUFBSixLQUFBLENBQVBJLE9BQU87UUFBRUMsUUFBUSxHQUFBTCxLQUFBLENBQVJLLFFBQVE7UUFBRUMsYUFBYSxHQUFBTixLQUFBLENBQWJNLGFBQWE7UUFBRUMsY0FBYyxHQUFBUCxLQUFBLENBQWRPLGNBQWM7TUFFakYsSUFBQUMsS0FBQSxHQUF3QixJQUFJLENBQUMxRixLQUFLO1FBQTNCMkQsYUFBYSxHQUFBK0IsS0FBQSxDQUFiL0IsYUFBYTtNQUNwQixJQUFNZ0MsY0FBYyxHQUFHLElBQUksQ0FBQ2hCLDBCQUEwQixDQUFDLENBQUM7TUFDeEQsSUFBTWlCLFNBQVMsR0FBRyxJQUFJLENBQUNmLHFCQUFxQixDQUFDLENBQUM7TUFFOUMsSUFBTUosYUFBYSxHQUFHM0csaUJBQWlCLENBQUMsSUFBSSxDQUFDb0csT0FBTyxDQUFDN0UsUUFBUSxDQUFDO01BQzlELElBQU1xRixjQUFjLEdBQUdELGFBQWEsQ0FBQ0MsY0FBYyxDQUFDLENBQUMsQ0FBQzs7TUFFdEQ7TUFDQSxPQUFPLElBQUlqSCxnQkFBZ0IsQ0FBQW9JLGFBQUE7UUFDekJWLEVBQUUsS0FBQVcsTUFBQSxDQUFLWCxFQUFFLGFBQVU7UUFDbkI3RixJQUFJLEVBQUVxRSxhQUFhLENBQUMzRCxLQUFLLENBQUNVLFNBQVMsQ0FBQ3BCLElBQUk7UUFDeEM4RixXQUFXLEVBQUVWLGNBQWMsR0FBR1UsV0FBVztRQUN6Q0MsT0FBTyxFQUFQQSxPQUFPO1FBQ1BDLE9BQU8sRUFBUEEsT0FBTztRQUNQQyxRQUFRLEVBQVJBLFFBQVE7UUFDUkMsYUFBYSxFQUFiQSxhQUFhO1FBQ2JDLGNBQWMsRUFBZEEsY0FBYztRQUNkRSxjQUFjLEVBQWRBLGNBQWM7UUFDZEksVUFBVSxFQUFFO1VBQ1ZDLFNBQVMsRUFBRTtRQUNiO01BQUMsR0FDRUosU0FBUyxDQUNiLENBQUM7SUFDSjtFQUFDO0FBQUEsRUEzRnVDcEksY0FBYztBQUFBLFNBQW5DMkYsWUFBWSxJQUFBOEMsT0FBQTtBQThGakM5QyxZQUFZLENBQUMrQyxTQUFTLEdBQUcsY0FBYztBQUN2Qy9DLFlBQVksQ0FBQ1gsWUFBWSxHQUFHQSxZQUFZIiwiaWdub3JlTGlzdCI6W119
|