@flowmap.gl/layers 8.0.0-alpha.1 → 8.0.0-alpha.5

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.
@@ -1,21 +1,24 @@
1
1
  import { CompositeLayer } from '@deck.gl/core';
2
- import { FlowLinesLayerAttributes, FlowMapData, FlowMapDataAccessors, FlowMapDataProvider, LayersData, FlowMapAggregateAccessors } from '@flowmap.gl/data';
3
- import { FlowLayerPickingInfo, LayerProps } from './types';
4
- export declare type FlowMapLayerProps<L, F> = {
5
- data: FlowMapData<L, F> | FlowMapDataProvider<L, F>;
2
+ import { FlowLinesLayerAttributes, FlowmapData, FlowmapDataAccessors, FlowmapDataProvider, LayersData, FlowmapAggregateAccessors } from '@flowmap.gl/data';
3
+ import { FlowmapLayerPickingInfo, LayerProps } from './types';
4
+ export declare type FlowmapLayerProps<L, F> = {
5
+ data: FlowmapData<L, F> | FlowmapDataProvider<L, F>;
6
6
  locationTotalsEnabled?: boolean;
7
7
  adaptiveScalesEnabled?: boolean;
8
8
  animationEnabled?: boolean;
9
9
  clusteringEnabled?: boolean;
10
10
  clusteringLevel?: number;
11
11
  fadeEnabled?: boolean;
12
+ fadeOpacityEnabled?: boolean;
12
13
  clusteringAuto?: boolean;
13
14
  darkMode?: boolean;
14
15
  fadeAmount?: number;
15
16
  colorScheme?: string;
16
- onHover?: (info: FlowLayerPickingInfo<L, F> | undefined, event: SourceEvent) => void;
17
- onClick?: (info: FlowLayerPickingInfo<L, F>, event: SourceEvent) => void;
18
- } & Partial<FlowMapDataAccessors<L, F>> & LayerProps;
17
+ highlightColor?: string;
18
+ maxTopFlowsDisplayNum?: number;
19
+ onHover?: (info: FlowmapLayerPickingInfo<L, F> | undefined, event: SourceEvent) => void;
20
+ onClick?: (info: FlowmapLayerPickingInfo<L, F>, event: SourceEvent) => void;
21
+ } & Partial<FlowmapDataAccessors<L, F>> & LayerProps;
19
22
  declare enum HighlightType {
20
23
  LOCATION = "location",
21
24
  FLOW = "flow"
@@ -31,15 +34,15 @@ declare type HighlightedFlowObject = {
31
34
  };
32
35
  declare type HighlightedObject = HighlightedLocationObject | HighlightedFlowObject;
33
36
  declare type State<L, F> = {
34
- accessors: FlowMapAggregateAccessors<L, F>;
35
- dataProvider: FlowMapDataProvider<L, F>;
37
+ accessors: FlowmapAggregateAccessors<L, F>;
38
+ dataProvider: FlowmapDataProvider<L, F>;
36
39
  layersData: LayersData | undefined;
37
40
  highlightedObject: HighlightedObject | undefined;
38
41
  };
39
42
  export declare type SourceEvent = {
40
43
  srcEvent: MouseEvent;
41
44
  };
42
- export default class FlowMapLayer<L, F> extends CompositeLayer {
45
+ export default class FlowmapLayer<L, F> extends CompositeLayer {
43
46
  static defaultProps: {
44
47
  darkMode: boolean;
45
48
  fadeAmount: number;
@@ -47,13 +50,16 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
47
50
  animationEnabled: boolean;
48
51
  clusteringEnabled: boolean;
49
52
  fadeEnabled: boolean;
53
+ fadeOpacityEnabled: boolean;
50
54
  clusteringAuto: boolean;
51
55
  clusteringLevel: undefined;
52
56
  adaptiveScalesEnabled: boolean;
53
57
  colorScheme: string;
58
+ highlightColor: string;
59
+ maxTopFlowsDisplayNum: number;
54
60
  };
55
61
  state: State<L, F> | undefined;
56
- constructor(props: FlowMapLayerProps<L, F>);
62
+ constructor(props: FlowmapLayerProps<L, F>);
57
63
  initializeState(): void;
58
64
  private _updateAccessors;
59
65
  private _makeDataProvider;
@@ -61,10 +67,10 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
61
67
  shouldUpdateState(params: Record<string, any>): boolean;
62
68
  updateState({ oldProps, props, changeFlags }: Record<string, any>): void;
63
69
  private _getSettingsState;
64
- private _getFlowMapState;
65
- private _getFlowLayerPickingInfo;
70
+ private _getFlowmapState;
71
+ private _getFlowmapLayerPickingInfo;
66
72
  private _getHighlightedObject;
67
73
  renderLayers(): Array<any>;
68
74
  }
69
75
  export {};
70
- //# sourceMappingURL=FlowMapLayer.d.ts.map
76
+ //# sourceMappingURL=FlowmapLayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowmapLayer.d.ts","sourceRoot":"","sources":["../src/FlowmapLayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /*
11
+ * Copyright 2022 FlowmapBlue
12
+ *
13
+ * Licensed under the Apache License, Version 2.0 (the "License");
14
+ * you may not use this file except in compliance with the License.
15
+ * You may obtain a copy of the License at
16
+ *
17
+ * http://www.apache.org/licenses/LICENSE-2.0
18
+ *
19
+ * Unless required by applicable law or agreed to in writing, software
20
+ * distributed under the License is distributed on an "AS IS" BASIS,
21
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
+ * See the License for the specific language governing permissions and
23
+ * limitations under the License.
24
+ *
25
+ */
26
+ import { CompositeLayer } from '@deck.gl/core';
27
+ import { ScatterplotLayer } from '@deck.gl/layers';
28
+ import { colorAsRgba, getFlowLineAttributesByIndex, getFlowmapColors, getOuterCircleRadiusByIndex, getLocationCentroidByIndex, isFlowmapData, isFlowmapDataProvider, LocalFlowmapDataProvider, LocationFilterMode, FlowmapAggregateAccessors, } from '@flowmap.gl/data';
29
+ import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
30
+ import FlowCirclesLayer from './FlowCirclesLayer';
31
+ import FlowLinesLayer from './FlowLinesLayer';
32
+ import { PickingType, } from './types';
33
+ var HighlightType;
34
+ (function (HighlightType) {
35
+ HighlightType["LOCATION"] = "location";
36
+ HighlightType["FLOW"] = "flow";
37
+ })(HighlightType || (HighlightType = {}));
38
+ export default class FlowmapLayer extends CompositeLayer {
39
+ constructor(props) {
40
+ super(Object.assign(Object.assign({}, props), { onHover: (info, event) => {
41
+ // TODO: if (lastHoverEventStartTimeRef > startTime) {
42
+ // // Skipping, because this is not the latest hover event
43
+ // return;
44
+ // }
45
+ this.setState({ highlightedObject: this._getHighlightedObject(info) });
46
+ const { onHover } = props;
47
+ if (onHover) {
48
+ this._getFlowmapLayerPickingInfo(info).then((info) => onHover(info, event));
49
+ }
50
+ }, onClick: (info, event) => {
51
+ const { onClick } = props;
52
+ if (onClick) {
53
+ this._getFlowmapLayerPickingInfo(info).then((info) => {
54
+ if (info) {
55
+ onClick(info, event);
56
+ }
57
+ });
58
+ }
59
+ } }));
60
+ }
61
+ initializeState() {
62
+ this.state = {
63
+ accessors: new FlowmapAggregateAccessors(this.props),
64
+ dataProvider: this._makeDataProvider(),
65
+ layersData: undefined,
66
+ highlightedObject: undefined,
67
+ };
68
+ }
69
+ _updateAccessors() {
70
+ var _a, _b;
71
+ (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.dataProvider) === null || _b === void 0 ? void 0 : _b.setAccessors(this.props);
72
+ this.setState({ accessors: new FlowmapAggregateAccessors(this.props) });
73
+ }
74
+ _makeDataProvider() {
75
+ const { data } = this.props;
76
+ if (isFlowmapDataProvider(data)) {
77
+ return data;
78
+ }
79
+ else if (isFlowmapData(data)) {
80
+ const dataProvider = new LocalFlowmapDataProvider(this.props);
81
+ dataProvider.setFlowmapData(data);
82
+ return dataProvider;
83
+ }
84
+ throw new Error('FlowmapLayer: data must be a FlowmapDataProvider or FlowmapData');
85
+ }
86
+ _updateDataProvider() {
87
+ this.setState({ dataProvider: this._makeDataProvider() });
88
+ }
89
+ shouldUpdateState(params) {
90
+ const { changeFlags } = params;
91
+ // if (this._viewportChanged()) {
92
+ // return true;
93
+ // }
94
+ if (changeFlags.viewportChanged) {
95
+ return true;
96
+ }
97
+ return super.shouldUpdateState(params);
98
+ // TODO: be smarter on when to update
99
+ // (e.g. ignore viewport changes when adaptiveScalesEnabled and clustering are false)
100
+ }
101
+ updateState({ oldProps, props, changeFlags }) {
102
+ const { dataProvider, highlightedObject } = this.state || {};
103
+ if (!dataProvider) {
104
+ return;
105
+ }
106
+ if (changeFlags.propsChanged) {
107
+ this._updateAccessors();
108
+ }
109
+ if (changeFlags.dataChanged) {
110
+ this._updateDataProvider();
111
+ }
112
+ if (changeFlags.viewportChanged || changeFlags.dataChanged) {
113
+ this.setState({
114
+ highlightedObject: undefined,
115
+ });
116
+ }
117
+ if (changeFlags.viewportChanged || changeFlags.propsOrDataChanged) {
118
+ dataProvider.setFlowmapState(this._getFlowmapState());
119
+ (() => __awaiter(this, void 0, void 0, function* () {
120
+ const layersData = yield dataProvider.getLayersData();
121
+ this.setState({ layersData });
122
+ }))();
123
+ }
124
+ }
125
+ _getSettingsState() {
126
+ const { locationTotalsEnabled, adaptiveScalesEnabled, animationEnabled, clusteringEnabled, clusteringLevel, fadeEnabled, fadeOpacityEnabled, clusteringAuto, darkMode, fadeAmount, colorScheme, highlightColor, maxTopFlowsDisplayNum, } = this.props;
127
+ return {
128
+ locationTotalsEnabled,
129
+ adaptiveScalesEnabled,
130
+ animationEnabled,
131
+ clusteringEnabled,
132
+ clusteringLevel,
133
+ fadeEnabled,
134
+ fadeOpacityEnabled,
135
+ clusteringAuto,
136
+ darkMode,
137
+ fadeAmount,
138
+ colorScheme,
139
+ highlightColor,
140
+ maxTopFlowsDisplayNum,
141
+ };
142
+ }
143
+ _getFlowmapState() {
144
+ return {
145
+ viewport: asViewState(this.context.viewport),
146
+ filterState: {
147
+ selectedLocations: undefined,
148
+ locationFilterMode: LocationFilterMode.ALL,
149
+ selectedTimeRange: undefined,
150
+ },
151
+ settingsState: this._getSettingsState(),
152
+ };
153
+ }
154
+ _getFlowmapLayerPickingInfo(info) {
155
+ var _a;
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ const { index, sourceLayer } = info;
158
+ const { dataProvider, accessors } = this.state || {};
159
+ if (!dataProvider || !accessors) {
160
+ return undefined;
161
+ }
162
+ const commonInfo = {
163
+ // ...info,
164
+ layer: info.layer,
165
+ index: info.index,
166
+ x: info.x,
167
+ y: info.y,
168
+ coordinate: info.coordinate,
169
+ };
170
+ if (sourceLayer instanceof FlowLinesLayer ||
171
+ sourceLayer instanceof AnimatedFlowLinesLayer) {
172
+ const flow = index === -1 ? undefined : yield dataProvider.getFlowByIndex(index);
173
+ if (flow) {
174
+ const origin = yield dataProvider.getLocationById(accessors.getFlowOriginId(flow));
175
+ const dest = yield dataProvider.getLocationById(accessors.getFlowDestId(flow));
176
+ if (origin && dest) {
177
+ return Object.assign(Object.assign({}, commonInfo), { type: PickingType.FLOW, object: flow, origin: origin, dest: dest, count: accessors.getFlowMagnitude(flow) });
178
+ }
179
+ }
180
+ }
181
+ else if (sourceLayer instanceof FlowCirclesLayer) {
182
+ const location = index === -1 ? undefined : yield dataProvider.getLocationByIndex(index);
183
+ if (location) {
184
+ const id = accessors.getLocationId(location);
185
+ const name = accessors.getLocationName(location);
186
+ const totals = yield dataProvider.getTotalsForLocation(id);
187
+ const { circleAttributes } = ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) || {};
188
+ if (totals && circleAttributes) {
189
+ const circleRadius = getOuterCircleRadiusByIndex(circleAttributes, info.index);
190
+ return Object.assign(Object.assign({}, commonInfo), { type: PickingType.LOCATION, object: location, id,
191
+ name,
192
+ totals, circleRadius: circleRadius, event: undefined });
193
+ }
194
+ }
195
+ }
196
+ return undefined;
197
+ });
198
+ }
199
+ _getHighlightedObject(info) {
200
+ var _a, _b;
201
+ const { index, sourceLayer } = info;
202
+ if (index < 0)
203
+ return undefined;
204
+ if (sourceLayer instanceof FlowLinesLayer ||
205
+ sourceLayer instanceof AnimatedFlowLinesLayer) {
206
+ const { lineAttributes } = ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) || {};
207
+ if (lineAttributes) {
208
+ let attrs = getFlowLineAttributesByIndex(lineAttributes, index);
209
+ if (this.props.fadeOpacityEnabled) {
210
+ attrs = Object.assign(Object.assign({}, attrs), { attributes: Object.assign(Object.assign({}, attrs.attributes), { getColor: Object.assign(Object.assign({}, attrs.attributes.getColor), { value: new Uint8Array([
211
+ ...attrs.attributes.getColor.value.slice(0, 3),
212
+ 255, // the highlight color should be always opaque
213
+ ]) }) }) });
214
+ }
215
+ return {
216
+ type: HighlightType.FLOW,
217
+ lineAttributes: attrs,
218
+ };
219
+ }
220
+ }
221
+ else if (sourceLayer instanceof FlowCirclesLayer) {
222
+ const { circleAttributes } = ((_b = this.state) === null || _b === void 0 ? void 0 : _b.layersData) || {};
223
+ if (circleAttributes) {
224
+ return {
225
+ type: HighlightType.LOCATION,
226
+ centroid: getLocationCentroidByIndex(circleAttributes, index),
227
+ radius: getOuterCircleRadiusByIndex(circleAttributes, index),
228
+ };
229
+ }
230
+ }
231
+ return undefined;
232
+ }
233
+ renderLayers() {
234
+ var _a;
235
+ const layers = [];
236
+ if ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) {
237
+ const { layersData, highlightedObject } = this.state;
238
+ const { circleAttributes, lineAttributes } = layersData || {};
239
+ if (circleAttributes && lineAttributes) {
240
+ const flowmapColors = getFlowmapColors(this._getSettingsState());
241
+ const outlineColor = colorAsRgba(flowmapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'));
242
+ const commonLineLayerProps = {
243
+ data: lineAttributes,
244
+ parameters: Object.assign(Object.assign({}, this.props.parameters), {
245
+ // prevent z-fighting at non-zero bearing/pitch
246
+ depthTest: false }),
247
+ };
248
+ if (this.props.animationEnabled) {
249
+ layers.push(
250
+ // @ts-ignore
251
+ new AnimatedFlowLinesLayer(Object.assign({}, this.getSubLayerProps(Object.assign(Object.assign({}, commonLineLayerProps), { id: 'animated-flow-lines', drawOutline: false, thicknessUnit: 20 })))));
252
+ }
253
+ else {
254
+ layers.push(new FlowLinesLayer(Object.assign({}, this.getSubLayerProps(Object.assign(Object.assign({}, commonLineLayerProps), { id: 'flow-lines', drawOutline: true, outlineColor: outlineColor })))));
255
+ }
256
+ layers.push(new FlowCirclesLayer(this.getSubLayerProps({
257
+ id: 'circles',
258
+ data: circleAttributes,
259
+ emptyColor: [0, 0, 0, 255],
260
+ emptyOutlineColor: [0, 0, 0, 255],
261
+ })));
262
+ if (highlightedObject) {
263
+ switch (highlightedObject.type) {
264
+ case HighlightType.LOCATION:
265
+ layers.push(new ScatterplotLayer(Object.assign({}, this.getSubLayerProps({
266
+ id: 'location-highlight',
267
+ data: [highlightedObject],
268
+ pickable: false,
269
+ stroked: true,
270
+ filled: false,
271
+ lineWidthUnits: 'pixels',
272
+ getLineWidth: 2,
273
+ radiusUnits: 'pixels',
274
+ getRadius: (d) => d.radius,
275
+ getLineColor: colorAsRgba(this.props.highlightColor),
276
+ getPosition: (d) => d.centroid,
277
+ }))));
278
+ break;
279
+ case HighlightType.FLOW:
280
+ layers.push(new FlowLinesLayer(Object.assign({}, this.getSubLayerProps({
281
+ id: 'flow-highlight',
282
+ data: highlightedObject.lineAttributes,
283
+ drawOutline: true,
284
+ pickable: false,
285
+ outlineColor: colorAsRgba(this.props.highlightColor),
286
+ outlineThickness: 1,
287
+ }))));
288
+ break;
289
+ }
290
+ }
291
+ }
292
+ }
293
+ return layers;
294
+ }
295
+ }
296
+ FlowmapLayer.defaultProps = {
297
+ darkMode: true,
298
+ fadeAmount: 50,
299
+ locationTotalsEnabled: true,
300
+ animationEnabled: false,
301
+ clusteringEnabled: true,
302
+ fadeEnabled: true,
303
+ fadeOpacityEnabled: false,
304
+ clusteringAuto: true,
305
+ clusteringLevel: undefined,
306
+ adaptiveScalesEnabled: true,
307
+ colorScheme: 'Teal',
308
+ highlightColor: 'orange',
309
+ maxTopFlowsDisplayNum: 5000,
310
+ };
311
+ function asViewState(viewport) {
312
+ const { width, height, longitude, latitude, zoom, pitch, bearing } = viewport;
313
+ return {
314
+ width,
315
+ height,
316
+ longitude,
317
+ latitude,
318
+ zoom,
319
+ pitch,
320
+ bearing,
321
+ };
322
+ }
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcExheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBMYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFDTCxXQUFXLEVBS1gsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGFBQWEsRUFDYixxQkFBcUIsRUFFckIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQix5QkFBeUIsR0FDMUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLHNCQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUlMLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQXlCakIsSUFBSyxhQUdKO0FBSEQsV0FBSyxhQUFhO0lBQ2hCLHNDQUFxQixDQUFBO0lBQ3JCLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUF3QkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFtQixTQUFRLGNBQWM7SUFrQjVELFlBQW1CLEtBQThCO1FBQy9DLEtBQUssaUNBQ0EsS0FBSyxLQUNSLE9BQU8sRUFBRSxDQUFDLElBQXNCLEVBQUUsS0FBa0IsRUFBRSxFQUFFO2dCQUN0RCxzREFBc0Q7Z0JBQ3RELDREQUE0RDtnQkFDNUQsWUFBWTtnQkFDWixJQUFJO2dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FB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QUFxQixFQUFFLElBQUk7SUFDM0IsV0FBVyxFQUFFLE1BQU07SUFDbkIsY0FBYyxFQUFFLFFBQVE7SUFDeEIscUJBQXFCLEVBQUUsSUFBSTtDQUM1QixDQUFDO0FBeVdKLFNBQVMsV0FBVyxDQUFDLFFBQTZCO0lBQ2hELE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxRQUFRLENBQUM7SUFDNUUsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNO1FBQ04sU0FBUztRQUNULFFBQVE7UUFDUixJQUFJO1FBQ0osS0FBSztRQUNMLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMiBGbG93bWFwQmx1ZVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqL1xuaW1wb3J0IHtDb21wb3NpdGVMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NjYXR0ZXJwbG90TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBjb2xvckFzUmdiYSxcbiAgRmxvd0xpbmVzTGF5ZXJBdHRyaWJ1dGVzLFxuICBGbG93bWFwRGF0YSxcbiAgRmxvd21hcERhdGFBY2Nlc3NvcnMsXG4gIEZsb3dtYXBEYXRhUHJvdmlkZXIsXG4gIGdldEZsb3dMaW5lQXR0cmlidXRlc0J5SW5kZXgsXG4gIGdldEZsb3dtYXBDb2xvcnMsXG4gIGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleCxcbiAgZ2V0TG9jYXRpb25DZW50cm9pZEJ5SW5kZXgsXG4gIGlzRmxvd21hcERhdGEsXG4gIGlzRmxvd21hcERhdGFQcm92aWRlcixcbiAgTGF5ZXJzRGF0YSxcbiAgTG9jYWxGbG93bWFwRGF0YVByb3ZpZGVyLFxuICBMb2NhdGlvbkZpbHRlck1vZGUsXG4gIFZpZXdwb3J0UHJvcHMsXG4gIEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnMsXG59IGZyb20gJ0BmbG93bWFwLmdsL2RhdGEnO1xuaW1wb3J0IEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9BbmltYXRlZEZsb3dMaW5lc0xheWVyJztcbmltcG9ydCBGbG93Q2lyY2xlc0xheWVyIGZyb20gJy4vRmxvd0NpcmNsZXNMYXllcic7XG5pbXBvcnQgRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9GbG93TGluZXNMYXllcic7XG5pbXBvcnQge1xuICBGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyxcbiAgTGF5ZXJQcm9wcyxcbiAgUGlja2luZ0luZm8sXG4gIFBpY2tpbmdUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmxvd21hcExheWVyUHJvcHM8TCwgRj4gPSB7XG4gIGRhdGE6IEZsb3dtYXBEYXRhPEwsIEY+IHwgRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgbG9jYXRpb25Ub3RhbHNFbmFibGVkPzogYm9vbGVhbjtcbiAgYWRhcHRpdmVTY2FsZXNFbmFibGVkPzogYm9vbGVhbjtcbiAgYW5pbWF0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdFbmFibGVkPzogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0xldmVsPzogbnVtYmVyO1xuICBmYWRlRW5hYmxlZD86IGJvb2xlYW47XG4gIGZhZGVPcGFjaXR5RW5hYmxlZD86IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdBdXRvPzogYm9vbGVhbjtcbiAgZGFya01vZGU/OiBib29sZWFuO1xuICBmYWRlQW1vdW50PzogbnVtYmVyO1xuICBjb2xvclNjaGVtZT86IHN0cmluZztcbiAgaGlnaGxpZ2h0Q29sb3I/OiBzdHJpbmc7XG4gIG1heFRvcEZsb3dzRGlzcGxheU51bT86IG51bWJlcjtcbiAgb25Ib3Zlcj86IChcbiAgICBpbmZvOiBGbG93bWFwTGF5ZXJQaWNraW5nSW5mbzxMLCBGPiB8IHVuZGVmaW5lZCxcbiAgICBldmVudDogU291cmNlRXZlbnQsXG4gICkgPT4gdm9pZDtcbiAgb25DbGljaz86IChpbmZvOiBGbG93bWFwTGF5ZXJQaWNraW5nSW5mbzxMLCBGPiwgZXZlbnQ6IFNvdXJjZUV2ZW50KSA9PiB2b2lkO1xufSAmIFBhcnRpYWw8Rmxvd21hcERhdGFBY2Nlc3NvcnM8TCwgRj4+ICZcbiAgTGF5ZXJQcm9wcztcblxuZW51bSBIaWdobGlnaHRUeXBlIHtcbiAgTE9DQVRJT04gPSAnbG9jYXRpb24nLFxuICBGTE9XID0gJ2Zsb3cnLFxufVxuXG50eXBlIEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QgPSB7XG4gIHR5cGU6IEhpZ2hsaWdodFR5cGUuTE9DQVRJT047XG4gIGNlbnRyb2lkOiBbbnVtYmVyLCBudW1iZXJdO1xuICByYWRpdXM6IG51bWJlcjtcbn07XG5cbnR5cGUgSGlnaGxpZ2h0ZWRGbG93T2JqZWN0ID0ge1xuICB0eXBlOiBIaWdobGlnaHRUeXBlLkZMT1c7XG4gIGxpbmVBdHRyaWJ1dGVzOiBGbG93TGluZXNMYXllckF0dHJpYnV0ZXM7XG59O1xuXG50eXBlIEhpZ2hsaWdodGVkT2JqZWN0ID0gSGlnaGxpZ2h0ZWRMb2NhdGlvbk9iamVjdCB8IEhpZ2hsaWdodGVkRmxvd09iamVjdDtcblxudHlwZSBTdGF0ZTxMLCBGPiA9IHtcbiAgYWNjZXNzb3JzOiBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzPEwsIEY+O1xuICBkYXRhUHJvdmlkZXI6IEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj47XG4gIGxheWVyc0RhdGE6IExheWVyc0RhdGEgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkT2JqZWN0OiBIaWdobGlnaHRlZE9iamVjdCB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUV2ZW50ID0ge3NyY0V2ZW50OiBNb3VzZUV2ZW50fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxvd21hcExheWVyPEwsIEY+IGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXIge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGRhcmtNb2RlOiB0cnVlLFxuICAgIGZhZGVBbW91bnQ6IDUwLFxuICAgIGxvY2F0aW9uVG90YWxzRW5hYmxlZDogdHJ1ZSxcbiAgICBhbmltYXRpb25FbmFibGVkOiBmYWxzZSxcbiAgICBjbHVzdGVyaW5nRW5hYmxlZDogdHJ1ZSxcbiAgICBmYWRlRW5hYmxlZDogdHJ1ZSxcbiAgICBmYWRlT3BhY2l0eUVuYWJsZWQ6IGZhbHNlLFxuICAgIGNsdXN0ZXJpbmdBdXRvOiB0cnVlLFxuICAgIGNsdXN0ZXJpbmdMZXZlbDogdW5kZWZpbmVkLFxuICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBjb2xvclNjaGVtZTogJ1RlYWwnLFxuICAgIGhpZ2hsaWdodENvbG9yOiAnb3JhbmdlJyxcbiAgICBtYXhUb3BGbG93c0Rpc3BsYXlOdW06IDUwMDAsXG4gIH07XG4gIHN0YXRlOiBTdGF0ZTxMLCBGPiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IEZsb3dtYXBMYXllclByb3BzPEwsIEY+KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBvbkhvdmVyOiAoaW5mbzogUGlja2luZ0luZm88YW55PiwgZXZlbnQ6IFNvdXJjZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGlmIChsYXN0SG92ZXJFdmVudFN0YXJ0VGltZVJlZiA+IHN0YXJ0VGltZSkge1xuICAgICAgICAvLyAgIC8vIFNraXBwaW5nLCBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBsYXRlc3QgaG92ZXIgZXZlbnRcbiAgICAgICAgLy8gICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aGlnaGxpZ2h0ZWRPYmplY3Q6IHRoaXMuX2dldEhpZ2hsaWdodGVkT2JqZWN0KGluZm8pfSk7XG4gICAgICAgIGNvbnN0IHtvbkhvdmVyfSA9IHByb3BzO1xuICAgICAgICBpZiAob25Ib3Zlcikge1xuICAgICAgICAgIHRoaXMuX2dldEZsb3dtYXBMYXllclBpY2tpbmdJbmZvKGluZm8pLnRoZW4oKGluZm8pID0+XG4gICAgICAgICAgICBvbkhvdmVyKGluZm8sIGV2ZW50KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DbGljazogKGluZm86IFBpY2tpbmdJbmZvPGFueT4sIGV2ZW50OiBTb3VyY2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB7b25DbGlja30gPSBwcm9wcztcbiAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICB0aGlzLl9nZXRGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyhpbmZvKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgICBvbkNsaWNrKGluZm8sIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWNjZXNzb3JzOiBuZXcgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29yczxMLCBGPih0aGlzLnByb3BzKSxcbiAgICAgIGRhdGFQcm92aWRlcjogdGhpcy5fbWFrZURhdGFQcm92aWRlcigpLFxuICAgICAgbGF5ZXJzRGF0YTogdW5kZWZpbmVkLFxuICAgICAgaGlnaGxpZ2h0ZWRPYmplY3Q6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQWNjZXNzb3JzKCkge1xuICAgIHRoaXMuc3RhdGU/LmRhdGFQcm92aWRlcj8uc2V0QWNjZXNzb3JzKHRoaXMucHJvcHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoe2FjY2Vzc29yczogbmV3IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnModGhpcy5wcm9wcyl9KTtcbiAgfVxuXG4gIHByaXZhdGUgX21ha2VEYXRhUHJvdmlkZXIoKSB7XG4gICAgY29uc3Qge2RhdGF9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoaXNGbG93bWFwRGF0YVByb3ZpZGVyPEwsIEY+KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGVsc2UgaWYgKGlzRmxvd21hcERhdGE8TCwgRj4oZGF0YSkpIHtcbiAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb2NhbEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj4odGhpcy5wcm9wcyk7XG4gICAgICBkYXRhUHJvdmlkZXIuc2V0Rmxvd21hcERhdGEoZGF0YSk7XG4gICAgICByZXR1cm4gZGF0YVByb3ZpZGVyO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnRmxvd21hcExheWVyOiBkYXRhIG11c3QgYmUgYSBGbG93bWFwRGF0YVByb3ZpZGVyIG9yIEZsb3dtYXBEYXRhJyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRGF0YVByb3ZpZGVyKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe2RhdGFQcm92aWRlcjogdGhpcy5fbWFrZURhdGFQcm92aWRlcigpfSk7XG4gIH1cblxuICBzaG91bGRVcGRhdGVTdGF0ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7Y2hhbmdlRmxhZ3N9ID0gcGFyYW1zO1xuICAgIC8vIGlmICh0aGlzLl92aWV3cG9ydENoYW5nZWQoKSkge1xuICAgIC8vICAgcmV0dXJuIHRydWU7XG4gICAgLy8gfVxuICAgIGlmIChjaGFuZ2VGbGFncy52aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2hvdWxkVXBkYXRlU3RhdGUocGFyYW1zKTtcbiAgICAvLyBUT0RPOiBiZSBzbWFydGVyIG9uIHdoZW4gdG8gdXBkYXRlXG4gICAgLy8gKGUuZy4gaWdub3JlIHZpZXdwb3J0IGNoYW5nZXMgd2hlbiBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQgYW5kIGNsdXN0ZXJpbmcgYXJlIGZhbHNlKVxuICB9XG5cbiAgdXBkYXRlU3RhdGUoe29sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3N9OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3Qge2RhdGFQcm92aWRlciwgaGlnaGxpZ2h0ZWRPYmplY3R9ID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICBpZiAoIWRhdGFQcm92aWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VGbGFncy5wcm9wc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUFjY2Vzc29ycygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFQcm92aWRlcigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkIHx8IGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaGlnaGxpZ2h0ZWRPYmplY3Q6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VGbGFncy52aWV3cG9ydENoYW5nZWQgfHwgY2hhbmdlRmxhZ3MucHJvcHNPckRhdGFDaGFuZ2VkKSB7XG4gICAgICBkYXRhUHJvdmlkZXIuc2V0Rmxvd21hcFN0YXRlKHRoaXMuX2dldEZsb3dtYXBTdGF0ZSgpKTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVyc0RhdGEgPSBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TGF5ZXJzRGF0YSgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtsYXllcnNEYXRhfSk7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFNldHRpbmdzU3RhdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbG9jYXRpb25Ub3RhbHNFbmFibGVkLFxuICAgICAgYWRhcHRpdmVTY2FsZXNFbmFibGVkLFxuICAgICAgYW5pbWF0aW9uRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0xldmVsLFxuICAgICAgZmFkZUVuYWJsZWQsXG4gICAgICBmYWRlT3BhY2l0eUVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nQXV0byxcbiAgICAgIGRhcmtNb2RlLFxuICAgICAgZmFkZUFtb3VudCxcbiAgICAgIGNvbG9yU2NoZW1lLFxuICAgICAgaGlnaGxpZ2h0Q29sb3IsXG4gICAgICBtYXhUb3BGbG93c0Rpc3BsYXlOdW0sXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZCxcbiAgICAgIGFuaW1hdGlvbkVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdMZXZlbCxcbiAgICAgIGZhZGVFbmFibGVkLFxuICAgICAgZmFkZU9wYWNpdHlFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0F1dG8sXG4gICAgICBkYXJrTW9kZSxcbiAgICAgIGZhZGVBbW91bnQsXG4gICAgICBjb2xvclNjaGVtZSxcbiAgICAgIGhpZ2hsaWdodENvbG9yLFxuICAgICAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRGbG93bWFwU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdwb3J0OiBhc1ZpZXdTdGF0ZSh0aGlzLmNvbnRleHQudmlld3BvcnQpLFxuICAgICAgZmlsdGVyU3RhdGU6IHtcbiAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYXRpb25GaWx0ZXJNb2RlOiBMb2NhdGlvbkZpbHRlck1vZGUuQUxMLFxuICAgICAgICBzZWxlY3RlZFRpbWVSYW5nZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHNldHRpbmdzU3RhdGU6IHRoaXMuX2dldFNldHRpbmdzU3RhdGUoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0Rmxvd21hcExheWVyUGlja2luZ0luZm8oXG4gICAgaW5mbzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogUHJvbWlzZTxGbG93bWFwTGF5ZXJQaWNraW5nSW5mbzxMLCBGPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHtpbmRleCwgc291cmNlTGF5ZXJ9ID0gaW5mbztcbiAgICBjb25zdCB7ZGF0YVByb3ZpZGVyLCBhY2Nlc3NvcnN9ID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICBpZiAoIWRhdGFQcm92aWRlciB8fCAhYWNjZXNzb3JzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25JbmZvID0ge1xuICAgICAgLy8gLi4uaW5mbyxcbiAgICAgIGxheWVyOiBpbmZvLmxheWVyLFxuICAgICAgaW5kZXg6IGluZm8uaW5kZXgsXG4gICAgICB4OiBpbmZvLngsXG4gICAgICB5OiBpbmZvLnksXG4gICAgICBjb29yZGluYXRlOiBpbmZvLmNvb3JkaW5hdGUsXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBzb3VyY2VMYXllciBpbnN0YW5jZW9mIEZsb3dMaW5lc0xheWVyIHx8XG4gICAgICBzb3VyY2VMYXllciBpbnN0YW5jZW9mIEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IGZsb3cgPVxuICAgICAgICBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0Rmxvd0J5SW5kZXgoaW5kZXgpO1xuICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gYXdhaXQgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJZChcbiAgICAgICAgICBhY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZXN0ID0gYXdhaXQgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJZChcbiAgICAgICAgICBhY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9yaWdpbiAmJiBkZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vbkluZm8sXG4gICAgICAgICAgICB0eXBlOiBQaWNraW5nVHlwZS5GTE9XLFxuICAgICAgICAgICAgb2JqZWN0OiBmbG93LFxuICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgICAgICAgICBkZXN0OiBkZXN0LFxuICAgICAgICAgICAgY291bnQ6IGFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGZsb3cpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0NpcmNsZXNMYXllcikge1xuICAgICAgY29uc3QgbG9jYXRpb24gPVxuICAgICAgICBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUluZGV4KGluZGV4KTtcblxuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBuYW1lID0gYWNjZXNzb3JzLmdldExvY2F0aW9uTmFtZShsb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFscyA9IGF3YWl0IGRhdGFQcm92aWRlci5nZXRUb3RhbHNGb3JMb2NhdGlvbihpZCk7XG4gICAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzfSA9IHRoaXMuc3RhdGU/LmxheWVyc0RhdGEgfHwge307XG4gICAgICAgIGlmICh0b3RhbHMgJiYgY2lyY2xlQXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbnN0IGNpcmNsZVJhZGl1cyA9IGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleChcbiAgICAgICAgICAgIGNpcmNsZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBpbmZvLmluZGV4LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vbkluZm8sXG4gICAgICAgICAgICB0eXBlOiBQaWNraW5nVHlwZS5MT0NBVElPTixcbiAgICAgICAgICAgIG9iamVjdDogbG9jYXRpb24sXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0b3RhbHMsXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IGNpcmNsZVJhZGl1cyxcbiAgICAgICAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIaWdobGlnaHRlZE9iamVjdChcbiAgICBpbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApOiBIaWdobGlnaHRlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qge2luZGV4LCBzb3VyY2VMYXllcn0gPSBpbmZvO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBGbG93TGluZXNMYXllciB8fFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBBbmltYXRlZEZsb3dMaW5lc0xheWVyXG4gICAgKSB7XG4gICAgICBjb25zdCB7bGluZUF0dHJpYnV0ZXN9ID0gdGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChsaW5lQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgYXR0cnMgPSBnZXRGbG93TGluZUF0dHJpYnV0ZXNCeUluZGV4KGxpbmVBdHRyaWJ1dGVzLCBpbmRleCk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmZhZGVPcGFjaXR5RW5hYmxlZCkge1xuICAgICAgICAgIGF0dHJzID0ge1xuICAgICAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIC4uLmF0dHJzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIGdldENvbG9yOiB7XG4gICAgICAgICAgICAgICAgLi4uYXR0cnMuYXR0cmlidXRlcy5nZXRDb2xvcixcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgICAgICAgLi4uYXR0cnMuYXR0cmlidXRlcy5nZXRDb2xvci52YWx1ZS5zbGljZSgwLCAzKSxcbiAgICAgICAgICAgICAgICAgIDI1NSwgLy8gdGhlIGhpZ2hsaWdodCBjb2xvciBzaG91bGQgYmUgYWx3YXlzIG9wYXF1ZVxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSGlnaGxpZ2h0VHlwZS5GTE9XLFxuICAgICAgICAgIGxpbmVBdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0NpcmNsZXNMYXllcikge1xuICAgICAgY29uc3Qge2NpcmNsZUF0dHJpYnV0ZXN9ID0gdGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChjaXJjbGVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSGlnaGxpZ2h0VHlwZS5MT0NBVElPTixcbiAgICAgICAgICBjZW50cm9pZDogZ2V0TG9jYXRpb25DZW50cm9pZEJ5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpLFxuICAgICAgICAgIHJhZGl1czogZ2V0T3V0ZXJDaXJjbGVSYWRpdXNCeUluZGV4KGNpcmNsZUF0dHJpYnV0ZXMsIGluZGV4KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBsYXllcnMgPSBbXTtcbiAgICBpZiAodGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSkge1xuICAgICAgY29uc3Qge2xheWVyc0RhdGEsIGhpZ2hsaWdodGVkT2JqZWN0fSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7Y2lyY2xlQXR0cmlidXRlcywgbGluZUF0dHJpYnV0ZXN9ID0gbGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChjaXJjbGVBdHRyaWJ1dGVzICYmIGxpbmVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IGZsb3dtYXBDb2xvcnMgPSBnZXRGbG93bWFwQ29sb3JzKHRoaXMuX2dldFNldHRpbmdzU3RhdGUoKSk7XG4gICAgICAgIGNvbnN0IG91dGxpbmVDb2xvciA9IGNvbG9yQXNSZ2JhKFxuICAgICAgICAgIGZsb3dtYXBDb2xvcnMub3V0bGluZUNvbG9yIHx8ICh0aGlzLnByb3BzLmRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tbW9uTGluZUxheWVyUHJvcHMgPSB7XG4gICAgICAgICAgZGF0YTogbGluZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgLy8gcHJldmVudCB6LWZpZ2h0aW5nIGF0IG5vbi16ZXJvIGJlYXJpbmcvcGl0Y2hcbiAgICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkxpbmVMYXllclByb3BzLFxuICAgICAgICAgICAgICAgIGlkOiAnYW5pbWF0ZWQtZmxvdy1saW5lcycsXG4gICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzc1VuaXQ6IDIwLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICBuZXcgRmxvd0xpbmVzTGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkxpbmVMYXllclByb3BzLFxuICAgICAgICAgICAgICAgIGlkOiAnZmxvdy1saW5lcycsXG4gICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3V0bGluZUNvbG9yOiBvdXRsaW5lQ29sb3IsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsYXllcnMucHVzaChcbiAgICAgICAgICBuZXcgRmxvd0NpcmNsZXNMYXllcihcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgIGlkOiAnY2lyY2xlcycsXG4gICAgICAgICAgICAgIGRhdGE6IGNpcmNsZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIGVtcHR5Q29sb3I6IFswLCAwLCAwLCAyNTVdLFxuICAgICAgICAgICAgICBlbXB0eU91dGxpbmVDb2xvcjogWzAsIDAsIDAsIDI1NV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZWRPYmplY3QpIHtcbiAgICAgICAgICBzd2l0Y2ggKGhpZ2hsaWdodGVkT2JqZWN0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgSGlnaGxpZ2h0VHlwZS5MT0NBVElPTjpcbiAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdsb2NhdGlvbi1oaWdobGlnaHQnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbaGlnaGxpZ2h0ZWRPYmplY3RdLFxuICAgICAgICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aFVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgICAgICAgICAgICAgZ2V0TGluZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNVbml0czogJ3BpeGVscycsXG4gICAgICAgICAgICAgICAgICAgIGdldFJhZGl1czogKGQ6IEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QpID0+IGQucmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICBnZXRMaW5lQ29sb3I6IGNvbG9yQXNSZ2JhKHRoaXMucHJvcHMuaGlnaGxpZ2h0Q29sb3IpLFxuICAgICAgICAgICAgICAgICAgICBnZXRQb3NpdGlvbjogKGQ6IEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QpID0+IGQuY2VudHJvaWQsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhpZ2hsaWdodFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZsb3dMaW5lc0xheWVyKHtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnZmxvdy1oaWdobGlnaHQnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBoaWdobGlnaHRlZE9iamVjdC5saW5lQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBpY2thYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZUNvbG9yOiBjb2xvckFzUmdiYSh0aGlzLnByb3BzLmhpZ2hsaWdodENvbG9yKSxcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZVRoaWNrbmVzczogMSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzVmlld1N0YXRlKHZpZXdwb3J0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVmlld3BvcnRQcm9wcyB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCBwaXRjaCwgYmVhcmluZ30gPSB2aWV3cG9ydDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlLFxuICAgIHpvb20sXG4gICAgcGl0Y2gsXG4gICAgYmVhcmluZyxcbiAgfTtcbn1cbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { default as AnimatedFlowLinesLayer } from './AnimatedFlowLinesLayer';
2
2
  export { default as FlowLinesLayer } from './FlowLinesLayer';
3
3
  export { default as FlowCirclesLayer } from './FlowCirclesLayer';
4
- export { default as FlowMapLayer } from './FlowMapLayer';
5
- export type { FlowMapLayerProps } from './FlowMapLayer';
4
+ export { default as FlowmapLayer } from './FlowmapLayer';
5
+ export type { FlowmapLayerProps } from './FlowmapLayer';
6
6
  export * from './types';
7
7
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { default as AnimatedFlowLinesLayer } from './AnimatedFlowLinesLayer';
2
2
  export { default as FlowLinesLayer } from './FlowLinesLayer';
3
3
  export { default as FlowCirclesLayer } from './FlowCirclesLayer';
4
- export { default as FlowMapLayer } from './FlowMapLayer';
4
+ export { default as FlowmapLayer } from './FlowmapLayer';
5
5
  export * from './types';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sSUFBSSxzQkFBc0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxPQUFPLElBQUksY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFDLE9BQU8sSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxPQUFPLElBQUksWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkQsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge2RlZmF1bHQgYXMgQW5pbWF0ZWRGbG93TGluZXNMYXllcn0gZnJvbSAnLi9BbmltYXRlZEZsb3dMaW5lc0xheWVyJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBGbG93TGluZXNMYXllcn0gZnJvbSAnLi9GbG93TGluZXNMYXllcic7XG5leHBvcnQge2RlZmF1bHQgYXMgRmxvd0NpcmNsZXNMYXllcn0gZnJvbSAnLi9GbG93Q2lyY2xlc0xheWVyJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBGbG93TWFwTGF5ZXJ9IGZyb20gJy4vRmxvd01hcExheWVyJztcbmV4cG9ydCB0eXBlIHtGbG93TWFwTGF5ZXJQcm9wc30gZnJvbSAnLi9GbG93TWFwTGF5ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sSUFBSSxzQkFBc0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxPQUFPLElBQUksY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFDLE9BQU8sSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxPQUFPLElBQUksWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkQsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge2RlZmF1bHQgYXMgQW5pbWF0ZWRGbG93TGluZXNMYXllcn0gZnJvbSAnLi9BbmltYXRlZEZsb3dMaW5lc0xheWVyJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBGbG93TGluZXNMYXllcn0gZnJvbSAnLi9GbG93TGluZXNMYXllcic7XG5leHBvcnQge2RlZmF1bHQgYXMgRmxvd0NpcmNsZXNMYXllcn0gZnJvbSAnLi9GbG93Q2lyY2xlc0xheWVyJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBGbG93bWFwTGF5ZXJ9IGZyb20gJy4vRmxvd21hcExheWVyJztcbmV4cG9ydCB0eXBlIHtGbG93bWFwTGF5ZXJQcm9wc30gZnJvbSAnLi9GbG93bWFwTGF5ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
package/dist/types.d.ts CHANGED
@@ -27,5 +27,5 @@ export interface FlowPickingInfo<L, F> extends PickingInfo<F | AggregateFlow> {
27
27
  dest: L | ClusterNode;
28
28
  count: number;
29
29
  }
30
- export declare type FlowLayerPickingInfo<L, F> = LocationPickingInfo<L> | FlowPickingInfo<L, F>;
30
+ export declare type FlowmapLayerPickingInfo<L, F> = LocationPickingInfo<L> | FlowPickingInfo<L, F>;
31
31
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,WAAW,EACX,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,oBAAY,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,oBAAY,WAAW;IACrB,QAAQ,aAAa;IACrB,IAAI,SAAS;CAEd;AAED,oBAAY,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC;IAC1E,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,GAAG,aAAa,CAAC;IAC3E,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;IACvB,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC;IACxB,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,oBAAY,oBAAoB,CAAC,CAAC,EAAE,CAAC,IACjC,mBAAmB,CAAC,CAAC,CAAC,GAEtB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,WAAW,EACX,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,oBAAY,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,oBAAY,WAAW;IACrB,QAAQ,aAAa;IACrB,IAAI,SAAS;CAEd;AAED,oBAAY,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC;IAC1E,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,GAAG,aAAa,CAAC;IAC3E,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;IACvB,MAAM,EAAE,CAAC,GAAG,WAAW,CAAC;IACxB,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,oBAAY,uBAAuB,CAAC,CAAC,EAAE,CAAC,IACpC,mBAAmB,CAAC,CAAC,CAAC,GAEtB,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
package/dist/types.js CHANGED
@@ -17,4 +17,4 @@ export var PickingType;
17
17
  // .type === 'FeatureCollection'
18
18
  // );
19
19
  // }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxDQUFOLElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQixvQ0FBcUIsQ0FBQTtJQUNyQiw0QkFBYSxDQUFBO0lBQ2IsbUNBQW1DO0FBQ3JDLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQXVDRCw2REFBNkQ7QUFDN0QsNERBQTREO0FBRTVELDBCQUEwQjtBQUMxQiw0REFBNEQ7QUFDNUQsc0JBQXNCO0FBRXRCLHVDQUF1QztBQUN2QywwQkFBMEI7QUFDMUIsMEVBQTBFO0FBQzFFLGFBQWE7QUFDYiwyRUFBMkU7QUFDM0Usc0NBQXNDO0FBQ3RDLE9BQU87QUFDUCxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWdncmVnYXRlRmxvdyxcbiAgQ2x1c3RlcixcbiAgQ2x1c3Rlck5vZGUsXG4gIExvY2F0aW9uVG90YWxzLFxufSBmcm9tICdAZmxvd21hcC5nbC9kYXRhJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJQcm9wcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgZW51bSBQaWNraW5nVHlwZSB7XG4gIExPQ0FUSU9OID0gJ2xvY2F0aW9uJyxcbiAgRkxPVyA9ICdmbG93JyxcbiAgLy8gTE9DQVRJT05fQVJFQSA9ICdsb2NhdGlvbi1hcmVhJyxcbn1cblxuZXhwb3J0IHR5cGUgRGVja0dMTGF5ZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tpbmdJbmZvPFQ+IHtcbiAgbGF5ZXI6IERlY2tHTExheWVyO1xuICBpbmRleDogbnVtYmVyO1xuICBvYmplY3Q6IFQgfCB1bmRlZmluZWQ7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBjb29yZGluYXRlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uUGlja2luZ0luZm88TD4gZXh0ZW5kcyBQaWNraW5nSW5mbzxMIHwgQ2x1c3Rlck5vZGU+IHtcbiAgdHlwZTogUGlja2luZ1R5cGUuTE9DQVRJT047XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdG90YWxzOiBMb2NhdGlvblRvdGFscztcbiAgY2lyY2xlUmFkaXVzOiBudW1iZXI7XG4gIGV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dQaWNraW5nSW5mbzxMLCBGPiBleHRlbmRzIFBpY2tpbmdJbmZvPEYgfCBBZ2dyZWdhdGVGbG93PiB7XG4gIHR5cGU6IFBpY2tpbmdUeXBlLkZMT1c7XG4gIG9yaWdpbjogTCB8IENsdXN0ZXJOb2RlO1xuICBkZXN0OiBMIHwgQ2x1c3Rlck5vZGU7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25BcmVhUGlja2luZ0luZm8gZXh0ZW5kcyBQaWNraW5nSW5mbzxQaWNraW5nSW5mb0RhdGE+IHtcbi8vICAgdHlwZTogUGlja2luZ1R5cGUuTE9DQVRJT05fQVJFQTtcbi8vICAgb2JqZWN0OiBGbG93TG9jYXRpb247XG4vLyB9XG5cbmV4cG9ydCB0eXBlIEZsb3dMYXllclBpY2tpbmdJbmZvPEwsIEY+ID1cbiAgfCBMb2NhdGlvblBpY2tpbmdJbmZvPEw+XG4gIC8vIHwgTG9jYXRpb25BcmVhUGlja2luZ0luZm9cbiAgfCBGbG93UGlja2luZ0luZm88TCwgRj47XG5cbi8vIGltcG9ydCB7RmVhdHVyZUNvbGxlY3Rpb24sIEdlb21ldHJ5T2JqZWN0fSBmcm9tICdnZW9qc29uJztcbi8vIGV4cG9ydCB0eXBlIExvY2F0aW9uUHJvcGVydGllcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLyBleHBvcnQgdHlwZSBMb2NhdGlvbnMgPVxuLy8gICB8IEZlYXR1cmVDb2xsZWN0aW9uPEdlb21ldHJ5T2JqZWN0LCBMb2NhdGlvblByb3BlcnRpZXM+XG4vLyAgIHwgRmxvd0xvY2F0aW9uW107XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVDb2xsZWN0aW9uKFxuLy8gICBsb2NhdGlvbnM6IExvY2F0aW9ucyxcbi8vICk6IGxvY2F0aW9ucyBpcyBGZWF0dXJlQ29sbGVjdGlvbjxHZW9tZXRyeU9iamVjdCwgTG9jYXRpb25Qcm9wZXJ0aWVzPiB7XG4vLyAgIHJldHVybiAoXG4vLyAgICAgKGxvY2F0aW9ucyBhcyBGZWF0dXJlQ29sbGVjdGlvbjxHZW9tZXRyeU9iamVjdCwgTG9jYXRpb25Qcm9wZXJ0aWVzPilcbi8vICAgICAgIC50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nXG4vLyAgICk7XG4vLyB9XG4iXX0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxDQUFOLElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQixvQ0FBcUIsQ0FBQTtJQUNyQiw0QkFBYSxDQUFBO0lBQ2IsbUNBQW1DO0FBQ3JDLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQXVDRCw2REFBNkQ7QUFDN0QsNERBQTREO0FBRTVELDBCQUEwQjtBQUMxQiw0REFBNEQ7QUFDNUQsc0JBQXNCO0FBRXRCLHVDQUF1QztBQUN2QywwQkFBMEI7QUFDMUIsMEVBQTBFO0FBQzFFLGFBQWE7QUFDYiwyRUFBMkU7QUFDM0Usc0NBQXNDO0FBQ3RDLE9BQU87QUFDUCxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWdncmVnYXRlRmxvdyxcbiAgQ2x1c3RlcixcbiAgQ2x1c3Rlck5vZGUsXG4gIExvY2F0aW9uVG90YWxzLFxufSBmcm9tICdAZmxvd21hcC5nbC9kYXRhJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJQcm9wcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgZW51bSBQaWNraW5nVHlwZSB7XG4gIExPQ0FUSU9OID0gJ2xvY2F0aW9uJyxcbiAgRkxPVyA9ICdmbG93JyxcbiAgLy8gTE9DQVRJT05fQVJFQSA9ICdsb2NhdGlvbi1hcmVhJyxcbn1cblxuZXhwb3J0IHR5cGUgRGVja0dMTGF5ZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tpbmdJbmZvPFQ+IHtcbiAgbGF5ZXI6IERlY2tHTExheWVyO1xuICBpbmRleDogbnVtYmVyO1xuICBvYmplY3Q6IFQgfCB1bmRlZmluZWQ7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBjb29yZGluYXRlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uUGlja2luZ0luZm88TD4gZXh0ZW5kcyBQaWNraW5nSW5mbzxMIHwgQ2x1c3Rlck5vZGU+IHtcbiAgdHlwZTogUGlja2luZ1R5cGUuTE9DQVRJT047XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdG90YWxzOiBMb2NhdGlvblRvdGFscztcbiAgY2lyY2xlUmFkaXVzOiBudW1iZXI7XG4gIGV2ZW50OiBNb3VzZUV2ZW50IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dQaWNraW5nSW5mbzxMLCBGPiBleHRlbmRzIFBpY2tpbmdJbmZvPEYgfCBBZ2dyZWdhdGVGbG93PiB7XG4gIHR5cGU6IFBpY2tpbmdUeXBlLkZMT1c7XG4gIG9yaWdpbjogTCB8IENsdXN0ZXJOb2RlO1xuICBkZXN0OiBMIHwgQ2x1c3Rlck5vZGU7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25BcmVhUGlja2luZ0luZm8gZXh0ZW5kcyBQaWNraW5nSW5mbzxQaWNraW5nSW5mb0RhdGE+IHtcbi8vICAgdHlwZTogUGlja2luZ1R5cGUuTE9DQVRJT05fQVJFQTtcbi8vICAgb2JqZWN0OiBGbG93TG9jYXRpb247XG4vLyB9XG5cbmV4cG9ydCB0eXBlIEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+ID1cbiAgfCBMb2NhdGlvblBpY2tpbmdJbmZvPEw+XG4gIC8vIHwgTG9jYXRpb25BcmVhUGlja2luZ0luZm9cbiAgfCBGbG93UGlja2luZ0luZm88TCwgRj47XG5cbi8vIGltcG9ydCB7RmVhdHVyZUNvbGxlY3Rpb24sIEdlb21ldHJ5T2JqZWN0fSBmcm9tICdnZW9qc29uJztcbi8vIGV4cG9ydCB0eXBlIExvY2F0aW9uUHJvcGVydGllcyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vLyBleHBvcnQgdHlwZSBMb2NhdGlvbnMgPVxuLy8gICB8IEZlYXR1cmVDb2xsZWN0aW9uPEdlb21ldHJ5T2JqZWN0LCBMb2NhdGlvblByb3BlcnRpZXM+XG4vLyAgIHwgRmxvd0xvY2F0aW9uW107XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVDb2xsZWN0aW9uKFxuLy8gICBsb2NhdGlvbnM6IExvY2F0aW9ucyxcbi8vICk6IGxvY2F0aW9ucyBpcyBGZWF0dXJlQ29sbGVjdGlvbjxHZW9tZXRyeU9iamVjdCwgTG9jYXRpb25Qcm9wZXJ0aWVzPiB7XG4vLyAgIHJldHVybiAoXG4vLyAgICAgKGxvY2F0aW9ucyBhcyBGZWF0dXJlQ29sbGVjdGlvbjxHZW9tZXRyeU9iamVjdCwgTG9jYXRpb25Qcm9wZXJ0aWVzPilcbi8vICAgICAgIC50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nXG4vLyAgICk7XG4vLyB9XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowmap.gl/layers",
3
- "version": "8.0.0-alpha.1",
3
+ "version": "8.0.0-alpha.5",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "@luma.gl/constants": "^8.5.10",
19
19
  "@luma.gl/core": "^8.5.10"
20
20
  },
21
- "gitHead": "d67c21d25ba72fe01aa2f4943e9a926d83090c65",
21
+ "gitHead": "301087551f76980d8d366ec6cdc39d8ad6fef2f2",
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  }
@@ -19,51 +19,52 @@ import {ScatterplotLayer} from '@deck.gl/layers';
19
19
  import {
20
20
  colorAsRgba,
21
21
  FlowLinesLayerAttributes,
22
- FlowMapData,
23
- FlowMapDataAccessors,
24
- FlowMapDataProvider,
22
+ FlowmapData,
23
+ FlowmapDataAccessors,
24
+ FlowmapDataProvider,
25
25
  getFlowLineAttributesByIndex,
26
- getFlowMapColors,
26
+ getFlowmapColors,
27
27
  getOuterCircleRadiusByIndex,
28
28
  getLocationCentroidByIndex,
29
- isFlowMapData,
30
- isFlowMapDataProvider,
29
+ isFlowmapData,
30
+ isFlowmapDataProvider,
31
31
  LayersData,
32
- LocalFlowMapDataProvider,
32
+ LocalFlowmapDataProvider,
33
33
  LocationFilterMode,
34
34
  ViewportProps,
35
- FlowMapAggregateAccessors,
36
- ClusterNode,
37
- AggregateFlow,
35
+ FlowmapAggregateAccessors,
38
36
  } from '@flowmap.gl/data';
39
37
  import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
40
38
  import FlowCirclesLayer from './FlowCirclesLayer';
41
39
  import FlowLinesLayer from './FlowLinesLayer';
42
40
  import {
43
- FlowLayerPickingInfo,
41
+ FlowmapLayerPickingInfo,
44
42
  LayerProps,
45
43
  PickingInfo,
46
44
  PickingType,
47
45
  } from './types';
48
46
 
49
- export type FlowMapLayerProps<L, F> = {
50
- data: FlowMapData<L, F> | FlowMapDataProvider<L, F>;
47
+ export type FlowmapLayerProps<L, F> = {
48
+ data: FlowmapData<L, F> | FlowmapDataProvider<L, F>;
51
49
  locationTotalsEnabled?: boolean;
52
50
  adaptiveScalesEnabled?: boolean;
53
51
  animationEnabled?: boolean;
54
52
  clusteringEnabled?: boolean;
55
53
  clusteringLevel?: number;
56
54
  fadeEnabled?: boolean;
55
+ fadeOpacityEnabled?: boolean;
57
56
  clusteringAuto?: boolean;
58
57
  darkMode?: boolean;
59
58
  fadeAmount?: number;
60
59
  colorScheme?: string;
60
+ highlightColor?: string;
61
+ maxTopFlowsDisplayNum?: number;
61
62
  onHover?: (
62
- info: FlowLayerPickingInfo<L, F> | undefined,
63
+ info: FlowmapLayerPickingInfo<L, F> | undefined,
63
64
  event: SourceEvent,
64
65
  ) => void;
65
- onClick?: (info: FlowLayerPickingInfo<L, F>, event: SourceEvent) => void;
66
- } & Partial<FlowMapDataAccessors<L, F>> &
66
+ onClick?: (info: FlowmapLayerPickingInfo<L, F>, event: SourceEvent) => void;
67
+ } & Partial<FlowmapDataAccessors<L, F>> &
67
68
  LayerProps;
68
69
 
69
70
  enum HighlightType {
@@ -85,15 +86,15 @@ type HighlightedFlowObject = {
85
86
  type HighlightedObject = HighlightedLocationObject | HighlightedFlowObject;
86
87
 
87
88
  type State<L, F> = {
88
- accessors: FlowMapAggregateAccessors<L, F>;
89
- dataProvider: FlowMapDataProvider<L, F>;
89
+ accessors: FlowmapAggregateAccessors<L, F>;
90
+ dataProvider: FlowmapDataProvider<L, F>;
90
91
  layersData: LayersData | undefined;
91
92
  highlightedObject: HighlightedObject | undefined;
92
93
  };
93
94
 
94
95
  export type SourceEvent = {srcEvent: MouseEvent};
95
96
 
96
- export default class FlowMapLayer<L, F> extends CompositeLayer {
97
+ export default class FlowmapLayer<L, F> extends CompositeLayer {
97
98
  static defaultProps = {
98
99
  darkMode: true,
99
100
  fadeAmount: 50,
@@ -101,14 +102,17 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
101
102
  animationEnabled: false,
102
103
  clusteringEnabled: true,
103
104
  fadeEnabled: true,
105
+ fadeOpacityEnabled: false,
104
106
  clusteringAuto: true,
105
107
  clusteringLevel: undefined,
106
108
  adaptiveScalesEnabled: true,
107
109
  colorScheme: 'Teal',
110
+ highlightColor: 'orange',
111
+ maxTopFlowsDisplayNum: 5000,
108
112
  };
109
113
  state: State<L, F> | undefined;
110
114
 
111
- public constructor(props: FlowMapLayerProps<L, F>) {
115
+ public constructor(props: FlowmapLayerProps<L, F>) {
112
116
  super({
113
117
  ...props,
114
118
  onHover: (info: PickingInfo<any>, event: SourceEvent) => {
@@ -119,7 +123,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
119
123
  this.setState({highlightedObject: this._getHighlightedObject(info)});
120
124
  const {onHover} = props;
121
125
  if (onHover) {
122
- this._getFlowLayerPickingInfo(info).then((info) =>
126
+ this._getFlowmapLayerPickingInfo(info).then((info) =>
123
127
  onHover(info, event),
124
128
  );
125
129
  }
@@ -127,7 +131,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
127
131
  onClick: (info: PickingInfo<any>, event: SourceEvent) => {
128
132
  const {onClick} = props;
129
133
  if (onClick) {
130
- this._getFlowLayerPickingInfo(info).then((info) => {
134
+ this._getFlowmapLayerPickingInfo(info).then((info) => {
131
135
  if (info) {
132
136
  onClick(info, event);
133
137
  }
@@ -139,7 +143,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
139
143
 
140
144
  initializeState() {
141
145
  this.state = {
142
- accessors: new FlowMapAggregateAccessors<L, F>(this.props),
146
+ accessors: new FlowmapAggregateAccessors<L, F>(this.props),
143
147
  dataProvider: this._makeDataProvider(),
144
148
  layersData: undefined,
145
149
  highlightedObject: undefined,
@@ -148,20 +152,20 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
148
152
 
149
153
  private _updateAccessors() {
150
154
  this.state?.dataProvider?.setAccessors(this.props);
151
- this.setState({accessors: new FlowMapAggregateAccessors(this.props)});
155
+ this.setState({accessors: new FlowmapAggregateAccessors(this.props)});
152
156
  }
153
157
 
154
158
  private _makeDataProvider() {
155
159
  const {data} = this.props;
156
- if (isFlowMapDataProvider<L, F>(data)) {
160
+ if (isFlowmapDataProvider<L, F>(data)) {
157
161
  return data;
158
- } else if (isFlowMapData<L, F>(data)) {
159
- const dataProvider = new LocalFlowMapDataProvider<L, F>(this.props);
160
- dataProvider.setFlowMapData(data);
162
+ } else if (isFlowmapData<L, F>(data)) {
163
+ const dataProvider = new LocalFlowmapDataProvider<L, F>(this.props);
164
+ dataProvider.setFlowmapData(data);
161
165
  return dataProvider;
162
166
  }
163
167
  throw new Error(
164
- 'FlowMapLayer: data must be a FlowMapDataProvider or FlowMapData',
168
+ 'FlowmapLayer: data must be a FlowmapDataProvider or FlowmapData',
165
169
  );
166
170
  }
167
171
 
@@ -201,7 +205,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
201
205
  }
202
206
 
203
207
  if (changeFlags.viewportChanged || changeFlags.propsOrDataChanged) {
204
- dataProvider.setFlowMapState(this._getFlowMapState());
208
+ dataProvider.setFlowmapState(this._getFlowmapState());
205
209
  (async () => {
206
210
  const layersData = await dataProvider.getLayersData();
207
211
  this.setState({layersData});
@@ -217,10 +221,13 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
217
221
  clusteringEnabled,
218
222
  clusteringLevel,
219
223
  fadeEnabled,
224
+ fadeOpacityEnabled,
220
225
  clusteringAuto,
221
226
  darkMode,
222
227
  fadeAmount,
223
228
  colorScheme,
229
+ highlightColor,
230
+ maxTopFlowsDisplayNum,
224
231
  } = this.props;
225
232
  return {
226
233
  locationTotalsEnabled,
@@ -229,14 +236,17 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
229
236
  clusteringEnabled,
230
237
  clusteringLevel,
231
238
  fadeEnabled,
239
+ fadeOpacityEnabled,
232
240
  clusteringAuto,
233
241
  darkMode,
234
242
  fadeAmount,
235
243
  colorScheme,
244
+ highlightColor,
245
+ maxTopFlowsDisplayNum,
236
246
  };
237
247
  }
238
248
 
239
- private _getFlowMapState() {
249
+ private _getFlowmapState() {
240
250
  return {
241
251
  viewport: asViewState(this.context.viewport),
242
252
  filterState: {
@@ -248,9 +258,9 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
248
258
  };
249
259
  }
250
260
 
251
- private async _getFlowLayerPickingInfo(
261
+ private async _getFlowmapLayerPickingInfo(
252
262
  info: Record<string, any>,
253
- ): Promise<FlowLayerPickingInfo<L, F> | undefined> {
263
+ ): Promise<FlowmapLayerPickingInfo<L, F> | undefined> {
254
264
  const {index, sourceLayer} = info;
255
265
  const {dataProvider, accessors} = this.state || {};
256
266
  if (!dataProvider || !accessors) {
@@ -330,9 +340,25 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
330
340
  ) {
331
341
  const {lineAttributes} = this.state?.layersData || {};
332
342
  if (lineAttributes) {
343
+ let attrs = getFlowLineAttributesByIndex(lineAttributes, index);
344
+ if (this.props.fadeOpacityEnabled) {
345
+ attrs = {
346
+ ...attrs,
347
+ attributes: {
348
+ ...attrs.attributes,
349
+ getColor: {
350
+ ...attrs.attributes.getColor,
351
+ value: new Uint8Array([
352
+ ...attrs.attributes.getColor.value.slice(0, 3),
353
+ 255, // the highlight color should be always opaque
354
+ ]),
355
+ },
356
+ },
357
+ };
358
+ }
333
359
  return {
334
360
  type: HighlightType.FLOW,
335
- lineAttributes: getFlowLineAttributesByIndex(lineAttributes, index),
361
+ lineAttributes: attrs,
336
362
  };
337
363
  }
338
364
  } else if (sourceLayer instanceof FlowCirclesLayer) {
@@ -354,9 +380,9 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
354
380
  const {layersData, highlightedObject} = this.state;
355
381
  const {circleAttributes, lineAttributes} = layersData || {};
356
382
  if (circleAttributes && lineAttributes) {
357
- const flowMapColors = getFlowMapColors(this._getSettingsState());
383
+ const flowmapColors = getFlowmapColors(this._getSettingsState());
358
384
  const outlineColor = colorAsRgba(
359
- flowMapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'),
385
+ flowmapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'),
360
386
  );
361
387
  const commonLineLayerProps = {
362
388
  data: lineAttributes,
@@ -405,28 +431,33 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
405
431
  case HighlightType.LOCATION:
406
432
  layers.push(
407
433
  new ScatterplotLayer({
408
- id: 'location-highlight',
409
- data: [highlightedObject],
410
- stroked: true,
411
- filled: false,
412
- lineWidthUnits: 'pixels',
413
- getLineWidth: 2,
414
- radiusUnits: 'pixels',
415
- getRadius: (d: HighlightedLocationObject) => d.radius,
416
- getLineColor: (d: HighlightedLocationObject) =>
417
- colorAsRgba('orange'),
418
- getPosition: (d: HighlightedLocationObject) => d.centroid,
434
+ ...this.getSubLayerProps({
435
+ id: 'location-highlight',
436
+ data: [highlightedObject],
437
+ pickable: false,
438
+ stroked: true,
439
+ filled: false,
440
+ lineWidthUnits: 'pixels',
441
+ getLineWidth: 2,
442
+ radiusUnits: 'pixels',
443
+ getRadius: (d: HighlightedLocationObject) => d.radius,
444
+ getLineColor: colorAsRgba(this.props.highlightColor),
445
+ getPosition: (d: HighlightedLocationObject) => d.centroid,
446
+ }),
419
447
  }),
420
448
  );
421
449
  break;
422
450
  case HighlightType.FLOW:
423
451
  layers.push(
424
452
  new FlowLinesLayer({
425
- id: 'flow-highlight',
426
- data: highlightedObject.lineAttributes,
427
- drawOutline: true,
428
- outlineColor: colorAsRgba('orange'),
429
- outlineThickness: 1,
453
+ ...this.getSubLayerProps({
454
+ id: 'flow-highlight',
455
+ data: highlightedObject.lineAttributes,
456
+ drawOutline: true,
457
+ pickable: false,
458
+ outlineColor: colorAsRgba(this.props.highlightColor),
459
+ outlineThickness: 1,
460
+ }),
430
461
  }),
431
462
  );
432
463
  break;
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export {default as AnimatedFlowLinesLayer} from './AnimatedFlowLinesLayer';
2
2
  export {default as FlowLinesLayer} from './FlowLinesLayer';
3
3
  export {default as FlowCirclesLayer} from './FlowCirclesLayer';
4
- export {default as FlowMapLayer} from './FlowMapLayer';
5
- export type {FlowMapLayerProps} from './FlowMapLayer';
4
+ export {default as FlowmapLayer} from './FlowmapLayer';
5
+ export type {FlowmapLayerProps} from './FlowmapLayer';
6
6
 
7
7
  export * from './types';
package/src/types.ts CHANGED
@@ -45,7 +45,7 @@ export interface FlowPickingInfo<L, F> extends PickingInfo<F | AggregateFlow> {
45
45
  // object: FlowLocation;
46
46
  // }
47
47
 
48
- export type FlowLayerPickingInfo<L, F> =
48
+ export type FlowmapLayerPickingInfo<L, F> =
49
49
  | LocationPickingInfo<L>
50
50
  // | LocationAreaPickingInfo
51
51
  | FlowPickingInfo<L, F>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"FlowMapLayer.d.ts","sourceRoot":"","sources":["../src/FlowMapLayer.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,EAEL,wBAAwB,EACxB,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EAOnB,UAAU,EAIV,yBAAyB,EAG1B,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,oBAAoB,EACpB,UAAU,EAGX,MAAM,SAAS,CAAC;AAEjB,oBAAY,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI;IACpC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CACR,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1E,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACrC,UAAU,CAAC;AAEb,aAAK,aAAa;IAChB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED,aAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,aAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;IACzB,cAAc,EAAE,wBAAwB,CAAC;CAC1C,CAAC;AAEF,aAAK,iBAAiB,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAE3E,aAAK,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI;IACjB,SAAS,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAClD,CAAC;AAEF,oBAAY,WAAW,GAAG;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAC,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,cAAc;IAC5D,MAAM,CAAC,YAAY;;;;;;;;;;;MAWjB;IACF,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;gBAEZ,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IA6BjD,eAAe;IASf,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAI3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAavD,WAAW,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IA2BtE,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,gBAAgB;YAYV,wBAAwB;IAuEtC,OAAO,CAAC,qBAAqB;IA6B7B,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC;CAyF3B"}
@@ -1,308 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- /*
11
- * Copyright 2022 FlowmapBlue
12
- *
13
- * Licensed under the Apache License, Version 2.0 (the "License");
14
- * you may not use this file except in compliance with the License.
15
- * You may obtain a copy of the License at
16
- *
17
- * http://www.apache.org/licenses/LICENSE-2.0
18
- *
19
- * Unless required by applicable law or agreed to in writing, software
20
- * distributed under the License is distributed on an "AS IS" BASIS,
21
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
- * See the License for the specific language governing permissions and
23
- * limitations under the License.
24
- *
25
- */
26
- import { CompositeLayer } from '@deck.gl/core';
27
- import { ScatterplotLayer } from '@deck.gl/layers';
28
- import { colorAsRgba, getFlowLineAttributesByIndex, getFlowMapColors, getOuterCircleRadiusByIndex, getLocationCentroidByIndex, isFlowMapData, isFlowMapDataProvider, LocalFlowMapDataProvider, LocationFilterMode, FlowMapAggregateAccessors, } from '@flowmap.gl/data';
29
- import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
30
- import FlowCirclesLayer from './FlowCirclesLayer';
31
- import FlowLinesLayer from './FlowLinesLayer';
32
- import { PickingType, } from './types';
33
- var HighlightType;
34
- (function (HighlightType) {
35
- HighlightType["LOCATION"] = "location";
36
- HighlightType["FLOW"] = "flow";
37
- })(HighlightType || (HighlightType = {}));
38
- export default class FlowMapLayer extends CompositeLayer {
39
- constructor(props) {
40
- super(Object.assign(Object.assign({}, props), { onHover: (info, event) => {
41
- // TODO: if (lastHoverEventStartTimeRef > startTime) {
42
- // // Skipping, because this is not the latest hover event
43
- // return;
44
- // }
45
- this.setState({ highlightedObject: this._getHighlightedObject(info) });
46
- const { onHover } = props;
47
- if (onHover) {
48
- this._getFlowLayerPickingInfo(info).then((info) => onHover(info, event));
49
- }
50
- }, onClick: (info, event) => {
51
- const { onClick } = props;
52
- if (onClick) {
53
- this._getFlowLayerPickingInfo(info).then((info) => {
54
- if (info) {
55
- onClick(info, event);
56
- }
57
- });
58
- }
59
- } }));
60
- }
61
- initializeState() {
62
- this.state = {
63
- accessors: new FlowMapAggregateAccessors(this.props),
64
- dataProvider: this._makeDataProvider(),
65
- layersData: undefined,
66
- highlightedObject: undefined,
67
- };
68
- }
69
- _updateAccessors() {
70
- var _a, _b;
71
- (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.dataProvider) === null || _b === void 0 ? void 0 : _b.setAccessors(this.props);
72
- this.setState({ accessors: new FlowMapAggregateAccessors(this.props) });
73
- }
74
- _makeDataProvider() {
75
- const { data } = this.props;
76
- if (isFlowMapDataProvider(data)) {
77
- return data;
78
- }
79
- else if (isFlowMapData(data)) {
80
- const dataProvider = new LocalFlowMapDataProvider(this.props);
81
- dataProvider.setFlowMapData(data);
82
- return dataProvider;
83
- }
84
- throw new Error('FlowMapLayer: data must be a FlowMapDataProvider or FlowMapData');
85
- }
86
- _updateDataProvider() {
87
- this.setState({ dataProvider: this._makeDataProvider() });
88
- }
89
- shouldUpdateState(params) {
90
- const { changeFlags } = params;
91
- // if (this._viewportChanged()) {
92
- // return true;
93
- // }
94
- if (changeFlags.viewportChanged) {
95
- return true;
96
- }
97
- return super.shouldUpdateState(params);
98
- // TODO: be smarter on when to update
99
- // (e.g. ignore viewport changes when adaptiveScalesEnabled and clustering are false)
100
- }
101
- updateState({ oldProps, props, changeFlags }) {
102
- const { dataProvider, highlightedObject } = this.state || {};
103
- if (!dataProvider) {
104
- return;
105
- }
106
- if (changeFlags.propsChanged) {
107
- this._updateAccessors();
108
- }
109
- if (changeFlags.dataChanged) {
110
- this._updateDataProvider();
111
- }
112
- if (changeFlags.viewportChanged || changeFlags.dataChanged) {
113
- this.setState({
114
- highlightedObject: undefined,
115
- });
116
- }
117
- if (changeFlags.viewportChanged || changeFlags.propsOrDataChanged) {
118
- dataProvider.setFlowMapState(this._getFlowMapState());
119
- (() => __awaiter(this, void 0, void 0, function* () {
120
- const layersData = yield dataProvider.getLayersData();
121
- this.setState({ layersData });
122
- }))();
123
- }
124
- }
125
- _getSettingsState() {
126
- const { locationTotalsEnabled, adaptiveScalesEnabled, animationEnabled, clusteringEnabled, clusteringLevel, fadeEnabled, clusteringAuto, darkMode, fadeAmount, colorScheme, } = this.props;
127
- return {
128
- locationTotalsEnabled,
129
- adaptiveScalesEnabled,
130
- animationEnabled,
131
- clusteringEnabled,
132
- clusteringLevel,
133
- fadeEnabled,
134
- clusteringAuto,
135
- darkMode,
136
- fadeAmount,
137
- colorScheme,
138
- };
139
- }
140
- _getFlowMapState() {
141
- return {
142
- viewport: asViewState(this.context.viewport),
143
- filterState: {
144
- selectedLocations: undefined,
145
- locationFilterMode: LocationFilterMode.ALL,
146
- selectedTimeRange: undefined,
147
- },
148
- settingsState: this._getSettingsState(),
149
- };
150
- }
151
- _getFlowLayerPickingInfo(info) {
152
- var _a;
153
- return __awaiter(this, void 0, void 0, function* () {
154
- const { index, sourceLayer } = info;
155
- const { dataProvider, accessors } = this.state || {};
156
- if (!dataProvider || !accessors) {
157
- return undefined;
158
- }
159
- const commonInfo = {
160
- // ...info,
161
- layer: info.layer,
162
- index: info.index,
163
- x: info.x,
164
- y: info.y,
165
- coordinate: info.coordinate,
166
- };
167
- if (sourceLayer instanceof FlowLinesLayer ||
168
- sourceLayer instanceof AnimatedFlowLinesLayer) {
169
- const flow = index === -1 ? undefined : yield dataProvider.getFlowByIndex(index);
170
- if (flow) {
171
- const origin = yield dataProvider.getLocationById(accessors.getFlowOriginId(flow));
172
- const dest = yield dataProvider.getLocationById(accessors.getFlowDestId(flow));
173
- if (origin && dest) {
174
- return Object.assign(Object.assign({}, commonInfo), { type: PickingType.FLOW, object: flow, origin: origin, dest: dest, count: accessors.getFlowMagnitude(flow) });
175
- }
176
- }
177
- }
178
- else if (sourceLayer instanceof FlowCirclesLayer) {
179
- const location = index === -1 ? undefined : yield dataProvider.getLocationByIndex(index);
180
- if (location) {
181
- const id = accessors.getLocationId(location);
182
- const name = accessors.getLocationName(location);
183
- const totals = yield dataProvider.getTotalsForLocation(id);
184
- const { circleAttributes } = ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) || {};
185
- if (totals && circleAttributes) {
186
- const circleRadius = getOuterCircleRadiusByIndex(circleAttributes, info.index);
187
- return Object.assign(Object.assign({}, commonInfo), { type: PickingType.LOCATION, object: location, id,
188
- name,
189
- totals, circleRadius: circleRadius, event: undefined });
190
- }
191
- }
192
- }
193
- return undefined;
194
- });
195
- }
196
- _getHighlightedObject(info) {
197
- var _a, _b;
198
- const { index, sourceLayer } = info;
199
- if (index < 0)
200
- return undefined;
201
- if (sourceLayer instanceof FlowLinesLayer ||
202
- sourceLayer instanceof AnimatedFlowLinesLayer) {
203
- const { lineAttributes } = ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) || {};
204
- if (lineAttributes) {
205
- return {
206
- type: HighlightType.FLOW,
207
- lineAttributes: getFlowLineAttributesByIndex(lineAttributes, index),
208
- };
209
- }
210
- }
211
- else if (sourceLayer instanceof FlowCirclesLayer) {
212
- const { circleAttributes } = ((_b = this.state) === null || _b === void 0 ? void 0 : _b.layersData) || {};
213
- if (circleAttributes) {
214
- return {
215
- type: HighlightType.LOCATION,
216
- centroid: getLocationCentroidByIndex(circleAttributes, index),
217
- radius: getOuterCircleRadiusByIndex(circleAttributes, index),
218
- };
219
- }
220
- }
221
- return undefined;
222
- }
223
- renderLayers() {
224
- var _a;
225
- const layers = [];
226
- if ((_a = this.state) === null || _a === void 0 ? void 0 : _a.layersData) {
227
- const { layersData, highlightedObject } = this.state;
228
- const { circleAttributes, lineAttributes } = layersData || {};
229
- if (circleAttributes && lineAttributes) {
230
- const flowMapColors = getFlowMapColors(this._getSettingsState());
231
- const outlineColor = colorAsRgba(flowMapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'));
232
- const commonLineLayerProps = {
233
- data: lineAttributes,
234
- parameters: Object.assign(Object.assign({}, this.props.parameters), {
235
- // prevent z-fighting at non-zero bearing/pitch
236
- depthTest: false }),
237
- };
238
- if (this.props.animationEnabled) {
239
- layers.push(
240
- // @ts-ignore
241
- new AnimatedFlowLinesLayer(Object.assign({}, this.getSubLayerProps(Object.assign(Object.assign({}, commonLineLayerProps), { id: 'animated-flow-lines', drawOutline: false, thicknessUnit: 20 })))));
242
- }
243
- else {
244
- layers.push(new FlowLinesLayer(Object.assign({}, this.getSubLayerProps(Object.assign(Object.assign({}, commonLineLayerProps), { id: 'flow-lines', drawOutline: true, outlineColor: outlineColor })))));
245
- }
246
- layers.push(new FlowCirclesLayer(this.getSubLayerProps({
247
- id: 'circles',
248
- data: circleAttributes,
249
- emptyColor: [0, 0, 0, 255],
250
- emptyOutlineColor: [0, 0, 0, 255],
251
- })));
252
- if (highlightedObject) {
253
- switch (highlightedObject.type) {
254
- case HighlightType.LOCATION:
255
- layers.push(new ScatterplotLayer({
256
- id: 'location-highlight',
257
- data: [highlightedObject],
258
- stroked: true,
259
- filled: false,
260
- lineWidthUnits: 'pixels',
261
- getLineWidth: 2,
262
- radiusUnits: 'pixels',
263
- getRadius: (d) => d.radius,
264
- getLineColor: (d) => colorAsRgba('orange'),
265
- getPosition: (d) => d.centroid,
266
- }));
267
- break;
268
- case HighlightType.FLOW:
269
- layers.push(new FlowLinesLayer({
270
- id: 'flow-highlight',
271
- data: highlightedObject.lineAttributes,
272
- drawOutline: true,
273
- outlineColor: colorAsRgba('orange'),
274
- outlineThickness: 1,
275
- }));
276
- break;
277
- }
278
- }
279
- }
280
- }
281
- return layers;
282
- }
283
- }
284
- FlowMapLayer.defaultProps = {
285
- darkMode: true,
286
- fadeAmount: 50,
287
- locationTotalsEnabled: true,
288
- animationEnabled: false,
289
- clusteringEnabled: true,
290
- fadeEnabled: true,
291
- clusteringAuto: true,
292
- clusteringLevel: undefined,
293
- adaptiveScalesEnabled: true,
294
- colorScheme: 'Teal',
295
- };
296
- function asViewState(viewport) {
297
- const { width, height, longitude, latitude, zoom, pitch, bearing } = viewport;
298
- return {
299
- width,
300
- height,
301
- longitude,
302
- latitude,
303
- zoom,
304
- pitch,
305
- bearing,
306
- };
307
- }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd01hcExheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dNYXBMYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFDTCxXQUFXLEVBS1gsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLGFBQWEsRUFDYixxQkFBcUIsRUFFckIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQix5QkFBeUIsR0FHMUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLHNCQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUlMLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQXNCakIsSUFBSyxhQUdKO0FBSEQsV0FBSyxhQUFhO0lBQ2hCLHNDQUFxQixDQUFBO0lBQ3JCLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUF3QkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFtQixTQUFRLGNBQWM7SUFlNUQsWUFBbUIsS0FBOEI7UUFDL0MsS0FBSyxpQ0FDQSxLQUFLLEtBQ1IsT0FBTyxFQUFFLENBQUMsSUFBc0IsRUFBRSxLQUFrQixFQUFFLEVBQUU7Z0JBQ3RELHNEQUFzRDtnQkFDdEQsNERBQTREO2dCQUM1RCxZQUFZO2dCQUNaLElBQUk7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sRUFBQyxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksT0FBTyxFQUFFO29CQUNYLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNoRCxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUNyQixDQUFDO2lCQUNIO1lBQ0gsQ0FBQyxFQUNELE9BQU8sRUFBRSxDQUFDLElBQXNCLEVBQUUsS0FBa0IsRUFBRSxFQUFFO2dCQUN0RCxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixJQUFJLE9BQU8sRUFBRTtvQkFDWCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2hELElBQUksSUFBSSxFQUFFOzRCQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7eUJBQ3RCO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxJQUNELENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxTQUFTLEVBQUUsSUFBSSx5QkFBeUIsQ0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzFELFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEMsVUFBVSxFQUFFLFNBQVM7WUFDckIsaUJBQWlCLEVBQUUsU0FBUztTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQjs7UUFDdEIsTUFBQSxNQUFBLElBQUksQ0FBQyxLQUFLLDBDQUFFLFlBQVksMENBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUkscUJBQXFCLENBQU8sSUFBSSxDQUFDLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksYUFBYSxDQUFPLElBQUksQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksd0JBQXdCLENBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxZQUFZLENBQUM7U0FDckI7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBMkI7UUFDM0MsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLE1BQU0sQ0FBQztRQUM3QixpQ0FBaUM7UUFDakMsaUJBQWlCO1FBQ2pCLElBQUk7UUFDSixJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLHFDQUFxQztRQUNyQyxxRkFBcUY7SUFDdkYsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFzQjtRQUM3RCxNQUFNLEVBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7UUFDRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLGlCQUFpQixFQUFFLFNBQVM7YUFDN0IsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLGtCQUFrQixFQUFFO1lBQ2pFLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUN0RCxDQUFDLEdBQVMsRUFBRTtnQkFDVixNQUFNLFVBQVUsR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFBLENBQUMsRUFBRSxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sRUFDSixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsRUFDWCxjQUFjLEVBQ2QsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEdBQ1osR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2YsT0FBTztZQUNMLHFCQUFxQjtZQUNyQixxQkFBcUI7WUFDckIsZ0JBQWdCO1lBQ2hCLGlCQUFpQjtZQUNqQixlQUFlO1lBQ2YsV0FBVztZQUNYLGNBQWM7WUFDZCxRQUFRO1lBQ1IsVUFBVTtZQUNWLFdBQVc7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixPQUFPO1lBQ0wsUUFBUSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUM1QyxXQUFXLEVBQUU7Z0JBQ1gsaUJBQWlCLEVBQUUsU0FBUztnQkFDNUIsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsR0FBRztnQkFDMUMsaUJBQWlCLEVBQUUsU0FBUzthQUM3QjtZQUNELGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFYSx3QkFBd0IsQ0FDcEMsSUFBeUI7OztZQUV6QixNQUFNLEVBQUMsS0FBSyxFQUFFLFdBQVcsRUFBQyxHQUFHLElBQUksQ0FBQztZQUNsQyxNQUFNLEVBQUMsWUFBWSxFQUFFLFNBQVMsRUFBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQy9CLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLFdBQVc7Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCLENBQUM7WUFDRixJQUNFLFdBQVcsWUFBWSxjQUFjO2dCQUNyQyxXQUFXLFlBQVksc0JBQXNCLEVBQzdDO2dCQUNBLE1BQU0sSUFBSSxHQUNSLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksSUFBSSxFQUFFO29CQUNSLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLGVBQWUsQ0FDL0MsU0FBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FDaEMsQ0FBQztvQkFDRixNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxlQUFlLENBQzdDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQzlCLENBQUM7b0JBQ0YsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO3dCQUNsQix1Q0FDSyxVQUFVLEtBQ2IsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQ3RCLE1BQU0sRUFBRSxJQUFJLEVBQ1osTUFBTSxFQUFFLE1BQU0sRUFDZCxJQUFJLEVBQUUsSUFBSSxFQUNWLEtBQUssRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQ3ZDO3FCQUNIO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxXQUFXLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ2xELE1BQU0sUUFBUSxHQUNaLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFMUUsSUFBSSxRQUFRLEVBQUU7b0JBQ1osTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDN0MsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNELE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLENBQUEsTUFBQSxJQUFJLENBQUMsS0FBSywwQ0FBRSxVQUFVLEtBQUksRUFBRSxDQUFDO29CQUN4RCxJQUFJLE1BQU0sSUFBSSxnQkFBZ0IsRUFBRTt3QkFDOUIsTUFBTSxZQUFZLEdBQUcsMkJBQTJCLENBQzlDLGdCQUFnQixFQUNoQixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7d0JBQ0YsdUNBQ0ssVUFBVSxLQUNiLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUMxQixNQUFNLEVBQUUsUUFBUSxFQUNoQixFQUFFOzRCQUNGLElBQUk7NEJBQ0osTUFBTSxFQUNOLFlBQVksRUFBRSxZQUFZLEVBQzFCLEtBQUssRUFBRSxTQUFTLElBQ2hCO3FCQUNIO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLFNBQVMsQ0FBQzs7S0FDbEI7SUFFTyxxQkFBcUIsQ0FDM0IsSUFBeUI7O1FBRXpCLE1BQU0sRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNoQyxJQUNFLFdBQVcsWUFBWSxjQUFjO1lBQ3JDLFdBQVcsWUFBWSxzQkFBc0IsRUFDN0M7WUFDQSxNQUFNLEVBQUMsY0FBYyxFQUFDLEdBQUcsQ0FBQSxNQUFBLElBQUksQ0FBQyxLQUFLLDBDQUFFLFVBQVUsS0FBSSxFQUFFLENBQUM7WUFDdEQsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLE9BQU87b0JBQ0wsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO29CQUN4QixjQUFjLEVBQUUsNEJBQTRCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQztpQkFDcEUsQ0FBQzthQUNIO1NBQ0Y7YUFBTSxJQUFJLFdBQVcsWUFBWSxnQkFBZ0IsRUFBRTtZQUNsRCxNQUFNLEVBQUMsZ0JBQWdCLEVBQUMsR0FBRyxDQUFBLE1BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsVUFBVSxLQUFJLEVBQUUsQ0FBQztZQUN4RCxJQUFJLGdCQUFnQixFQUFFO2dCQUNwQixPQUFPO29CQUNMLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUTtvQkFDNUIsUUFBUSxFQUFFLDBCQUEwQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQztvQkFDN0QsTUFBTSxFQUFFLDJCQUEyQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQztpQkFDN0QsQ0FBQzthQUNIO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBWTs7UUFDVixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxNQUFBLElBQUksQ0FBQyxLQUFLLDBDQUFFLFVBQVUsRUFBRTtZQUMxQixNQUFNLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNuRCxNQUFNLEVBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFDLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUM1RCxJQUFJLGdCQUFnQixJQUFJLGNBQWMsRUFBRTtnQkFDdEMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDakUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUM5QixhQUFhLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQ3RFLENBQUM7Z0JBQ0YsTUFBTSxvQkFBb0IsR0FBRztvQkFDM0IsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFVBQVUsa0NBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO3dCQUN4QiwrQ0FBK0M7d0JBQy9DLFNBQVMsRUFBRSxLQUFLLEdBQ2pCO2lCQUNGLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO29CQUMvQixNQUFNLENBQUMsSUFBSTtvQkFDVCxhQUFhO29CQUNiLElBQUksc0JBQXNCLG1CQUNyQixJQUFJLENBQUMsZ0JBQWdCLGlDQUNuQixvQkFBb0IsS0FDdkIsRUFBRSxFQUFFLHFCQUFxQixFQUN6QixXQUFXLEVBQUUsS0FBSyxFQUNsQixhQUFhLEVBQUUsRUFBRSxJQUNqQixFQUNGLENBQ0gsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxNQUFNLENBQUMsSUFBSSxDQUNULElBQUksY0FBYyxtQkFDYixJQUFJLENBQUMsZ0JBQWdCLGlDQUNuQixvQkFBb0IsS0FDdkIsRUFBRSxFQUFFLFlBQVksRUFDaEIsV0FBVyxFQUFFLElBQUksRUFDakIsWUFBWSxFQUFFLFlBQVksSUFDMUIsRUFDRixDQUNILENBQUM7aUJBQ0g7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FDVCxJQUFJLGdCQUFnQixDQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3BCLEVBQUUsRUFBRSxTQUFTO29CQUNiLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztvQkFDMUIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7aUJBQ2xDLENBQUMsQ0FDSCxDQUNGLENBQUM7Z0JBQ0YsSUFBSSxpQkFBaUIsRUFBRTtvQkFDckIsUUFBUSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7d0JBQzlCLEtBQUssYUFBYSxDQUFDLFFBQVE7NEJBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxnQkFBZ0IsQ0FBQztnQ0FDbkIsRUFBRSxFQUFFLG9CQUFvQjtnQ0FDeEIsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0NBQ3pCLE9BQU8sRUFBRSxJQUFJO2dDQUNiLE1BQU0sRUFBRSxLQUFLO2dDQUNiLGNBQWMsRUFBRSxRQUFRO2dDQUN4QixZQUFZLEVBQUUsQ0FBQztnQ0FDZixXQUFXLEVBQUUsUUFBUTtnQ0FDckIsU0FBUyxFQUFFLENBQUMsQ0FBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0NBQ3JELFlBQVksRUFBRSxDQUFDLENBQTRCLEVBQUUsRUFBRSxDQUM3QyxXQUFXLENBQUMsUUFBUSxDQUFDO2dDQUN2QixXQUFXLEVBQUUsQ0FBQyxDQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUTs2QkFDMUQsQ0FBQyxDQUNILENBQUM7NEJBQ0YsTUFBTTt3QkFDUixLQUFLLGFBQWEsQ0FBQyxJQUFJOzRCQUNyQixNQUFNLENBQUMsSUFBSSxDQUNULElBQUksY0FBYyxDQUFDO2dDQUNqQixFQUFFLEVBQUUsZ0JBQWdCO2dDQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsY0FBYztnQ0FDdEMsV0FBVyxFQUFFLElBQUk7Z0NBQ2pCLFlBQVksRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDO2dDQUNuQyxnQkFBZ0IsRUFBRSxDQUFDOzZCQUNwQixDQUFDLENBQ0gsQ0FBQzs0QkFDRixNQUFNO3FCQUNUO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBdFZNLHlCQUFZLEdBQUc7SUFDcEIsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsRUFBRTtJQUNkLHFCQUFxQixFQUFFLElBQUk7SUFDM0IsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLHFCQUFxQixFQUFFLElBQUk7SUFDM0IsV0FBVyxFQUFFLE1BQU07Q0FDcEIsQ0FBQztBQThVSixTQUFTLFdBQVcsQ0FBQyxRQUE2QjtJQUNoRCxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzVFLE9BQU87UUFDTCxLQUFLO1FBQ0wsTUFBTTtRQUNOLFNBQVM7UUFDVCxRQUFRO1FBQ1IsSUFBSTtRQUNKLEtBQUs7UUFDTCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cbmltcG9ydCB7Q29tcG9zaXRlTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTY2F0dGVycGxvdExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgY29sb3JBc1JnYmEsXG4gIEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcyxcbiAgRmxvd01hcERhdGEsXG4gIEZsb3dNYXBEYXRhQWNjZXNzb3JzLFxuICBGbG93TWFwRGF0YVByb3ZpZGVyLFxuICBnZXRGbG93TGluZUF0dHJpYnV0ZXNCeUluZGV4LFxuICBnZXRGbG93TWFwQ29sb3JzLFxuICBnZXRPdXRlckNpcmNsZVJhZGl1c0J5SW5kZXgsXG4gIGdldExvY2F0aW9uQ2VudHJvaWRCeUluZGV4LFxuICBpc0Zsb3dNYXBEYXRhLFxuICBpc0Zsb3dNYXBEYXRhUHJvdmlkZXIsXG4gIExheWVyc0RhdGEsXG4gIExvY2FsRmxvd01hcERhdGFQcm92aWRlcixcbiAgTG9jYXRpb25GaWx0ZXJNb2RlLFxuICBWaWV3cG9ydFByb3BzLFxuICBGbG93TWFwQWdncmVnYXRlQWNjZXNzb3JzLFxuICBDbHVzdGVyTm9kZSxcbiAgQWdncmVnYXRlRmxvdyxcbn0gZnJvbSAnQGZsb3dtYXAuZ2wvZGF0YSc7XG5pbXBvcnQgQW5pbWF0ZWRGbG93TGluZXNMYXllciBmcm9tICcuL0FuaW1hdGVkRmxvd0xpbmVzTGF5ZXInO1xuaW1wb3J0IEZsb3dDaXJjbGVzTGF5ZXIgZnJvbSAnLi9GbG93Q2lyY2xlc0xheWVyJztcbmltcG9ydCBGbG93TGluZXNMYXllciBmcm9tICcuL0Zsb3dMaW5lc0xheWVyJztcbmltcG9ydCB7XG4gIEZsb3dMYXllclBpY2tpbmdJbmZvLFxuICBMYXllclByb3BzLFxuICBQaWNraW5nSW5mbyxcbiAgUGlja2luZ1R5cGUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBGbG93TWFwTGF5ZXJQcm9wczxMLCBGPiA9IHtcbiAgZGF0YTogRmxvd01hcERhdGE8TCwgRj4gfCBGbG93TWFwRGF0YVByb3ZpZGVyPEwsIEY+O1xuICBsb2NhdGlvblRvdGFsc0VuYWJsZWQ/OiBib29sZWFuO1xuICBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQ/OiBib29sZWFuO1xuICBhbmltYXRpb25FbmFibGVkPzogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0VuYWJsZWQ/OiBib29sZWFuO1xuICBjbHVzdGVyaW5nTGV2ZWw/OiBudW1iZXI7XG4gIGZhZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0F1dG8/OiBib29sZWFuO1xuICBkYXJrTW9kZT86IGJvb2xlYW47XG4gIGZhZGVBbW91bnQ/OiBudW1iZXI7XG4gIGNvbG9yU2NoZW1lPzogc3RyaW5nO1xuICBvbkhvdmVyPzogKFxuICAgIGluZm86IEZsb3dMYXllclBpY2tpbmdJbmZvPEwsIEY+IHwgdW5kZWZpbmVkLFxuICAgIGV2ZW50OiBTb3VyY2VFdmVudCxcbiAgKSA9PiB2b2lkO1xuICBvbkNsaWNrPzogKGluZm86IEZsb3dMYXllclBpY2tpbmdJbmZvPEwsIEY+LCBldmVudDogU291cmNlRXZlbnQpID0+IHZvaWQ7XG59ICYgUGFydGlhbDxGbG93TWFwRGF0YUFjY2Vzc29yczxMLCBGPj4gJlxuICBMYXllclByb3BzO1xuXG5lbnVtIEhpZ2hsaWdodFR5cGUge1xuICBMT0NBVElPTiA9ICdsb2NhdGlvbicsXG4gIEZMT1cgPSAnZmxvdycsXG59XG5cbnR5cGUgSGlnaGxpZ2h0ZWRMb2NhdGlvbk9iamVjdCA9IHtcbiAgdHlwZTogSGlnaGxpZ2h0VHlwZS5MT0NBVElPTjtcbiAgY2VudHJvaWQ6IFtudW1iZXIsIG51bWJlcl07XG4gIHJhZGl1czogbnVtYmVyO1xufTtcblxudHlwZSBIaWdobGlnaHRlZEZsb3dPYmplY3QgPSB7XG4gIHR5cGU6IEhpZ2hsaWdodFR5cGUuRkxPVztcbiAgbGluZUF0dHJpYnV0ZXM6IEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcztcbn07XG5cbnR5cGUgSGlnaGxpZ2h0ZWRPYmplY3QgPSBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0IHwgSGlnaGxpZ2h0ZWRGbG93T2JqZWN0O1xuXG50eXBlIFN0YXRlPEwsIEY+ID0ge1xuICBhY2Nlc3NvcnM6IEZsb3dNYXBBZ2dyZWdhdGVBY2Nlc3NvcnM8TCwgRj47XG4gIGRhdGFQcm92aWRlcjogRmxvd01hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgbGF5ZXJzRGF0YTogTGF5ZXJzRGF0YSB8IHVuZGVmaW5lZDtcbiAgaGlnaGxpZ2h0ZWRPYmplY3Q6IEhpZ2hsaWdodGVkT2JqZWN0IHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlRXZlbnQgPSB7c3JjRXZlbnQ6IE1vdXNlRXZlbnR9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbG93TWFwTGF5ZXI8TCwgRj4gZXh0ZW5kcyBDb21wb3NpdGVMYXllciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGFya01vZGU6IHRydWUsXG4gICAgZmFkZUFtb3VudDogNTAsXG4gICAgbG9jYXRpb25Ub3RhbHNFbmFibGVkOiB0cnVlLFxuICAgIGFuaW1hdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIGNsdXN0ZXJpbmdFbmFibGVkOiB0cnVlLFxuICAgIGZhZGVFbmFibGVkOiB0cnVlLFxuICAgIGNsdXN0ZXJpbmdBdXRvOiB0cnVlLFxuICAgIGNsdXN0ZXJpbmdMZXZlbDogdW5kZWZpbmVkLFxuICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBjb2xvclNjaGVtZTogJ1RlYWwnLFxuICB9O1xuICBzdGF0ZTogU3RhdGU8TCwgRj4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBGbG93TWFwTGF5ZXJQcm9wczxMLCBGPikge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgb25Ib3ZlcjogKGluZm86IFBpY2tpbmdJbmZvPGFueT4sIGV2ZW50OiBTb3VyY2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBUT0RPOiBpZiAobGFzdEhvdmVyRXZlbnRTdGFydFRpbWVSZWYgPiBzdGFydFRpbWUpIHtcbiAgICAgICAgLy8gICAvLyBTa2lwcGluZywgYmVjYXVzZSB0aGlzIGlzIG5vdCB0aGUgbGF0ZXN0IGhvdmVyIGV2ZW50XG4gICAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2hpZ2hsaWdodGVkT2JqZWN0OiB0aGlzLl9nZXRIaWdobGlnaHRlZE9iamVjdChpbmZvKX0pO1xuICAgICAgICBjb25zdCB7b25Ib3Zlcn0gPSBwcm9wcztcbiAgICAgICAgaWYgKG9uSG92ZXIpIHtcbiAgICAgICAgICB0aGlzLl9nZXRGbG93TGF5ZXJQaWNraW5nSW5mbyhpbmZvKS50aGVuKChpbmZvKSA9PlxuICAgICAgICAgICAgb25Ib3ZlcihpbmZvLCBldmVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IChpbmZvOiBQaWNraW5nSW5mbzxhbnk+LCBldmVudDogU291cmNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qge29uQ2xpY2t9ID0gcHJvcHM7XG4gICAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0Rmxvd0xheWVyUGlja2luZ0luZm8oaW5mbykudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgICAgb25DbGljayhpbmZvLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBpbml0aWFsaXplU3RhdGUoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjY2Vzc29yczogbmV3IEZsb3dNYXBBZ2dyZWdhdGVBY2Nlc3NvcnM8TCwgRj4odGhpcy5wcm9wcyksXG4gICAgICBkYXRhUHJvdmlkZXI6IHRoaXMuX21ha2VEYXRhUHJvdmlkZXIoKSxcbiAgICAgIGxheWVyc0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGhpZ2hsaWdodGVkT2JqZWN0OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUFjY2Vzc29ycygpIHtcbiAgICB0aGlzLnN0YXRlPy5kYXRhUHJvdmlkZXI/LnNldEFjY2Vzc29ycyh0aGlzLnByb3BzKTtcbiAgICB0aGlzLnNldFN0YXRlKHthY2Nlc3NvcnM6IG5ldyBGbG93TWFwQWdncmVnYXRlQWNjZXNzb3JzKHRoaXMucHJvcHMpfSk7XG4gIH1cblxuICBwcml2YXRlIF9tYWtlRGF0YVByb3ZpZGVyKCkge1xuICAgIGNvbnN0IHtkYXRhfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGlzRmxvd01hcERhdGFQcm92aWRlcjxMLCBGPihkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBlbHNlIGlmIChpc0Zsb3dNYXBEYXRhPEwsIEY+KGRhdGEpKSB7XG4gICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9jYWxGbG93TWFwRGF0YVByb3ZpZGVyPEwsIEY+KHRoaXMucHJvcHMpO1xuICAgICAgZGF0YVByb3ZpZGVyLnNldEZsb3dNYXBEYXRhKGRhdGEpO1xuICAgICAgcmV0dXJuIGRhdGFQcm92aWRlcjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Zsb3dNYXBMYXllcjogZGF0YSBtdXN0IGJlIGEgRmxvd01hcERhdGFQcm92aWRlciBvciBGbG93TWFwRGF0YScsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURhdGFQcm92aWRlcigpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtkYXRhUHJvdmlkZXI6IHRoaXMuX21ha2VEYXRhUHJvdmlkZXIoKX0pO1xuICB9XG5cbiAgc2hvdWxkVXBkYXRlU3RhdGUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3Qge2NoYW5nZUZsYWdzfSA9IHBhcmFtcztcbiAgICAvLyBpZiAodGhpcy5fdmlld3BvcnRDaGFuZ2VkKCkpIHtcbiAgICAvLyAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFVwZGF0ZVN0YXRlKHBhcmFtcyk7XG4gICAgLy8gVE9ETzogYmUgc21hcnRlciBvbiB3aGVuIHRvIHVwZGF0ZVxuICAgIC8vIChlLmcuIGlnbm9yZSB2aWV3cG9ydCBjaGFuZ2VzIHdoZW4gYWRhcHRpdmVTY2FsZXNFbmFibGVkIGFuZCBjbHVzdGVyaW5nIGFyZSBmYWxzZSlcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHtvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzfTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGNvbnN0IHtkYXRhUHJvdmlkZXIsIGhpZ2hsaWdodGVkT2JqZWN0fSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgaWYgKCFkYXRhUHJvdmlkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MucHJvcHNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl91cGRhdGVBY2Nlc3NvcnMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl91cGRhdGVEYXRhUHJvdmlkZXIoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCB8fCBjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGhpZ2hsaWdodGVkT2JqZWN0OiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkIHx8IGNoYW5nZUZsYWdzLnByb3BzT3JEYXRhQ2hhbmdlZCkge1xuICAgICAgZGF0YVByb3ZpZGVyLnNldEZsb3dNYXBTdGF0ZSh0aGlzLl9nZXRGbG93TWFwU3RhdGUoKSk7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsYXllcnNEYXRhID0gYXdhaXQgZGF0YVByb3ZpZGVyLmdldExheWVyc0RhdGEoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bGF5ZXJzRGF0YX0pO1xuICAgICAgfSkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZXR0aW5nc1N0YXRlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZCxcbiAgICAgIGFuaW1hdGlvbkVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdMZXZlbCxcbiAgICAgIGZhZGVFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0F1dG8sXG4gICAgICBkYXJrTW9kZSxcbiAgICAgIGZhZGVBbW91bnQsXG4gICAgICBjb2xvclNjaGVtZSxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb25Ub3RhbHNFbmFibGVkLFxuICAgICAgYWRhcHRpdmVTY2FsZXNFbmFibGVkLFxuICAgICAgYW5pbWF0aW9uRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0xldmVsLFxuICAgICAgZmFkZUVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nQXV0byxcbiAgICAgIGRhcmtNb2RlLFxuICAgICAgZmFkZUFtb3VudCxcbiAgICAgIGNvbG9yU2NoZW1lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRGbG93TWFwU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdwb3J0OiBhc1ZpZXdTdGF0ZSh0aGlzLmNvbnRleHQudmlld3BvcnQpLFxuICAgICAgZmlsdGVyU3RhdGU6IHtcbiAgICAgICAgc2VsZWN0ZWRMb2NhdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYXRpb25GaWx0ZXJNb2RlOiBMb2NhdGlvbkZpbHRlck1vZGUuQUxMLFxuICAgICAgICBzZWxlY3RlZFRpbWVSYW5nZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHNldHRpbmdzU3RhdGU6IHRoaXMuX2dldFNldHRpbmdzU3RhdGUoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0Rmxvd0xheWVyUGlja2luZ0luZm8oXG4gICAgaW5mbzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogUHJvbWlzZTxGbG93TGF5ZXJQaWNraW5nSW5mbzxMLCBGPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHtpbmRleCwgc291cmNlTGF5ZXJ9ID0gaW5mbztcbiAgICBjb25zdCB7ZGF0YVByb3ZpZGVyLCBhY2Nlc3NvcnN9ID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICBpZiAoIWRhdGFQcm92aWRlciB8fCAhYWNjZXNzb3JzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25JbmZvID0ge1xuICAgICAgLy8gLi4uaW5mbyxcbiAgICAgIGxheWVyOiBpbmZvLmxheWVyLFxuICAgICAgaW5kZXg6IGluZm8uaW5kZXgsXG4gICAgICB4OiBpbmZvLngsXG4gICAgICB5OiBpbmZvLnksXG4gICAgICBjb29yZGluYXRlOiBpbmZvLmNvb3JkaW5hdGUsXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBzb3VyY2VMYXllciBpbnN0YW5jZW9mIEZsb3dMaW5lc0xheWVyIHx8XG4gICAgICBzb3VyY2VMYXllciBpbnN0YW5jZW9mIEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IGZsb3cgPVxuICAgICAgICBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0Rmxvd0J5SW5kZXgoaW5kZXgpO1xuICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gYXdhaXQgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJZChcbiAgICAgICAgICBhY2Nlc3NvcnMuZ2V0Rmxvd09yaWdpbklkKGZsb3cpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZXN0ID0gYXdhaXQgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJZChcbiAgICAgICAgICBhY2Nlc3NvcnMuZ2V0Rmxvd0Rlc3RJZChmbG93KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9yaWdpbiAmJiBkZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vbkluZm8sXG4gICAgICAgICAgICB0eXBlOiBQaWNraW5nVHlwZS5GTE9XLFxuICAgICAgICAgICAgb2JqZWN0OiBmbG93LFxuICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgICAgICAgICBkZXN0OiBkZXN0LFxuICAgICAgICAgICAgY291bnQ6IGFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGZsb3cpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0NpcmNsZXNMYXllcikge1xuICAgICAgY29uc3QgbG9jYXRpb24gPVxuICAgICAgICBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUluZGV4KGluZGV4KTtcblxuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBuYW1lID0gYWNjZXNzb3JzLmdldExvY2F0aW9uTmFtZShsb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFscyA9IGF3YWl0IGRhdGFQcm92aWRlci5nZXRUb3RhbHNGb3JMb2NhdGlvbihpZCk7XG4gICAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzfSA9IHRoaXMuc3RhdGU/LmxheWVyc0RhdGEgfHwge307XG4gICAgICAgIGlmICh0b3RhbHMgJiYgY2lyY2xlQXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbnN0IGNpcmNsZVJhZGl1cyA9IGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleChcbiAgICAgICAgICAgIGNpcmNsZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBpbmZvLmluZGV4LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vbkluZm8sXG4gICAgICAgICAgICB0eXBlOiBQaWNraW5nVHlwZS5MT0NBVElPTixcbiAgICAgICAgICAgIG9iamVjdDogbG9jYXRpb24sXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0b3RhbHMsXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IGNpcmNsZVJhZGl1cyxcbiAgICAgICAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIaWdobGlnaHRlZE9iamVjdChcbiAgICBpbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApOiBIaWdobGlnaHRlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qge2luZGV4LCBzb3VyY2VMYXllcn0gPSBpbmZvO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBGbG93TGluZXNMYXllciB8fFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBBbmltYXRlZEZsb3dMaW5lc0xheWVyXG4gICAgKSB7XG4gICAgICBjb25zdCB7bGluZUF0dHJpYnV0ZXN9ID0gdGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChsaW5lQXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEhpZ2hsaWdodFR5cGUuRkxPVyxcbiAgICAgICAgICBsaW5lQXR0cmlidXRlczogZ2V0Rmxvd0xpbmVBdHRyaWJ1dGVzQnlJbmRleChsaW5lQXR0cmlidXRlcywgaW5kZXgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBGbG93Q2lyY2xlc0xheWVyKSB7XG4gICAgICBjb25zdCB7Y2lyY2xlQXR0cmlidXRlc30gPSB0aGlzLnN0YXRlPy5sYXllcnNEYXRhIHx8IHt9O1xuICAgICAgaWYgKGNpcmNsZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBIaWdobGlnaHRUeXBlLkxPQ0FUSU9OLFxuICAgICAgICAgIGNlbnRyb2lkOiBnZXRMb2NhdGlvbkNlbnRyb2lkQnlJbmRleChjaXJjbGVBdHRyaWJ1dGVzLCBpbmRleCksXG4gICAgICAgICAgcmFkaXVzOiBnZXRPdXRlckNpcmNsZVJhZGl1c0J5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXJzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IGxheWVycyA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlPy5sYXllcnNEYXRhKSB7XG4gICAgICBjb25zdCB7bGF5ZXJzRGF0YSwgaGlnaGxpZ2h0ZWRPYmplY3R9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzLCBsaW5lQXR0cmlidXRlc30gPSBsYXllcnNEYXRhIHx8IHt9O1xuICAgICAgaWYgKGNpcmNsZUF0dHJpYnV0ZXMgJiYgbGluZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3QgZmxvd01hcENvbG9ycyA9IGdldEZsb3dNYXBDb2xvcnModGhpcy5fZ2V0U2V0dGluZ3NTdGF0ZSgpKTtcbiAgICAgICAgY29uc3Qgb3V0bGluZUNvbG9yID0gY29sb3JBc1JnYmEoXG4gICAgICAgICAgZmxvd01hcENvbG9ycy5vdXRsaW5lQ29sb3IgfHwgKHRoaXMucHJvcHMuZGFya01vZGUgPyAnIzAwMCcgOiAnI2ZmZicpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21tb25MaW5lTGF5ZXJQcm9wcyA9IHtcbiAgICAgICAgICBkYXRhOiBsaW5lQXR0cmlidXRlcyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAuLi50aGlzLnByb3BzLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICAvLyBwcmV2ZW50IHotZmlnaHRpbmcgYXQgbm9uLXplcm8gYmVhcmluZy9waXRjaFxuICAgICAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5hbmltYXRpb25FbmFibGVkKSB7XG4gICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXcgQW5pbWF0ZWRGbG93TGluZXNMYXllcih7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgICAgLi4uY29tbW9uTGluZUxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQ6ICdhbmltYXRlZC1mbG93LWxpbmVzJyxcbiAgICAgICAgICAgICAgICBkcmF3T3V0bGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzVW5pdDogMjAsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXllcnMucHVzaChcbiAgICAgICAgICAgIG5ldyBGbG93TGluZXNMYXllcih7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgICAgLi4uY29tbW9uTGluZUxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQ6ICdmbG93LWxpbmVzJyxcbiAgICAgICAgICAgICAgICBkcmF3T3V0bGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdXRsaW5lQ29sb3I6IG91dGxpbmVDb2xvcixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgIG5ldyBGbG93Q2lyY2xlc0xheWVyKFxuICAgICAgICAgICAgdGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgICAgICAgaWQ6ICdjaXJjbGVzJyxcbiAgICAgICAgICAgICAgZGF0YTogY2lyY2xlQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgZW1wdHlDb2xvcjogWzAsIDAsIDAsIDI1NV0sXG4gICAgICAgICAgICAgIGVtcHR5T3V0bGluZUNvbG9yOiBbMCwgMCwgMCwgMjU1XSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChoaWdobGlnaHRlZE9iamVjdCkge1xuICAgICAgICAgIHN3aXRjaCAoaGlnaGxpZ2h0ZWRPYmplY3QudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBIaWdobGlnaHRUeXBlLkxPQ0FUSU9OOlxuICAgICAgICAgICAgICBsYXllcnMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgU2NhdHRlcnBsb3RMYXllcih7XG4gICAgICAgICAgICAgICAgICBpZDogJ2xvY2F0aW9uLWhpZ2hsaWdodCcsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBbaGlnaGxpZ2h0ZWRPYmplY3RdLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGZpbGxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBsaW5lV2lkdGhVbml0czogJ3BpeGVscycsXG4gICAgICAgICAgICAgICAgICBnZXRMaW5lV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICByYWRpdXNVbml0czogJ3BpeGVscycsXG4gICAgICAgICAgICAgICAgICBnZXRSYWRpdXM6IChkOiBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0KSA9PiBkLnJhZGl1cyxcbiAgICAgICAgICAgICAgICAgIGdldExpbmVDb2xvcjogKGQ6IEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QpID0+XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQXNSZ2JhKCdvcmFuZ2UnKSxcbiAgICAgICAgICAgICAgICAgIGdldFBvc2l0aW9uOiAoZDogSGlnaGxpZ2h0ZWRMb2NhdGlvbk9iamVjdCkgPT4gZC5jZW50cm9pZCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhpZ2hsaWdodFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZsb3dMaW5lc0xheWVyKHtcbiAgICAgICAgICAgICAgICAgIGlkOiAnZmxvdy1oaWdobGlnaHQnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogaGlnaGxpZ2h0ZWRPYmplY3QubGluZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICBkcmF3T3V0bGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG91dGxpbmVDb2xvcjogY29sb3JBc1JnYmEoJ29yYW5nZScpLFxuICAgICAgICAgICAgICAgICAgb3V0bGluZVRoaWNrbmVzczogMSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuXG5mdW5jdGlvbiBhc1ZpZXdTdGF0ZSh2aWV3cG9ydDogUmVjb3JkPHN0cmluZywgYW55Pik6IFZpZXdwb3J0UHJvcHMge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodCwgbG9uZ2l0dWRlLCBsYXRpdHVkZSwgem9vbSwgcGl0Y2gsIGJlYXJpbmd9ID0gdmlld3BvcnQ7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZSxcbiAgICB6b29tLFxuICAgIHBpdGNoLFxuICAgIGJlYXJpbmcsXG4gIH07XG59XG4iXX0=