@flowmap.gl/data 8.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +199 -0
- package/dist/FlowMapAggregateAccessors.d.ts +15 -0
- package/dist/FlowMapAggregateAccessors.d.ts.map +1 -0
- package/dist/FlowMapAggregateAccessors.js +43 -0
- package/dist/FlowMapSelectors.d.ts +156 -0
- package/dist/FlowMapSelectors.d.ts.map +1 -0
- package/dist/FlowMapSelectors.js +831 -0
- package/dist/FlowMapState.d.ts +24 -0
- package/dist/FlowMapState.d.ts.map +1 -0
- package/dist/FlowMapState.js +2 -0
- package/dist/cluster/ClusterIndex.d.ts +42 -0
- package/dist/cluster/ClusterIndex.d.ts.map +1 -0
- package/dist/cluster/ClusterIndex.js +178 -0
- package/dist/cluster/cluster.d.ts +31 -0
- package/dist/cluster/cluster.d.ts.map +1 -0
- package/dist/cluster/cluster.js +206 -0
- package/dist/colors.d.ts +103 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +441 -0
- package/dist/getViewStateForLocations.d.ts +16 -0
- package/dist/getViewStateForLocations.d.ts.map +1 -0
- package/dist/getViewStateForLocations.js +30 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/provider/FlowMapDataProvider.d.ts +16 -0
- package/dist/provider/FlowMapDataProvider.d.ts.map +1 -0
- package/dist/provider/FlowMapDataProvider.js +17 -0
- package/dist/provider/LocalFlowMapDataProvider.d.ts +20 -0
- package/dist/provider/LocalFlowMapDataProvider.d.ts.map +1 -0
- package/dist/provider/LocalFlowMapDataProvider.js +87 -0
- package/dist/time.d.ts +24 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +126 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/util.d.ts +2 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +4 -0
- package/package.json +48 -0
- package/src/FlowMapAggregateAccessors.ts +60 -0
- package/src/FlowMapSelectors.ts +1407 -0
- package/src/FlowMapState.ts +26 -0
- package/src/cluster/ClusterIndex.ts +266 -0
- package/src/cluster/cluster.ts +299 -0
- package/src/colors.ts +723 -0
- package/src/getViewStateForLocations.ts +64 -0
- package/src/index.ts +10 -0
- package/src/provider/FlowMapDataProvider.ts +63 -0
- package/src/provider/LocalFlowMapDataProvider.ts +108 -0
- package/src/time.ts +160 -0
- package/src/types.ts +162 -0
- package/src/util.ts +3 -0
- package/tsconfig.json +11 -0
- package/typings.d.ts +1 -0
package/dist/colors.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { SettingsState } from './FlowMapState';
|
|
2
|
+
export declare type ColorScale = (value: number) => RGBA;
|
|
3
|
+
export declare type RGBA = [number, number, number, number];
|
|
4
|
+
export declare function opacityFloatToInteger(opacity: number): number;
|
|
5
|
+
export declare function opacifyHex(hexCode: string, opacity: number): string;
|
|
6
|
+
export declare function colorAsRgba(color: string): RGBA;
|
|
7
|
+
export declare enum ColorScheme {
|
|
8
|
+
primary = "#162d3c"
|
|
9
|
+
}
|
|
10
|
+
export declare const BLUES_PALE: string[];
|
|
11
|
+
export declare const schemeTeal: string[];
|
|
12
|
+
export declare const DEFAULT_COLOR_SCHEME: string[];
|
|
13
|
+
export declare const COLOR_SCHEMES: {
|
|
14
|
+
[key: string]: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare const COLOR_SCHEME_KEYS: string[];
|
|
17
|
+
export declare function getFlowMapColors(settingsState: SettingsState): Colors | DiffColors;
|
|
18
|
+
export declare function getColors(diffMode: boolean, schemeKey: string | undefined, darkMode: boolean, fadeEnabled: boolean, fadeAmount: number, animate: boolean): Colors | DiffColors;
|
|
19
|
+
export declare function createFlowColorScale(domain: [number, number], scheme: string[], animate: boolean | undefined): ColorScale;
|
|
20
|
+
export declare function getFlowColorScale(colors: ColorsRGBA | DiffColorsRGBA, magnitudeExtent: [number, number] | undefined, animate: boolean | undefined): (magnitude: number) => [number, number, number, number];
|
|
21
|
+
export declare function isDiffColors(colors: DiffColors | Colors): colors is DiffColors;
|
|
22
|
+
export declare function isDiffColorsRGBA(colors: DiffColorsRGBA | ColorsRGBA): colors is DiffColorsRGBA;
|
|
23
|
+
export interface FlowColors {
|
|
24
|
+
scheme?: string[];
|
|
25
|
+
highlighted?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface LocationCircleColors {
|
|
28
|
+
inner?: string;
|
|
29
|
+
outgoing?: string;
|
|
30
|
+
incoming?: string;
|
|
31
|
+
highlighted?: string;
|
|
32
|
+
empty?: string;
|
|
33
|
+
emptyOutline?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface LocationAreaColors {
|
|
36
|
+
outline?: string;
|
|
37
|
+
normal?: string;
|
|
38
|
+
selected?: string;
|
|
39
|
+
highlighted?: string;
|
|
40
|
+
connected?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface BaseColors {
|
|
43
|
+
darkMode?: boolean;
|
|
44
|
+
locationAreas?: LocationAreaColors;
|
|
45
|
+
dimmedOpacity?: number;
|
|
46
|
+
outlineColor?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface Colors extends BaseColors {
|
|
49
|
+
flows?: FlowColors;
|
|
50
|
+
locationCircles?: LocationCircleColors;
|
|
51
|
+
}
|
|
52
|
+
export interface FlowAndCircleColors {
|
|
53
|
+
flows?: FlowColors;
|
|
54
|
+
locationCircles?: LocationCircleColors;
|
|
55
|
+
}
|
|
56
|
+
export interface DiffColors extends BaseColors {
|
|
57
|
+
positive?: FlowAndCircleColors;
|
|
58
|
+
negative?: FlowAndCircleColors;
|
|
59
|
+
}
|
|
60
|
+
export interface FlowColorsRGBA {
|
|
61
|
+
scheme: string[];
|
|
62
|
+
highlighted: RGBA;
|
|
63
|
+
}
|
|
64
|
+
export interface LocationCircleColorsRGBA {
|
|
65
|
+
inner: RGBA;
|
|
66
|
+
outgoing: RGBA;
|
|
67
|
+
incoming: RGBA;
|
|
68
|
+
highlighted: RGBA;
|
|
69
|
+
empty: RGBA;
|
|
70
|
+
emptyOutline: RGBA;
|
|
71
|
+
}
|
|
72
|
+
export interface LocationAreaColorsRGBA {
|
|
73
|
+
outline: RGBA;
|
|
74
|
+
normal: RGBA;
|
|
75
|
+
selected: RGBA;
|
|
76
|
+
highlighted: RGBA;
|
|
77
|
+
connected: RGBA;
|
|
78
|
+
}
|
|
79
|
+
export interface BaseColorsRGBA {
|
|
80
|
+
darkMode: boolean;
|
|
81
|
+
locationAreas: LocationAreaColorsRGBA;
|
|
82
|
+
dimmedOpacity: number;
|
|
83
|
+
outlineColor: RGBA;
|
|
84
|
+
}
|
|
85
|
+
export interface ColorsRGBA extends BaseColorsRGBA {
|
|
86
|
+
flows: FlowColorsRGBA;
|
|
87
|
+
locationCircles: LocationCircleColorsRGBA;
|
|
88
|
+
}
|
|
89
|
+
export interface FlowAndCircleColorsRGBA {
|
|
90
|
+
flows: FlowColorsRGBA;
|
|
91
|
+
locationCircles: LocationCircleColorsRGBA;
|
|
92
|
+
}
|
|
93
|
+
export interface DiffColorsRGBA extends BaseColorsRGBA {
|
|
94
|
+
positive: FlowAndCircleColorsRGBA;
|
|
95
|
+
negative: FlowAndCircleColorsRGBA;
|
|
96
|
+
}
|
|
97
|
+
export declare function getColorsRGBA(colors: Colors | undefined): ColorsRGBA;
|
|
98
|
+
export declare function getDiffColorsRGBA(colors: DiffColors | undefined): DiffColorsRGBA;
|
|
99
|
+
export declare function rgbaAsString(color: RGBA): string;
|
|
100
|
+
export declare function midpoint(a: number, b: number, zeroToOne: number): number;
|
|
101
|
+
export declare function mixColorsRGBA(color1: RGBA, color2: RGBA, zeroToOne: number): RGBA;
|
|
102
|
+
export default getColors;
|
|
103
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
|
package/dist/colors.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { interpolateCool, interpolateInferno, interpolateMagma, interpolatePlasma, interpolateViridis, interpolateWarm, schemeBlues, schemeBuGn, schemeBuPu, schemeGnBu, schemeGreens, schemeGreys, schemeOranges, schemeOrRd, schemePuBu, schemePuBuGn, schemePuRd, schemePurples, schemeRdPu, schemeReds, schemeYlGn, schemeYlGnBu, schemeYlOrBr, schemeYlOrRd, } from 'd3-scale-chromatic';
|
|
2
|
+
import { range } from 'd3-array';
|
|
3
|
+
import { scalePow, scaleSequential, scaleSequentialPow } from 'd3-scale';
|
|
4
|
+
import { interpolateRgbBasis } from 'd3-interpolate';
|
|
5
|
+
import { color as d3color, hcl } from 'd3-color';
|
|
6
|
+
const DEFAULT_OUTLINE_COLOR = '#fff';
|
|
7
|
+
const DEFAULT_DIMMED_OPACITY = 0.4;
|
|
8
|
+
const DEFAULT_FLOW_MIN_COLOR = 'rgba(240,240,240,0.5)';
|
|
9
|
+
const DEFAULT_FLOW_COLOR_SCHEME = [DEFAULT_FLOW_MIN_COLOR, '#137CBD'];
|
|
10
|
+
const DEFAULT_LOCATION_AREA_COLOR = 'rgba(220,220,220,0.5)';
|
|
11
|
+
const DEFAULT_FLOW_COLOR_SCHEME_POSITIVE = [DEFAULT_FLOW_MIN_COLOR, '#f6654e'];
|
|
12
|
+
const DEFAULT_FLOW_COLOR_SCHEME_NEGATIVE = [DEFAULT_FLOW_MIN_COLOR, '#00a9cc'];
|
|
13
|
+
const FALLBACK_COLOR_RGBA = [255, 255, 255, 255];
|
|
14
|
+
export function opacityFloatToInteger(opacity) {
|
|
15
|
+
return Math.round(opacity * 255);
|
|
16
|
+
}
|
|
17
|
+
export function opacifyHex(hexCode, opacity) {
|
|
18
|
+
const c = d3color(hexCode);
|
|
19
|
+
if (!c) {
|
|
20
|
+
console.warn('Invalid color: ', hexCode);
|
|
21
|
+
return `rgba(255, 255, 255, ${opacity})`;
|
|
22
|
+
}
|
|
23
|
+
const col = c.rgb();
|
|
24
|
+
return `rgba(${col.r}, ${col.g}, ${col.b}, ${opacity})`;
|
|
25
|
+
}
|
|
26
|
+
export function colorAsRgba(color) {
|
|
27
|
+
const col = d3color(color);
|
|
28
|
+
if (!col) {
|
|
29
|
+
console.warn('Invalid color: ', color);
|
|
30
|
+
return FALLBACK_COLOR_RGBA;
|
|
31
|
+
}
|
|
32
|
+
const rgbColor = col.rgb();
|
|
33
|
+
return [
|
|
34
|
+
Math.floor(rgbColor.r),
|
|
35
|
+
Math.floor(rgbColor.g),
|
|
36
|
+
Math.floor(rgbColor.b),
|
|
37
|
+
opacityFloatToInteger(col.opacity),
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
function colorAsRgbaOr(color, defaultColor) {
|
|
41
|
+
if (color) {
|
|
42
|
+
return colorAsRgba(color);
|
|
43
|
+
}
|
|
44
|
+
if (typeof defaultColor === 'string') {
|
|
45
|
+
return colorAsRgba(defaultColor);
|
|
46
|
+
}
|
|
47
|
+
return defaultColor;
|
|
48
|
+
}
|
|
49
|
+
const asScheme = (scheme) => scheme[scheme.length - 1];
|
|
50
|
+
export var ColorScheme;
|
|
51
|
+
(function (ColorScheme) {
|
|
52
|
+
ColorScheme["primary"] = "#162d3c";
|
|
53
|
+
})(ColorScheme || (ColorScheme = {}));
|
|
54
|
+
const SCALE_NUM_STEPS = 20;
|
|
55
|
+
const getColorSteps = (interpolate) => range(0, SCALE_NUM_STEPS + 1)
|
|
56
|
+
.map((i) => interpolate(i / SCALE_NUM_STEPS))
|
|
57
|
+
.reverse();
|
|
58
|
+
const FLOW_MIN_COLOR = 'rgba(240,240,240,0.5)';
|
|
59
|
+
export const BLUES_PALE = [FLOW_MIN_COLOR, ColorScheme.primary];
|
|
60
|
+
const schemeBluYl = [
|
|
61
|
+
'#f7feae',
|
|
62
|
+
'#b7e6a5',
|
|
63
|
+
'#7ccba2',
|
|
64
|
+
'#46aea0',
|
|
65
|
+
'#089099',
|
|
66
|
+
'#00718b',
|
|
67
|
+
'#045275',
|
|
68
|
+
];
|
|
69
|
+
const schemeEmrld = [
|
|
70
|
+
'#d3f2a3',
|
|
71
|
+
'#97e196',
|
|
72
|
+
'#6cc08b',
|
|
73
|
+
'#4c9b82',
|
|
74
|
+
'#217a79',
|
|
75
|
+
'#105965',
|
|
76
|
+
'#074050',
|
|
77
|
+
];
|
|
78
|
+
export const schemeTeal = [
|
|
79
|
+
'#d1eeea',
|
|
80
|
+
'#a8dbd9',
|
|
81
|
+
'#85c4c9',
|
|
82
|
+
'#68abb8',
|
|
83
|
+
'#4f90a6',
|
|
84
|
+
'#3b738f',
|
|
85
|
+
'#2a5674',
|
|
86
|
+
];
|
|
87
|
+
export const DEFAULT_COLOR_SCHEME = schemeTeal;
|
|
88
|
+
export const COLOR_SCHEMES = {
|
|
89
|
+
Blues: asScheme(schemeBlues),
|
|
90
|
+
BluesPale: BLUES_PALE,
|
|
91
|
+
BluGrn: [
|
|
92
|
+
'#c4e6c3',
|
|
93
|
+
'#96d2a4',
|
|
94
|
+
'#6dbc90',
|
|
95
|
+
'#4da284',
|
|
96
|
+
'#36877a',
|
|
97
|
+
'#266b6e',
|
|
98
|
+
'#1d4f60',
|
|
99
|
+
],
|
|
100
|
+
BluYl: schemeBluYl,
|
|
101
|
+
BrwnYl: [
|
|
102
|
+
'#ede5cf',
|
|
103
|
+
'#e0c2a2',
|
|
104
|
+
'#d39c83',
|
|
105
|
+
'#c1766f',
|
|
106
|
+
'#a65461',
|
|
107
|
+
'#813753',
|
|
108
|
+
'#541f3f',
|
|
109
|
+
],
|
|
110
|
+
BuGn: asScheme(schemeBuGn),
|
|
111
|
+
BuPu: asScheme(schemeBuPu),
|
|
112
|
+
Burg: [
|
|
113
|
+
'#ffc6c4',
|
|
114
|
+
'#f4a3a8',
|
|
115
|
+
'#e38191',
|
|
116
|
+
'#cc607d',
|
|
117
|
+
'#ad466c',
|
|
118
|
+
'#8b3058',
|
|
119
|
+
'#672044',
|
|
120
|
+
],
|
|
121
|
+
BurgYl: [
|
|
122
|
+
'#fbe6c5',
|
|
123
|
+
'#f5ba98',
|
|
124
|
+
'#ee8a82',
|
|
125
|
+
'#dc7176',
|
|
126
|
+
'#c8586c',
|
|
127
|
+
'#9c3f5d',
|
|
128
|
+
'#70284a',
|
|
129
|
+
],
|
|
130
|
+
Cool: getColorSteps(interpolateCool),
|
|
131
|
+
DarkMint: [
|
|
132
|
+
'#d2fbd4',
|
|
133
|
+
'#a5dbc2',
|
|
134
|
+
'#7bbcb0',
|
|
135
|
+
'#559c9e',
|
|
136
|
+
'#3a7c89',
|
|
137
|
+
'#235d72',
|
|
138
|
+
'#123f5a',
|
|
139
|
+
],
|
|
140
|
+
Emrld: schemeEmrld,
|
|
141
|
+
GnBu: asScheme(schemeGnBu),
|
|
142
|
+
Greens: asScheme(schemeGreens),
|
|
143
|
+
Greys: asScheme(schemeGreys),
|
|
144
|
+
Inferno: getColorSteps(interpolateInferno),
|
|
145
|
+
Magenta: [
|
|
146
|
+
'#f3cbd3',
|
|
147
|
+
'#eaa9bd',
|
|
148
|
+
'#dd88ac',
|
|
149
|
+
'#ca699d',
|
|
150
|
+
'#b14d8e',
|
|
151
|
+
'#91357d',
|
|
152
|
+
'#6c2167',
|
|
153
|
+
],
|
|
154
|
+
Magma: getColorSteps(interpolateMagma),
|
|
155
|
+
Mint: [
|
|
156
|
+
'#e4f1e1',
|
|
157
|
+
'#b4d9cc',
|
|
158
|
+
'#89c0b6',
|
|
159
|
+
'#63a6a0',
|
|
160
|
+
'#448c8a',
|
|
161
|
+
'#287274',
|
|
162
|
+
'#0d585f',
|
|
163
|
+
],
|
|
164
|
+
Oranges: asScheme(schemeOranges),
|
|
165
|
+
OrRd: asScheme(schemeOrRd),
|
|
166
|
+
OrYel: [
|
|
167
|
+
'#ecda9a',
|
|
168
|
+
'#efc47e',
|
|
169
|
+
'#f3ad6a',
|
|
170
|
+
'#f7945d',
|
|
171
|
+
'#f97b57',
|
|
172
|
+
'#f66356',
|
|
173
|
+
'#ee4d5a',
|
|
174
|
+
],
|
|
175
|
+
Peach: [
|
|
176
|
+
'#fde0c5',
|
|
177
|
+
'#facba6',
|
|
178
|
+
'#f8b58b',
|
|
179
|
+
'#f59e72',
|
|
180
|
+
'#f2855d',
|
|
181
|
+
'#ef6a4c',
|
|
182
|
+
'#eb4a40',
|
|
183
|
+
],
|
|
184
|
+
Plasma: getColorSteps(interpolatePlasma),
|
|
185
|
+
PinkYl: [
|
|
186
|
+
'#fef6b5',
|
|
187
|
+
'#ffdd9a',
|
|
188
|
+
'#ffc285',
|
|
189
|
+
'#ffa679',
|
|
190
|
+
'#fa8a76',
|
|
191
|
+
'#f16d7a',
|
|
192
|
+
'#e15383',
|
|
193
|
+
],
|
|
194
|
+
PuBu: asScheme(schemePuBu),
|
|
195
|
+
PuBuGn: asScheme(schemePuBuGn),
|
|
196
|
+
PuRd: asScheme(schemePuRd),
|
|
197
|
+
Purp: [
|
|
198
|
+
'#f3e0f7',
|
|
199
|
+
'#e4c7f1',
|
|
200
|
+
'#d1afe8',
|
|
201
|
+
'#b998dd',
|
|
202
|
+
'#9f82ce',
|
|
203
|
+
'#826dba',
|
|
204
|
+
'#63589f',
|
|
205
|
+
],
|
|
206
|
+
Purples: asScheme(schemePurples),
|
|
207
|
+
PurpOr: [
|
|
208
|
+
'#f9ddda',
|
|
209
|
+
'#f2b9c4',
|
|
210
|
+
'#e597b9',
|
|
211
|
+
'#ce78b3',
|
|
212
|
+
'#ad5fad',
|
|
213
|
+
'#834ba0',
|
|
214
|
+
'#573b88',
|
|
215
|
+
],
|
|
216
|
+
RdPu: asScheme(schemeRdPu),
|
|
217
|
+
RedOr: [
|
|
218
|
+
'#f6d2a9',
|
|
219
|
+
'#f5b78e',
|
|
220
|
+
'#f19c7c',
|
|
221
|
+
'#ea8171',
|
|
222
|
+
'#dd686c',
|
|
223
|
+
'#ca5268',
|
|
224
|
+
'#b13f64',
|
|
225
|
+
],
|
|
226
|
+
Reds: asScheme(schemeReds),
|
|
227
|
+
Sunset: [
|
|
228
|
+
'#f3e79b',
|
|
229
|
+
'#fac484',
|
|
230
|
+
'#f8a07e',
|
|
231
|
+
'#eb7f86',
|
|
232
|
+
'#ce6693',
|
|
233
|
+
'#a059a0',
|
|
234
|
+
'#5c53a5',
|
|
235
|
+
],
|
|
236
|
+
SunsetDark: [
|
|
237
|
+
'#fcde9c',
|
|
238
|
+
'#faa476',
|
|
239
|
+
'#f0746e',
|
|
240
|
+
'#e34f6f',
|
|
241
|
+
'#dc3977',
|
|
242
|
+
'#b9257a',
|
|
243
|
+
'#7c1d6f',
|
|
244
|
+
],
|
|
245
|
+
Teal: schemeTeal,
|
|
246
|
+
TealGrn: [
|
|
247
|
+
'#b0f2bc',
|
|
248
|
+
'#89e8ac',
|
|
249
|
+
'#67dba5',
|
|
250
|
+
'#4cc8a3',
|
|
251
|
+
'#38b2a3',
|
|
252
|
+
'#2c98a0',
|
|
253
|
+
'#257d98',
|
|
254
|
+
],
|
|
255
|
+
Viridis: getColorSteps(interpolateViridis),
|
|
256
|
+
Warm: getColorSteps(interpolateWarm),
|
|
257
|
+
YlGn: asScheme(schemeYlGn),
|
|
258
|
+
YlGnBu: asScheme(schemeYlGnBu),
|
|
259
|
+
YlOrBr: asScheme(schemeYlOrBr),
|
|
260
|
+
YlOrRd: asScheme(schemeYlOrRd),
|
|
261
|
+
};
|
|
262
|
+
export const COLOR_SCHEME_KEYS = Object.keys(COLOR_SCHEMES);
|
|
263
|
+
const complementary = '#f52020';
|
|
264
|
+
const baseDiffColor = '#17a5be';
|
|
265
|
+
const diffColors = {
|
|
266
|
+
negative: {
|
|
267
|
+
flows: {
|
|
268
|
+
scheme: [FLOW_MIN_COLOR, baseDiffColor],
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
positive: {
|
|
272
|
+
flows: {
|
|
273
|
+
scheme: [FLOW_MIN_COLOR, complementary],
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
locationAreas: {
|
|
277
|
+
outline: 'rgba(92,112,128,0.5)',
|
|
278
|
+
normal: 'rgba(220,220,220,0.5)',
|
|
279
|
+
},
|
|
280
|
+
outlineColor: 'rgb(230,233,237)',
|
|
281
|
+
};
|
|
282
|
+
export function getFlowMapColors(settingsState) {
|
|
283
|
+
return getColors(false, // TODO: diffMode
|
|
284
|
+
settingsState.colorScheme, settingsState.darkMode, settingsState.fadeEnabled, settingsState.fadeAmount, settingsState.animationEnabled);
|
|
285
|
+
}
|
|
286
|
+
export function getColors(diffMode, schemeKey, darkMode, fadeEnabled, fadeAmount, animate) {
|
|
287
|
+
if (diffMode) {
|
|
288
|
+
return diffColors;
|
|
289
|
+
}
|
|
290
|
+
let scheme = (schemeKey && COLOR_SCHEMES[schemeKey]) || DEFAULT_COLOR_SCHEME;
|
|
291
|
+
if (darkMode) {
|
|
292
|
+
scheme = scheme.slice().reverse();
|
|
293
|
+
}
|
|
294
|
+
// if (animate)
|
|
295
|
+
// if (fadeAmount > 0)
|
|
296
|
+
{
|
|
297
|
+
const indices = range(0, Math.max(10, scheme.length));
|
|
298
|
+
const N = indices.length - 1;
|
|
299
|
+
const colorScale = scaleSequential(interpolateRgbBasis(scheme)).domain([
|
|
300
|
+
0,
|
|
301
|
+
N,
|
|
302
|
+
]);
|
|
303
|
+
if (!fadeEnabled || fadeAmount === 0) {
|
|
304
|
+
scheme = indices.map((c, i) => colorScale(i));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
const amount = scalePow()
|
|
308
|
+
// .exponent(animate ? 1 : 1/2.5)
|
|
309
|
+
// .exponent(animate ? 100 : 50)
|
|
310
|
+
// .exponent(animate ? 20 : 5)
|
|
311
|
+
// .exponent(1/2.5)
|
|
312
|
+
.exponent(1.5)
|
|
313
|
+
.domain([N, 0])
|
|
314
|
+
// .range([fadeAmount/100*(animate?2:1), 0])
|
|
315
|
+
// .range([0, fadeAmount/100*(animate?2:1)])
|
|
316
|
+
// .range(darkMode ? [1-fadeAmount/100, 1] : [1, 1 - fadeAmount/100])
|
|
317
|
+
// .range(darkMode ? [1 - fadeAmount/100, 1] : [fadeAmount/100, 0])
|
|
318
|
+
// .range([1 - fadeAmount/100, 1])
|
|
319
|
+
.range([0, (2 * fadeAmount) / 100]);
|
|
320
|
+
scheme = indices.map((c, i) => {
|
|
321
|
+
const color = colorScale(i);
|
|
322
|
+
const alpha = amount(i);
|
|
323
|
+
if (color == null || alpha == null)
|
|
324
|
+
return '#000';
|
|
325
|
+
const col = hcl(color);
|
|
326
|
+
col.l = darkMode
|
|
327
|
+
? col.l - col.l * alpha
|
|
328
|
+
: col.l + (100 - col.l) * alpha;
|
|
329
|
+
col.c = col.c - col.c * (alpha / 4);
|
|
330
|
+
return col.toString();
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
darkMode,
|
|
336
|
+
flows: {
|
|
337
|
+
scheme,
|
|
338
|
+
},
|
|
339
|
+
locationCircles: {
|
|
340
|
+
outgoing: darkMode ? '#000' : '#fff',
|
|
341
|
+
},
|
|
342
|
+
outlineColor: darkMode ? '#000' : 'rgba(255, 255, 255, 0.5)',
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
export function createFlowColorScale(domain, scheme, animate) {
|
|
346
|
+
const scale = scaleSequentialPow(interpolateRgbBasis(scheme))
|
|
347
|
+
// @ts-ignore
|
|
348
|
+
.exponent(animate ? 1 / 2 : 1 / 3)
|
|
349
|
+
.domain(domain);
|
|
350
|
+
return (value) => colorAsRgba(scale(value));
|
|
351
|
+
}
|
|
352
|
+
export function getFlowColorScale(colors, magnitudeExtent, animate) {
|
|
353
|
+
const minMagnitude = magnitudeExtent ? magnitudeExtent[0] : 0;
|
|
354
|
+
const maxMagnitude = magnitudeExtent ? magnitudeExtent[1] : 0;
|
|
355
|
+
if (isDiffColorsRGBA(colors)) {
|
|
356
|
+
const posScale = createFlowColorScale([0, maxMagnitude], colors.positive.flows.scheme, animate);
|
|
357
|
+
const negScale = createFlowColorScale([0, minMagnitude], colors.negative.flows.scheme, animate);
|
|
358
|
+
return (magnitude) => magnitude >= 0 ? posScale(magnitude) : negScale(magnitude);
|
|
359
|
+
}
|
|
360
|
+
const scale = createFlowColorScale([0, maxMagnitude || 0], colors.flows.scheme, animate);
|
|
361
|
+
return (magnitude) => scale(magnitude);
|
|
362
|
+
}
|
|
363
|
+
export function isDiffColors(colors) {
|
|
364
|
+
return colors.positive !== undefined;
|
|
365
|
+
}
|
|
366
|
+
export function isDiffColorsRGBA(colors) {
|
|
367
|
+
return colors.positive !== undefined;
|
|
368
|
+
}
|
|
369
|
+
function getLocationAreaColorsRGBA(colors, darkMode) {
|
|
370
|
+
const normalColor = (colors && colors.normal) || DEFAULT_LOCATION_AREA_COLOR;
|
|
371
|
+
const normalColorHcl = hcl(normalColor);
|
|
372
|
+
const locationAreasNormal = colorAsRgba(normalColor);
|
|
373
|
+
return {
|
|
374
|
+
normal: locationAreasNormal,
|
|
375
|
+
connected: colorAsRgbaOr(colors && colors.connected, locationAreasNormal),
|
|
376
|
+
highlighted: colorAsRgbaOr(colors && colors.highlighted, opacifyHex(normalColorHcl[darkMode ? 'brighter' : 'darker'](1).toString(), 0.5)),
|
|
377
|
+
selected: colorAsRgbaOr(colors && colors.selected, opacifyHex(normalColorHcl[darkMode ? 'brighter' : 'darker'](2).toString(), 0.8)),
|
|
378
|
+
outline: colorAsRgbaOr(colors && colors.outline, colorAsRgba(normalColorHcl[darkMode ? 'brighter' : 'darker'](4).toString())),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
function getFlowAndCircleColors(inputColors, defaultFlowColorScheme, darkMode) {
|
|
382
|
+
var _a;
|
|
383
|
+
const flowColorScheme = (inputColors && inputColors.flows && inputColors.flows.scheme) ||
|
|
384
|
+
defaultFlowColorScheme;
|
|
385
|
+
const maxFlowColorHcl = hcl(flowColorScheme[flowColorScheme.length - 1]);
|
|
386
|
+
const flowColorHighlighted = colorAsRgbaOr(inputColors && inputColors.flows && inputColors.flows.highlighted, colorAsRgba(maxFlowColorHcl[darkMode ? 'brighter' : 'darker'](0.7).toString()));
|
|
387
|
+
const emptyColor = colorAsRgbaOr((_a = inputColors === null || inputColors === void 0 ? void 0 : inputColors.locationCircles) === null || _a === void 0 ? void 0 : _a.empty, darkMode ? '#000' : '#fff');
|
|
388
|
+
const innerColor = colorAsRgbaOr(inputColors &&
|
|
389
|
+
inputColors.locationCircles &&
|
|
390
|
+
inputColors.locationCircles.inner, maxFlowColorHcl.toString());
|
|
391
|
+
return {
|
|
392
|
+
flows: {
|
|
393
|
+
scheme: flowColorScheme,
|
|
394
|
+
highlighted: flowColorHighlighted,
|
|
395
|
+
},
|
|
396
|
+
locationCircles: {
|
|
397
|
+
inner: innerColor,
|
|
398
|
+
outgoing: colorAsRgbaOr(inputColors &&
|
|
399
|
+
inputColors.locationCircles &&
|
|
400
|
+
inputColors.locationCircles.outgoing, darkMode ? '#000' : '#fff'),
|
|
401
|
+
incoming: colorAsRgbaOr(inputColors &&
|
|
402
|
+
inputColors.locationCircles &&
|
|
403
|
+
inputColors.locationCircles.incoming, maxFlowColorHcl[darkMode ? 'brighter' : 'darker'](1.25).toString()),
|
|
404
|
+
highlighted: colorAsRgbaOr(inputColors &&
|
|
405
|
+
inputColors.locationCircles &&
|
|
406
|
+
inputColors.locationCircles.highlighted, flowColorHighlighted),
|
|
407
|
+
empty: emptyColor,
|
|
408
|
+
emptyOutline: mixColorsRGBA(innerColor, emptyColor, 0.4),
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
function getBaseColorsRGBA(colors) {
|
|
413
|
+
const darkMode = colors && colors.darkMode ? true : false;
|
|
414
|
+
return {
|
|
415
|
+
darkMode,
|
|
416
|
+
locationAreas: getLocationAreaColorsRGBA(colors && colors.locationAreas, darkMode),
|
|
417
|
+
outlineColor: colorAsRgba((colors && colors.outlineColor) || DEFAULT_OUTLINE_COLOR),
|
|
418
|
+
dimmedOpacity: colors && colors.dimmedOpacity != null
|
|
419
|
+
? colors.dimmedOpacity
|
|
420
|
+
: DEFAULT_DIMMED_OPACITY,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
export function getColorsRGBA(colors) {
|
|
424
|
+
const baseColorsRGBA = getBaseColorsRGBA(colors);
|
|
425
|
+
return Object.assign(Object.assign({}, baseColorsRGBA), getFlowAndCircleColors(colors, DEFAULT_FLOW_COLOR_SCHEME, baseColorsRGBA.darkMode));
|
|
426
|
+
}
|
|
427
|
+
export function getDiffColorsRGBA(colors) {
|
|
428
|
+
const baseColorsRGBA = getBaseColorsRGBA(colors);
|
|
429
|
+
return Object.assign(Object.assign({}, baseColorsRGBA), { positive: getFlowAndCircleColors(colors && colors.positive, DEFAULT_FLOW_COLOR_SCHEME_POSITIVE, baseColorsRGBA.darkMode), negative: getFlowAndCircleColors(colors && colors.negative, DEFAULT_FLOW_COLOR_SCHEME_NEGATIVE, baseColorsRGBA.darkMode) });
|
|
430
|
+
}
|
|
431
|
+
export function rgbaAsString(color) {
|
|
432
|
+
return `rgba(${color.join(',')})`;
|
|
433
|
+
}
|
|
434
|
+
export function midpoint(a, b, zeroToOne) {
|
|
435
|
+
return a + (b - a) * zeroToOne;
|
|
436
|
+
}
|
|
437
|
+
export function mixColorsRGBA(color1, color2, zeroToOne) {
|
|
438
|
+
return color1.map((v, i) => midpoint(v, color2[i], zeroToOne));
|
|
439
|
+
}
|
|
440
|
+
export default getColors;
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsV0FBVyxFQUNYLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxLQUFLLElBQUksT0FBTyxFQUFFLEdBQUcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUcvQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUNyQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLHVCQUF1QixDQUFDO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0RSxNQUFNLDJCQUEyQixHQUFHLHVCQUF1QixDQUFDO0FBRTVELE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRSxNQUFNLGtDQUFrQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFLL0UsTUFBTSxtQkFBbUIsR0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRXZELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxPQUFlO0lBQ25ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsT0FBZSxFQUFFLE9BQWU7SUFDekQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sdUJBQXVCLE9BQU8sR0FBRyxDQUFDO0tBQzFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLG1CQUFtQixDQUFDO0tBQzVCO0lBQ0QsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU87UUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0QixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0tBQ25DLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLEtBQXlCLEVBQ3pCLFlBQTJCO0lBRTNCLElBQUksS0FBSyxFQUFFO1FBQ1QsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDM0I7SUFDRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRTtRQUNwQyxPQUFPLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUNsQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQTRDLEVBQUUsRUFBRSxDQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQWEsQ0FBQztBQUV4QyxNQUFNLENBQU4sSUFBWSxXQUVYO0FBRkQsV0FBWSxXQUFXO0lBQ3JCLGtDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFGVyxXQUFXLEtBQVgsV0FBVyxRQUV0QjtBQUVELE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxDQUFDLFdBQWtDLEVBQUUsRUFBRSxDQUMzRCxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUM7S0FDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO0tBQzVDLE9BQU8sRUFBRSxDQUFDO0FBRWYsTUFBTSxjQUFjLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRSxNQUFNLFdBQVcsR0FBRztJQUNsQixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBOEI7SUFDdEQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDNUIsU0FBUyxFQUFFLFVBQVU7SUFDckIsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsS0FBSyxFQUFFLFdBQVc7SUFDbEIsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsSUFBSSxFQUFFO1FBQ0osU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLGFBQWEsQ0FBQyxlQUFlLENBQUM7SUFDcEMsUUFBUSxFQUFFO1FBQ1IsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsS0FBSyxFQUFFLFdBQVc7SUFDbEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDOUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDNUIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztJQUMxQyxPQUFPLEVBQUU7UUFDUCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO0tBQ1Y7SUFDRCxLQUFLLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0lBQ3RDLElBQUksRUFBRTtRQUNKLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7S0FDVjtJQUNELE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQ2hDLElBQUksRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzFCLEtBQUssRUFBRTtRQUNMLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7S0FDVjtJQUNELEtBQUssRUFBRTtRQUNMLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7S0FDVjtJQUNELE1BQU0sRUFBRSxhQUFhLENBQUMsaUJBQWlCLENBQUM7SUFDeEMsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDOUIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsSUFBSSxFQUFFO1FBQ0osU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDaEMsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsS0FBSyxFQUFFO1FBQ0wsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDMUIsTUFBTSxFQUFFO1FBQ04sU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsSUFBSSxFQUFFLFVBQVU7SUFDaEIsT0FBTyxFQUFFO1FBQ1AsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztLQUNWO0lBQ0QsT0FBTyxFQUFFLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztJQUMxQyxJQUFJLEVBQUUsYUFBYSxDQUFDLGVBQWUsQ0FBQztJQUNwQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUMxQixNQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUM5QixNQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUM5QixNQUFNLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQztDQUMvQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUU1RCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDaEMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBRWhDLE1BQU0sVUFBVSxHQUFlO0lBQzdCLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7U0FDeEM7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7U0FDeEM7S0FDRjtJQUNELGFBQWEsRUFBRTtRQUNiLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsTUFBTSxFQUFFLHVCQUF1QjtLQUNoQztJQUNELFlBQVksRUFBRSxrQkFBa0I7Q0FDakMsQ0FBQztBQUVGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsYUFBNEI7SUFFNUIsT0FBTyxTQUFTLENBQ2QsS0FBSyxFQUFFLGlCQUFpQjtJQUN4QixhQUFhLENBQUMsV0FBVyxFQUN6QixhQUFhLENBQUMsUUFBUSxFQUN0QixhQUFhLENBQUMsV0FBVyxFQUN6QixhQUFhLENBQUMsVUFBVSxFQUN4QixhQUFhLENBQUMsZ0JBQWdCLENBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsUUFBaUIsRUFDakIsU0FBNkIsRUFDN0IsUUFBaUIsRUFDakIsV0FBb0IsRUFDcEIsVUFBa0IsRUFDbEIsT0FBZ0I7SUFFaEIsSUFBSSxRQUFRLEVBQUU7UUFDWixPQUFPLFVBQVUsQ0FBQztLQUNuQjtJQUVELElBQUksTUFBTSxHQUFHLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO0lBRTdFLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNuQztJQUNELGVBQWU7SUFDZixzQkFBc0I7SUFDdEI7UUFDRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxDQUFDO1lBQ0QsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtZQUNwQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9DO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUU7Z0JBQ3ZCLGlDQUFpQztnQkFDakMsZ0NBQWdDO2dCQUNoQyw4QkFBOEI7Z0JBQzlCLG1CQUFtQjtpQkFDbEIsUUFBUSxDQUFDLEdBQUcsQ0FBQztpQkFDYixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsNENBQTRDO2dCQUM1Qyw0Q0FBNEM7Z0JBQzVDLHFFQUFxRTtnQkFDckUsbUVBQW1FO2dCQUNuRSxrQ0FBa0M7aUJBQ2pDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXRDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDUCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJO29CQUFFLE9BQU8sTUFBTSxDQUFDO2dCQUNsRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUTtvQkFDZCxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUs7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBR0YsQ0FBQztTQUNIO0tBQ0Y7SUFFRCxPQUFPO1FBQ0wsUUFBUTtRQUNSLEtBQUssRUFBRTtZQUNMLE1BQU07U0FDUDtRQUNELGVBQWUsRUFBRTtZQUNmLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUNyQztRQUNELFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsMEJBQTBCO0tBQzdELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUF3QixFQUN4QixNQUFnQixFQUNoQixPQUE0QjtJQUU1QixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxhQUFhO1NBQ1osUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEIsT0FBTyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE1BQW1DLEVBQ25DLGVBQTZDLEVBQzdDLE9BQTRCO0lBRTVCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzVCLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUNuQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsRUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUM1QixPQUFPLENBQ1IsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUNuQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsRUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUM1QixPQUFPLENBQ1IsQ0FBQztRQUVGLE9BQU8sQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDM0IsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDOUQ7SUFFRCxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDbkIsT0FBTyxDQUNSLENBQUM7SUFDRixPQUFPLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUEyQjtJQUUzQixPQUFRLE1BQXFCLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixNQUFtQztJQUVuQyxPQUFRLE1BQXlCLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsTUFBc0MsRUFDdEMsUUFBaUI7SUFFakIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLDJCQUEyQixDQUFDO0lBQzdFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixTQUFTLEVBQUUsYUFBYSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO1FBQ3pFLFdBQVcsRUFBRSxhQUFhLENBQ3hCLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUM1QixVQUFVLENBQ1IsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFDOUQsR0FBRyxDQUNKLENBQ0Y7UUFDRCxRQUFRLEVBQUUsYUFBYSxDQUNyQixNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFDekIsVUFBVSxDQUNSLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQzlELEdBQUcsQ0FDSixDQUNGO1FBQ0QsT0FBTyxFQUFFLGFBQWEsQ0FDcEIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQ3hCLFdBQVcsQ0FDVCxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUMvRCxDQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUE2RkQsU0FBUyxzQkFBc0IsQ0FDN0IsV0FBNEMsRUFDNUMsc0JBQWdDLEVBQ2hDLFFBQWlCOztJQUVqQixNQUFNLGVBQWUsR0FDbkIsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM5RCxzQkFBc0IsQ0FBQztJQUN6QixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FDeEMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ2pFLFdBQVcsQ0FDVCxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUNsRSxDQUNGLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQzlCLE1BQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLGVBQWUsMENBQUUsS0FBSyxFQUNuQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUMzQixDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUM5QixXQUFXO1FBQ1QsV0FBVyxDQUFDLGVBQWU7UUFDM0IsV0FBVyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQ25DLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FDM0IsQ0FBQztJQUNGLE9BQU87UUFDTCxLQUFLLEVBQUU7WUFDTCxNQUFNLEVBQUUsZUFBZTtZQUN2QixXQUFXLEVBQUUsb0JBQW9CO1NBQ2xDO1FBQ0QsZUFBZSxFQUFFO1lBQ2YsS0FBSyxFQUFFLFVBQVU7WUFDakIsUUFBUSxFQUFFLGFBQWEsQ0FDckIsV0FBVztnQkFDVCxXQUFXLENBQUMsZUFBZTtnQkFDM0IsV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQ3RDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzNCO1lBQ0QsUUFBUSxFQUFFLGFBQWEsQ0FDckIsV0FBVztnQkFDVCxXQUFXLENBQUMsZUFBZTtnQkFDM0IsV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQ3RDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQ25FO1lBQ0QsV0FBVyxFQUFFLGFBQWEsQ0FDeEIsV0FBVztnQkFDVCxXQUFXLENBQUMsZUFBZTtnQkFDM0IsV0FBVyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQ3pDLG9CQUFvQixDQUNyQjtZQUNELEtBQUssRUFBRSxVQUFVO1lBQ2pCLFlBQVksRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUM7U0FDekQ7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLE1BQXVDO0lBRXZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMxRCxPQUFPO1FBQ0wsUUFBUTtRQUNSLGFBQWEsRUFBRSx5QkFBeUIsQ0FDdEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQzlCLFFBQVEsQ0FDVDtRQUNELFlBQVksRUFBRSxXQUFXLENBQ3ZCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxxQkFBcUIsQ0FDekQ7UUFDRCxhQUFhLEVBQ1gsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksSUFBSTtZQUNwQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWE7WUFDdEIsQ0FBQyxDQUFDLHNCQUFzQjtLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBMEI7SUFDdEQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsdUNBQ0ssY0FBYyxHQUNkLHNCQUFzQixDQUN2QixNQUFNLEVBQ04seUJBQXlCLEVBQ3pCLGNBQWMsQ0FBQyxRQUFRLENBQ3hCLEVBQ0Q7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUE4QjtJQUU5QixNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCx1Q0FDSyxjQUFjLEtBQ2pCLFFBQVEsRUFBRSxzQkFBc0IsQ0FDOUIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQ3pCLGtDQUFrQyxFQUNsQyxjQUFjLENBQUMsUUFBUSxDQUN4QixFQUNELFFBQVEsRUFBRSxzQkFBc0IsQ0FDOUIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQ3pCLGtDQUFrQyxFQUNsQyxjQUFjLENBQUMsUUFBUSxDQUN4QixJQUNEO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBVztJQUN0QyxPQUFPLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsU0FBaUI7SUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUFZLEVBQ1osTUFBWSxFQUNaLFNBQWlCO0lBRWpCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFTLENBQUM7QUFDekUsQ0FBQztBQUVELGVBQWUsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaW50ZXJwb2xhdGVDb29sLFxuICBpbnRlcnBvbGF0ZUluZmVybm8sXG4gIGludGVycG9sYXRlTWFnbWEsXG4gIGludGVycG9sYXRlUGxhc21hLFxuICBpbnRlcnBvbGF0ZVZpcmlkaXMsXG4gIGludGVycG9sYXRlV2FybSxcbiAgc2NoZW1lQmx1ZXMsXG4gIHNjaGVtZUJ1R24sXG4gIHNjaGVtZUJ1UHUsXG4gIHNjaGVtZUduQnUsXG4gIHNjaGVtZUdyZWVucyxcbiAgc2NoZW1lR3JleXMsXG4gIHNjaGVtZU9yYW5nZXMsXG4gIHNjaGVtZU9yUmQsXG4gIHNjaGVtZVB1QnUsXG4gIHNjaGVtZVB1QnVHbixcbiAgc2NoZW1lUHVSZCxcbiAgc2NoZW1lUHVycGxlcyxcbiAgc2NoZW1lUmRQdSxcbiAgc2NoZW1lUmVkcyxcbiAgc2NoZW1lWWxHbixcbiAgc2NoZW1lWWxHbkJ1LFxuICBzY2hlbWVZbE9yQnIsXG4gIHNjaGVtZVlsT3JSZCxcbn0gZnJvbSAnZDMtc2NhbGUtY2hyb21hdGljJztcbmltcG9ydCB7cmFuZ2V9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7c2NhbGVQb3csIHNjYWxlU2VxdWVudGlhbCwgc2NhbGVTZXF1ZW50aWFsUG93fSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge2ludGVycG9sYXRlUmdiQmFzaXN9IGZyb20gJ2QzLWludGVycG9sYXRlJztcbmltcG9ydCB7Y29sb3IgYXMgZDNjb2xvciwgaGNsfSBmcm9tICdkMy1jb2xvcic7XG5pbXBvcnQge1NldHRpbmdzU3RhdGV9IGZyb20gJy4vRmxvd01hcFN0YXRlJztcblxuY29uc3QgREVGQVVMVF9PVVRMSU5FX0NPTE9SID0gJyNmZmYnO1xuY29uc3QgREVGQVVMVF9ESU1NRURfT1BBQ0lUWSA9IDAuNDtcbmNvbnN0IERFRkFVTFRfRkxPV19NSU5fQ09MT1IgPSAncmdiYSgyNDAsMjQwLDI0MCwwLjUpJztcbmNvbnN0IERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUUgPSBbREVGQVVMVF9GTE9XX01JTl9DT0xPUiwgJyMxMzdDQkQnXTtcbmNvbnN0IERFRkFVTFRfTE9DQVRJT05fQVJFQV9DT0xPUiA9ICdyZ2JhKDIyMCwyMjAsMjIwLDAuNSknO1xuXG5jb25zdCBERUZBVUxUX0ZMT1dfQ09MT1JfU0NIRU1FX1BPU0lUSVZFID0gW0RFRkFVTFRfRkxPV19NSU5fQ09MT1IsICcjZjY2NTRlJ107XG5jb25zdCBERUZBVUxUX0ZMT1dfQ09MT1JfU0NIRU1FX05FR0FUSVZFID0gW0RFRkFVTFRfRkxPV19NSU5fQ09MT1IsICcjMDBhOWNjJ107XG5cbmV4cG9ydCB0eXBlIENvbG9yU2NhbGUgPSAodmFsdWU6IG51bWJlcikgPT4gUkdCQTtcbmV4cG9ydCB0eXBlIFJHQkEgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuY29uc3QgRkFMTEJBQ0tfQ09MT1JfUkdCQTogUkdCQSA9IFsyNTUsIDI1NSwgMjU1LCAyNTVdO1xuXG5leHBvcnQgZnVuY3Rpb24gb3BhY2l0eUZsb2F0VG9JbnRlZ2VyKG9wYWNpdHk6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG9wYWNpdHkgKiAyNTUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3BhY2lmeUhleChoZXhDb2RlOiBzdHJpbmcsIG9wYWNpdHk6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGMgPSBkM2NvbG9yKGhleENvZGUpO1xuICBpZiAoIWMpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgY29sb3I6ICcsIGhleENvZGUpO1xuICAgIHJldHVybiBgcmdiYSgyNTUsIDI1NSwgMjU1LCAke29wYWNpdHl9KWA7XG4gIH1cbiAgY29uc3QgY29sID0gYy5yZ2IoKTtcbiAgcmV0dXJuIGByZ2JhKCR7Y29sLnJ9LCAke2NvbC5nfSwgJHtjb2wuYn0sICR7b3BhY2l0eX0pYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQXNSZ2JhKGNvbG9yOiBzdHJpbmcpOiBSR0JBIHtcbiAgY29uc3QgY29sID0gZDNjb2xvcihjb2xvcik7XG4gIGlmICghY29sKSB7XG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGNvbG9yOiAnLCBjb2xvcik7XG4gICAgcmV0dXJuIEZBTExCQUNLX0NPTE9SX1JHQkE7XG4gIH1cbiAgY29uc3QgcmdiQ29sb3IgPSBjb2wucmdiKCk7XG4gIHJldHVybiBbXG4gICAgTWF0aC5mbG9vcihyZ2JDb2xvci5yKSxcbiAgICBNYXRoLmZsb29yKHJnYkNvbG9yLmcpLFxuICAgIE1hdGguZmxvb3IocmdiQ29sb3IuYiksXG4gICAgb3BhY2l0eUZsb2F0VG9JbnRlZ2VyKGNvbC5vcGFjaXR5KSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gY29sb3JBc1JnYmFPcihcbiAgY29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdENvbG9yOiBSR0JBIHwgc3RyaW5nLFxuKTogUkdCQSB7XG4gIGlmIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvckFzUmdiYShjb2xvcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZhdWx0Q29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbG9yQXNSZ2JhKGRlZmF1bHRDb2xvcik7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRDb2xvcjtcbn1cblxuY29uc3QgYXNTY2hlbWUgPSAoc2NoZW1lOiBSZWFkb25seUFycmF5PFJlYWRvbmx5QXJyYXk8c3RyaW5nPj4pID0+XG4gIHNjaGVtZVtzY2hlbWUubGVuZ3RoIC0gMV0gYXMgc3RyaW5nW107XG5cbmV4cG9ydCBlbnVtIENvbG9yU2NoZW1lIHtcbiAgcHJpbWFyeSA9ICcjMTYyZDNjJyxcbn1cblxuY29uc3QgU0NBTEVfTlVNX1NURVBTID0gMjA7XG5jb25zdCBnZXRDb2xvclN0ZXBzID0gKGludGVycG9sYXRlOiAoeDogbnVtYmVyKSA9PiBzdHJpbmcpID0+XG4gIHJhbmdlKDAsIFNDQUxFX05VTV9TVEVQUyArIDEpXG4gICAgLm1hcCgoaSkgPT4gaW50ZXJwb2xhdGUoaSAvIFNDQUxFX05VTV9TVEVQUykpXG4gICAgLnJldmVyc2UoKTtcblxuY29uc3QgRkxPV19NSU5fQ09MT1IgPSAncmdiYSgyNDAsMjQwLDI0MCwwLjUpJztcbmV4cG9ydCBjb25zdCBCTFVFU19QQUxFID0gW0ZMT1dfTUlOX0NPTE9SLCBDb2xvclNjaGVtZS5wcmltYXJ5XTtcbmNvbnN0IHNjaGVtZUJsdVlsID0gW1xuICAnI2Y3ZmVhZScsXG4gICcjYjdlNmE1JyxcbiAgJyM3Y2NiYTInLFxuICAnIzQ2YWVhMCcsXG4gICcjMDg5MDk5JyxcbiAgJyMwMDcxOGInLFxuICAnIzA0NTI3NScsXG5dO1xuXG5jb25zdCBzY2hlbWVFbXJsZCA9IFtcbiAgJyNkM2YyYTMnLFxuICAnIzk3ZTE5NicsXG4gICcjNmNjMDhiJyxcbiAgJyM0YzliODInLFxuICAnIzIxN2E3OScsXG4gICcjMTA1OTY1JyxcbiAgJyMwNzQwNTAnLFxuXTtcblxuZXhwb3J0IGNvbnN0IHNjaGVtZVRlYWwgPSBbXG4gICcjZDFlZWVhJyxcbiAgJyNhOGRiZDknLFxuICAnIzg1YzRjOScsXG4gICcjNjhhYmI4JyxcbiAgJyM0ZjkwYTYnLFxuICAnIzNiNzM4ZicsXG4gICcjMmE1Njc0Jyxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTE9SX1NDSEVNRSA9IHNjaGVtZVRlYWw7XG5leHBvcnQgY29uc3QgQ09MT1JfU0NIRU1FUzoge1trZXk6IHN0cmluZ106IHN0cmluZ1tdfSA9IHtcbiAgQmx1ZXM6IGFzU2NoZW1lKHNjaGVtZUJsdWVzKSxcbiAgQmx1ZXNQYWxlOiBCTFVFU19QQUxFLFxuICBCbHVHcm46IFtcbiAgICAnI2M0ZTZjMycsXG4gICAgJyM5NmQyYTQnLFxuICAgICcjNmRiYzkwJyxcbiAgICAnIzRkYTI4NCcsXG4gICAgJyMzNjg3N2EnLFxuICAgICcjMjY2YjZlJyxcbiAgICAnIzFkNGY2MCcsXG4gIF0sXG4gIEJsdVlsOiBzY2hlbWVCbHVZbCxcbiAgQnJ3bllsOiBbXG4gICAgJyNlZGU1Y2YnLFxuICAgICcjZTBjMmEyJyxcbiAgICAnI2QzOWM4MycsXG4gICAgJyNjMTc2NmYnLFxuICAgICcjYTY1NDYxJyxcbiAgICAnIzgxMzc1MycsXG4gICAgJyM1NDFmM2YnLFxuICBdLFxuICBCdUduOiBhc1NjaGVtZShzY2hlbWVCdUduKSxcbiAgQnVQdTogYXNTY2hlbWUoc2NoZW1lQnVQdSksXG4gIEJ1cmc6IFtcbiAgICAnI2ZmYzZjNCcsXG4gICAgJyNmNGEzYTgnLFxuICAgICcjZTM4MTkxJyxcbiAgICAnI2NjNjA3ZCcsXG4gICAgJyNhZDQ2NmMnLFxuICAgICcjOGIzMDU4JyxcbiAgICAnIzY3MjA0NCcsXG4gIF0sXG4gIEJ1cmdZbDogW1xuICAgICcjZmJlNmM1JyxcbiAgICAnI2Y1YmE5OCcsXG4gICAgJyNlZThhODInLFxuICAgICcjZGM3MTc2JyxcbiAgICAnI2M4NTg2YycsXG4gICAgJyM5YzNmNWQnLFxuICAgICcjNzAyODRhJyxcbiAgXSxcbiAgQ29vbDogZ2V0Q29sb3JTdGVwcyhpbnRlcnBvbGF0ZUNvb2wpLFxuICBEYXJrTWludDogW1xuICAgICcjZDJmYmQ0JyxcbiAgICAnI2E1ZGJjMicsXG4gICAgJyM3YmJjYjAnLFxuICAgICcjNTU5YzllJyxcbiAgICAnIzNhN2M4OScsXG4gICAgJyMyMzVkNzInLFxuICAgICcjMTIzZjVhJyxcbiAgXSxcbiAgRW1ybGQ6IHNjaGVtZUVtcmxkLFxuICBHbkJ1OiBhc1NjaGVtZShzY2hlbWVHbkJ1KSxcbiAgR3JlZW5zOiBhc1NjaGVtZShzY2hlbWVHcmVlbnMpLFxuICBHcmV5czogYXNTY2hlbWUoc2NoZW1lR3JleXMpLFxuICBJbmZlcm5vOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlSW5mZXJubyksXG4gIE1hZ2VudGE6IFtcbiAgICAnI2YzY2JkMycsXG4gICAgJyNlYWE5YmQnLFxuICAgICcjZGQ4OGFjJyxcbiAgICAnI2NhNjk5ZCcsXG4gICAgJyNiMTRkOGUnLFxuICAgICcjOTEzNTdkJyxcbiAgICAnIzZjMjE2NycsXG4gIF0sXG4gIE1hZ21hOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlTWFnbWEpLFxuICBNaW50OiBbXG4gICAgJyNlNGYxZTEnLFxuICAgICcjYjRkOWNjJyxcbiAgICAnIzg5YzBiNicsXG4gICAgJyM2M2E2YTAnLFxuICAgICcjNDQ4YzhhJyxcbiAgICAnIzI4NzI3NCcsXG4gICAgJyMwZDU4NWYnLFxuICBdLFxuICBPcmFuZ2VzOiBhc1NjaGVtZShzY2hlbWVPcmFuZ2VzKSxcbiAgT3JSZDogYXNTY2hlbWUoc2NoZW1lT3JSZCksXG4gIE9yWWVsOiBbXG4gICAgJyNlY2RhOWEnLFxuICAgICcjZWZjNDdlJyxcbiAgICAnI2YzYWQ2YScsXG4gICAgJyNmNzk0NWQnLFxuICAgICcjZjk3YjU3JyxcbiAgICAnI2Y2NjM1NicsXG4gICAgJyNlZTRkNWEnLFxuICBdLFxuICBQZWFjaDogW1xuICAgICcjZmRlMGM1JyxcbiAgICAnI2ZhY2JhNicsXG4gICAgJyNmOGI1OGInLFxuICAgICcjZjU5ZTcyJyxcbiAgICAnI2YyODU1ZCcsXG4gICAgJyNlZjZhNGMnLFxuICAgICcjZWI0YTQwJyxcbiAgXSxcbiAgUGxhc21hOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlUGxhc21hKSxcbiAgUGlua1lsOiBbXG4gICAgJyNmZWY2YjUnLFxuICAgICcjZmZkZDlhJyxcbiAgICAnI2ZmYzI4NScsXG4gICAgJyNmZmE2NzknLFxuICAgICcjZmE4YTc2JyxcbiAgICAnI2YxNmQ3YScsXG4gICAgJyNlMTUzODMnLFxuICBdLFxuICBQdUJ1OiBhc1NjaGVtZShzY2hlbWVQdUJ1KSxcbiAgUHVCdUduOiBhc1NjaGVtZShzY2hlbWVQdUJ1R24pLFxuICBQdVJkOiBhc1NjaGVtZShzY2hlbWVQdVJkKSxcbiAgUHVycDogW1xuICAgICcjZjNlMGY3JyxcbiAgICAnI2U0YzdmMScsXG4gICAgJyNkMWFmZTgnLFxuICAgICcjYjk5OGRkJyxcbiAgICAnIzlmODJjZScsXG4gICAgJyM4MjZkYmEnLFxuICAgICcjNjM1ODlmJyxcbiAgXSxcbiAgUHVycGxlczogYXNTY2hlbWUoc2NoZW1lUHVycGxlcyksXG4gIFB1cnBPcjogW1xuICAgICcjZjlkZGRhJyxcbiAgICAnI2YyYjljNCcsXG4gICAgJyNlNTk3YjknLFxuICAgICcjY2U3OGIzJyxcbiAgICAnI2FkNWZhZCcsXG4gICAgJyM4MzRiYTAnLFxuICAgICcjNTczYjg4JyxcbiAgXSxcbiAgUmRQdTogYXNTY2hlbWUoc2NoZW1lUmRQdSksXG4gIFJlZE9yOiBbXG4gICAgJyNmNmQyYTknLFxuICAgICcjZjViNzhlJyxcbiAgICAnI2YxOWM3YycsXG4gICAgJyNlYTgxNzEnLFxuICAgICcjZGQ2ODZjJyxcbiAgICAnI2NhNTI2OCcsXG4gICAgJyNiMTNmNjQnLFxuICBdLFxuICBSZWRzOiBhc1NjaGVtZShzY2hlbWVSZWRzKSxcbiAgU3Vuc2V0OiBbXG4gICAgJyNmM2U3OWInLFxuICAgICcjZmFjNDg0JyxcbiAgICAnI2Y4YTA3ZScsXG4gICAgJyNlYjdmODYnLFxuICAgICcjY2U2NjkzJyxcbiAgICAnI2EwNTlhMCcsXG4gICAgJyM1YzUzYTUnLFxuICBdLFxuICBTdW5zZXREYXJrOiBbXG4gICAgJyNmY2RlOWMnLFxuICAgICcjZmFhNDc2JyxcbiAgICAnI2YwNzQ2ZScsXG4gICAgJyNlMzRmNmYnLFxuICAgICcjZGMzOTc3JyxcbiAgICAnI2I5MjU3YScsXG4gICAgJyM3YzFkNmYnLFxuICBdLFxuICBUZWFsOiBzY2hlbWVUZWFsLFxuICBUZWFsR3JuOiBbXG4gICAgJyNiMGYyYmMnLFxuICAgICcjODllOGFjJyxcbiAgICAnIzY3ZGJhNScsXG4gICAgJyM0Y2M4YTMnLFxuICAgICcjMzhiMmEzJyxcbiAgICAnIzJjOThhMCcsXG4gICAgJyMyNTdkOTgnLFxuICBdLFxuICBWaXJpZGlzOiBnZXRDb2xvclN0ZXBzKGludGVycG9sYXRlVmlyaWRpcyksXG4gIFdhcm06IGdldENvbG9yU3RlcHMoaW50ZXJwb2xhdGVXYXJtKSxcbiAgWWxHbjogYXNTY2hlbWUoc2NoZW1lWWxHbiksXG4gIFlsR25CdTogYXNTY2hlbWUoc2NoZW1lWWxHbkJ1KSxcbiAgWWxPckJyOiBhc1NjaGVtZShzY2hlbWVZbE9yQnIpLFxuICBZbE9yUmQ6IGFzU2NoZW1lKHNjaGVtZVlsT3JSZCksXG59O1xuXG5leHBvcnQgY29uc3QgQ09MT1JfU0NIRU1FX0tFWVMgPSBPYmplY3Qua2V5cyhDT0xPUl9TQ0hFTUVTKTtcblxuY29uc3QgY29tcGxlbWVudGFyeSA9ICcjZjUyMDIwJztcbmNvbnN0IGJhc2VEaWZmQ29sb3IgPSAnIzE3YTViZSc7XG5cbmNvbnN0IGRpZmZDb2xvcnM6IERpZmZDb2xvcnMgPSB7XG4gIG5lZ2F0aXZlOiB7XG4gICAgZmxvd3M6IHtcbiAgICAgIHNjaGVtZTogW0ZMT1dfTUlOX0NPTE9SLCBiYXNlRGlmZkNvbG9yXSxcbiAgICB9LFxuICB9LFxuICBwb3NpdGl2ZToge1xuICAgIGZsb3dzOiB7XG4gICAgICBzY2hlbWU6IFtGTE9XX01JTl9DT0xPUiwgY29tcGxlbWVudGFyeV0sXG4gICAgfSxcbiAgfSxcbiAgbG9jYXRpb25BcmVhczoge1xuICAgIG91dGxpbmU6ICdyZ2JhKDkyLDExMiwxMjgsMC41KScsXG4gICAgbm9ybWFsOiAncmdiYSgyMjAsMjIwLDIyMCwwLjUpJyxcbiAgfSxcbiAgb3V0bGluZUNvbG9yOiAncmdiKDIzMCwyMzMsMjM3KScsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmxvd01hcENvbG9ycyhcbiAgc2V0dGluZ3NTdGF0ZTogU2V0dGluZ3NTdGF0ZSxcbik6IENvbG9ycyB8IERpZmZDb2xvcnMge1xuICByZXR1cm4gZ2V0Q29sb3JzKFxuICAgIGZhbHNlLCAvLyBUT0RPOiBkaWZmTW9kZVxuICAgIHNldHRpbmdzU3RhdGUuY29sb3JTY2hlbWUsXG4gICAgc2V0dGluZ3NTdGF0ZS5kYXJrTW9kZSxcbiAgICBzZXR0aW5nc1N0YXRlLmZhZGVFbmFibGVkLFxuICAgIHNldHRpbmdzU3RhdGUuZmFkZUFtb3VudCxcbiAgICBzZXR0aW5nc1N0YXRlLmFuaW1hdGlvbkVuYWJsZWQsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvcnMoXG4gIGRpZmZNb2RlOiBib29sZWFuLFxuICBzY2hlbWVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGFya01vZGU6IGJvb2xlYW4sXG4gIGZhZGVFbmFibGVkOiBib29sZWFuLFxuICBmYWRlQW1vdW50OiBudW1iZXIsXG4gIGFuaW1hdGU6IGJvb2xlYW4sXG4pOiBDb2xvcnMgfCBEaWZmQ29sb3JzIHtcbiAgaWYgKGRpZmZNb2RlKSB7XG4gICAgcmV0dXJuIGRpZmZDb2xvcnM7XG4gIH1cblxuICBsZXQgc2NoZW1lID0gKHNjaGVtZUtleSAmJiBDT0xPUl9TQ0hFTUVTW3NjaGVtZUtleV0pIHx8IERFRkFVTFRfQ09MT1JfU0NIRU1FO1xuXG4gIGlmIChkYXJrTW9kZSkge1xuICAgIHNjaGVtZSA9IHNjaGVtZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuICAvLyBpZiAoYW5pbWF0ZSlcbiAgLy8gaWYgKGZhZGVBbW91bnQgPiAwKVxuICB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHJhbmdlKDAsIE1hdGgubWF4KDEwLCBzY2hlbWUubGVuZ3RoKSk7XG4gICAgY29uc3QgTiA9IGluZGljZXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBjb2xvclNjYWxlID0gc2NhbGVTZXF1ZW50aWFsKGludGVycG9sYXRlUmdiQmFzaXMoc2NoZW1lKSkuZG9tYWluKFtcbiAgICAgIDAsXG4gICAgICBOLFxuICAgIF0pO1xuXG4gICAgaWYgKCFmYWRlRW5hYmxlZCB8fCBmYWRlQW1vdW50ID09PSAwKSB7XG4gICAgICBzY2hlbWUgPSBpbmRpY2VzLm1hcCgoYywgaSkgPT4gY29sb3JTY2FsZShpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHNjYWxlUG93KClcbiAgICAgICAgLy8gLmV4cG9uZW50KGFuaW1hdGUgPyAxIDogMS8yLjUpXG4gICAgICAgIC8vIC5leHBvbmVudChhbmltYXRlID8gMTAwIDogNTApXG4gICAgICAgIC8vIC5leHBvbmVudChhbmltYXRlID8gMjAgOiA1KVxuICAgICAgICAvLyAuZXhwb25lbnQoMS8yLjUpXG4gICAgICAgIC5leHBvbmVudCgxLjUpXG4gICAgICAgIC5kb21haW4oW04sIDBdKVxuICAgICAgICAvLyAucmFuZ2UoW2ZhZGVBbW91bnQvMTAwKihhbmltYXRlPzI6MSksIDBdKVxuICAgICAgICAvLyAucmFuZ2UoWzAsIGZhZGVBbW91bnQvMTAwKihhbmltYXRlPzI6MSldKVxuICAgICAgICAvLyAucmFuZ2UoZGFya01vZGUgPyBbMS1mYWRlQW1vdW50LzEwMCwgMV0gOiBbMSwgMSAtIGZhZGVBbW91bnQvMTAwXSlcbiAgICAgICAgLy8gLnJhbmdlKGRhcmtNb2RlID8gWzEgLSBmYWRlQW1vdW50LzEwMCwgMV0gOiBbZmFkZUFtb3VudC8xMDAsIDBdKVxuICAgICAgICAvLyAucmFuZ2UoWzEgLSBmYWRlQW1vdW50LzEwMCwgMV0pXG4gICAgICAgIC5yYW5nZShbMCwgKDIgKiBmYWRlQW1vdW50KSAvIDEwMF0pO1xuXG4gICAgICBzY2hlbWUgPSBpbmRpY2VzLm1hcChcbiAgICAgICAgKGMsIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNvbG9yU2NhbGUoaSk7XG4gICAgICAgICAgY29uc3QgYWxwaGEgPSBhbW91bnQoaSk7XG4gICAgICAgICAgaWYgKGNvbG9yID09IG51bGwgfHwgYWxwaGEgPT0gbnVsbCkgcmV0dXJuICcjMDAwJztcbiAgICAgICAgICBjb25zdCBjb2wgPSBoY2woY29sb3IpO1xuICAgICAgICAgIGNvbC5sID0gZGFya01vZGVcbiAgICAgICAgICAgID8gY29sLmwgLSBjb2wubCAqIGFscGhhXG4gICAgICAgICAgICA6IGNvbC5sICsgKDEwMCAtIGNvbC5sKSAqIGFscGhhO1xuICAgICAgICAgIGNvbC5jID0gY29sLmMgLSBjb2wuYyAqIChhbHBoYSAvIDQpO1xuICAgICAgICAgIHJldHVybiBjb2wudG9TdHJpbmcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gaW50ZXJwb2xhdGVSZ2JCYXNpcyhbY29sb3JTY2FsZShpKSwgZGFya01vZGUgPyAnIzAwMCcgOiAnI2ZmZiddKShhbW91bnQoaSkpXG4gICAgICAgIC8vIGludGVycG9sYXRlSHNsKGNvbG9yU2NhbGUoaSksIGRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnKShhbW91bnQoaSkpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXJrTW9kZSxcbiAgICBmbG93czoge1xuICAgICAgc2NoZW1lLFxuICAgIH0sXG4gICAgbG9jYXRpb25DaXJjbGVzOiB7XG4gICAgICBvdXRnb2luZzogZGFya01vZGUgPyAnIzAwMCcgOiAnI2ZmZicsXG4gICAgfSxcbiAgICBvdXRsaW5lQ29sb3I6IGRhcmtNb2RlID8gJyMwMDAnIDogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC41KScsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgZG9tYWluOiBbbnVtYmVyLCBudW1iZXJdLFxuICBzY2hlbWU6IHN0cmluZ1tdLFxuICBhbmltYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogQ29sb3JTY2FsZSB7XG4gIGNvbnN0IHNjYWxlID0gc2NhbGVTZXF1ZW50aWFsUG93KGludGVycG9sYXRlUmdiQmFzaXMoc2NoZW1lKSlcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLmV4cG9uZW50KGFuaW1hdGUgPyAxIC8gMiA6IDEgLyAzKVxuICAgIC5kb21haW4oZG9tYWluKTtcbiAgcmV0dXJuICh2YWx1ZTogbnVtYmVyKSA9PiBjb2xvckFzUmdiYShzY2FsZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmxvd0NvbG9yU2NhbGUoXG4gIGNvbG9yczogQ29sb3JzUkdCQSB8IERpZmZDb2xvcnNSR0JBLFxuICBtYWduaXR1ZGVFeHRlbnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsXG4gIGFuaW1hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pOiAobWFnbml0dWRlOiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWluTWFnbml0dWRlID0gbWFnbml0dWRlRXh0ZW50ID8gbWFnbml0dWRlRXh0ZW50WzBdIDogMDtcbiAgY29uc3QgbWF4TWFnbml0dWRlID0gbWFnbml0dWRlRXh0ZW50ID8gbWFnbml0dWRlRXh0ZW50WzFdIDogMDtcbiAgaWYgKGlzRGlmZkNvbG9yc1JHQkEoY29sb3JzKSkge1xuICAgIGNvbnN0IHBvc1NjYWxlID0gY3JlYXRlRmxvd0NvbG9yU2NhbGUoXG4gICAgICBbMCwgbWF4TWFnbml0dWRlXSxcbiAgICAgIGNvbG9ycy5wb3NpdGl2ZS5mbG93cy5zY2hlbWUsXG4gICAgICBhbmltYXRlLFxuICAgICk7XG4gICAgY29uc3QgbmVnU2NhbGUgPSBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgICAgIFswLCBtaW5NYWduaXR1ZGVdLFxuICAgICAgY29sb3JzLm5lZ2F0aXZlLmZsb3dzLnNjaGVtZSxcbiAgICAgIGFuaW1hdGUsXG4gICAgKTtcblxuICAgIHJldHVybiAobWFnbml0dWRlOiBudW1iZXIpID0+XG4gICAgICBtYWduaXR1ZGUgPj0gMCA/IHBvc1NjYWxlKG1hZ25pdHVkZSkgOiBuZWdTY2FsZShtYWduaXR1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc2NhbGUgPSBjcmVhdGVGbG93Q29sb3JTY2FsZShcbiAgICBbMCwgbWF4TWFnbml0dWRlIHx8IDBdLFxuICAgIGNvbG9ycy5mbG93cy5zY2hlbWUsXG4gICAgYW5pbWF0ZSxcbiAgKTtcbiAgcmV0dXJuIChtYWduaXR1ZGU6IG51bWJlcikgPT4gc2NhbGUobWFnbml0dWRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlmZkNvbG9ycyhcbiAgY29sb3JzOiBEaWZmQ29sb3JzIHwgQ29sb3JzLFxuKTogY29sb3JzIGlzIERpZmZDb2xvcnMge1xuICByZXR1cm4gKGNvbG9ycyBhcyBEaWZmQ29sb3JzKS5wb3NpdGl2ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWZmQ29sb3JzUkdCQShcbiAgY29sb3JzOiBEaWZmQ29sb3JzUkdCQSB8IENvbG9yc1JHQkEsXG4pOiBjb2xvcnMgaXMgRGlmZkNvbG9yc1JHQkEge1xuICByZXR1cm4gKGNvbG9ycyBhcyBEaWZmQ29sb3JzUkdCQSkucG9zaXRpdmUgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYXRpb25BcmVhQ29sb3JzUkdCQShcbiAgY29sb3JzOiBMb2NhdGlvbkFyZWFDb2xvcnMgfCB1bmRlZmluZWQsXG4gIGRhcmtNb2RlOiBib29sZWFuLFxuKTogTG9jYXRpb25BcmVhQ29sb3JzUkdCQSB7XG4gIGNvbnN0IG5vcm1hbENvbG9yID0gKGNvbG9ycyAmJiBjb2xvcnMubm9ybWFsKSB8fCBERUZBVUxUX0xPQ0FUSU9OX0FSRUFfQ09MT1I7XG4gIGNvbnN0IG5vcm1hbENvbG9ySGNsID0gaGNsKG5vcm1hbENvbG9yKTtcbiAgY29uc3QgbG9jYXRpb25BcmVhc05vcm1hbCA9IGNvbG9yQXNSZ2JhKG5vcm1hbENvbG9yKTtcbiAgcmV0dXJuIHtcbiAgICBub3JtYWw6IGxvY2F0aW9uQXJlYXNOb3JtYWwsXG4gICAgY29ubmVjdGVkOiBjb2xvckFzUmdiYU9yKGNvbG9ycyAmJiBjb2xvcnMuY29ubmVjdGVkLCBsb2NhdGlvbkFyZWFzTm9ybWFsKSxcbiAgICBoaWdobGlnaHRlZDogY29sb3JBc1JnYmFPcihcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMuaGlnaGxpZ2h0ZWQsXG4gICAgICBvcGFjaWZ5SGV4KFxuICAgICAgICBub3JtYWxDb2xvckhjbFtkYXJrTW9kZSA/ICdicmlnaHRlcicgOiAnZGFya2VyJ10oMSkudG9TdHJpbmcoKSxcbiAgICAgICAgMC41LFxuICAgICAgKSxcbiAgICApLFxuICAgIHNlbGVjdGVkOiBjb2xvckFzUmdiYU9yKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5zZWxlY3RlZCxcbiAgICAgIG9wYWNpZnlIZXgoXG4gICAgICAgIG5vcm1hbENvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgyKS50b1N0cmluZygpLFxuICAgICAgICAwLjgsXG4gICAgICApLFxuICAgICksXG4gICAgb3V0bGluZTogY29sb3JBc1JnYmFPcihcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMub3V0bGluZSxcbiAgICAgIGNvbG9yQXNSZ2JhKFxuICAgICAgICBub3JtYWxDb2xvckhjbFtkYXJrTW9kZSA/ICdicmlnaHRlcicgOiAnZGFya2VyJ10oNCkudG9TdHJpbmcoKSxcbiAgICAgICksXG4gICAgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbG93Q29sb3JzIHtcbiAgc2NoZW1lPzogc3RyaW5nW107XG4gIGhpZ2hsaWdodGVkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQ2lyY2xlQ29sb3JzIHtcbiAgaW5uZXI/OiBzdHJpbmc7XG4gIG91dGdvaW5nPzogc3RyaW5nO1xuICBpbmNvbWluZz86IHN0cmluZztcbiAgaGlnaGxpZ2h0ZWQ/OiBzdHJpbmc7XG4gIGVtcHR5Pzogc3RyaW5nO1xuICBlbXB0eU91dGxpbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25BcmVhQ29sb3JzIHtcbiAgb3V0bGluZT86IHN0cmluZztcbiAgbm9ybWFsPzogc3RyaW5nO1xuICBzZWxlY3RlZD86IHN0cmluZztcbiAgaGlnaGxpZ2h0ZWQ/OiBzdHJpbmc7XG4gIGNvbm5lY3RlZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29sb3JzIHtcbiAgZGFya01vZGU/OiBib29sZWFuO1xuICBsb2NhdGlvbkFyZWFzPzogTG9jYXRpb25BcmVhQ29sb3JzO1xuICBkaW1tZWRPcGFjaXR5PzogbnVtYmVyO1xuICBvdXRsaW5lQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JzIGV4dGVuZHMgQmFzZUNvbG9ycyB7XG4gIGZsb3dzPzogRmxvd0NvbG9ycztcbiAgbG9jYXRpb25DaXJjbGVzPzogTG9jYXRpb25DaXJjbGVDb2xvcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0FuZENpcmNsZUNvbG9ycyB7XG4gIGZsb3dzPzogRmxvd0NvbG9ycztcbiAgbG9jYXRpb25DaXJjbGVzPzogTG9jYXRpb25DaXJjbGVDb2xvcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlmZkNvbG9ycyBleHRlbmRzIEJhc2VDb2xvcnMge1xuICBwb3NpdGl2ZT86IEZsb3dBbmRDaXJjbGVDb2xvcnM7XG4gIG5lZ2F0aXZlPzogRmxvd0FuZENpcmNsZUNvbG9ycztcbn1cblxuLy8gVGhlIHh4eENvbG9yc1JHQkEgb2JqZWN0cyBhcmUgbWlycm9yaW5nIHRoZSBpbnB1dCBjb2xvcnMnIG9iamVjdHMsXG4vLyBidXQgY29udmVydGVkIHRvIFJHQkEgYW5kIHdpdGggYWxsIHRoZSBvbWl0dGVkIG9uZXMgc2V0IHRvIGRlZmF1bHRzXG4vLyBvciBkZXJpdmVkLlxuZXhwb3J0IGludGVyZmFjZSBGbG93Q29sb3JzUkdCQSB7XG4gIHNjaGVtZTogc3RyaW5nW107XG4gIGhpZ2hsaWdodGVkOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQ2lyY2xlQ29sb3JzUkdCQSB7XG4gIGlubmVyOiBSR0JBO1xuICBvdXRnb2luZzogUkdCQTtcbiAgaW5jb21pbmc6IFJHQkE7XG4gIGhpZ2hsaWdodGVkOiBSR0JBO1xuICBlbXB0eTogUkdCQTtcbiAgZW1wdHlPdXRsaW5lOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uQXJlYUNvbG9yc1JHQkEge1xuICBvdXRsaW5lOiBSR0JBO1xuICBub3JtYWw6IFJHQkE7XG4gIHNlbGVjdGVkOiBSR0JBO1xuICBoaWdobGlnaHRlZDogUkdCQTtcbiAgY29ubmVjdGVkOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb2xvcnNSR0JBIHtcbiAgZGFya01vZGU6IGJvb2xlYW47XG4gIGxvY2F0aW9uQXJlYXM6IExvY2F0aW9uQXJlYUNvbG9yc1JHQkE7XG4gIGRpbW1lZE9wYWNpdHk6IG51bWJlcjtcbiAgb3V0bGluZUNvbG9yOiBSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yc1JHQkEgZXh0ZW5kcyBCYXNlQ29sb3JzUkdCQSB7XG4gIGZsb3dzOiBGbG93Q29sb3JzUkdCQTtcbiAgbG9jYXRpb25DaXJjbGVzOiBMb2NhdGlvbkNpcmNsZUNvbG9yc1JHQkE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0FuZENpcmNsZUNvbG9yc1JHQkEge1xuICBmbG93czogRmxvd0NvbG9yc1JHQkE7XG4gIGxvY2F0aW9uQ2lyY2xlczogTG9jYXRpb25DaXJjbGVDb2xvcnNSR0JBO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpZmZDb2xvcnNSR0JBIGV4dGVuZHMgQmFzZUNvbG9yc1JHQkEge1xuICBwb3NpdGl2ZTogRmxvd0FuZENpcmNsZUNvbG9yc1JHQkE7XG4gIG5lZ2F0aXZlOiBGbG93QW5kQ2lyY2xlQ29sb3JzUkdCQTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmxvd0FuZENpcmNsZUNvbG9ycyhcbiAgaW5wdXRDb2xvcnM6IEZsb3dBbmRDaXJjbGVDb2xvcnMgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRGbG93Q29sb3JTY2hlbWU6IHN0cmluZ1tdLFxuICBkYXJrTW9kZTogYm9vbGVhbixcbik6IEZsb3dBbmRDaXJjbGVDb2xvcnNSR0JBIHtcbiAgY29uc3QgZmxvd0NvbG9yU2NoZW1lID1cbiAgICAoaW5wdXRDb2xvcnMgJiYgaW5wdXRDb2xvcnMuZmxvd3MgJiYgaW5wdXRDb2xvcnMuZmxvd3Muc2NoZW1lKSB8fFxuICAgIGRlZmF1bHRGbG93Q29sb3JTY2hlbWU7XG4gIGNvbnN0IG1heEZsb3dDb2xvckhjbCA9IGhjbChmbG93Q29sb3JTY2hlbWVbZmxvd0NvbG9yU2NoZW1lLmxlbmd0aCAtIDFdKTtcbiAgY29uc3QgZmxvd0NvbG9ySGlnaGxpZ2h0ZWQgPSBjb2xvckFzUmdiYU9yKFxuICAgIGlucHV0Q29sb3JzICYmIGlucHV0Q29sb3JzLmZsb3dzICYmIGlucHV0Q29sb3JzLmZsb3dzLmhpZ2hsaWdodGVkLFxuICAgIGNvbG9yQXNSZ2JhKFxuICAgICAgbWF4Rmxvd0NvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgwLjcpLnRvU3RyaW5nKCksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdCBlbXB0eUNvbG9yID0gY29sb3JBc1JnYmFPcihcbiAgICBpbnB1dENvbG9ycz8ubG9jYXRpb25DaXJjbGVzPy5lbXB0eSxcbiAgICBkYXJrTW9kZSA/ICcjMDAwJyA6ICcjZmZmJyxcbiAgKTtcbiAgY29uc3QgaW5uZXJDb2xvciA9IGNvbG9yQXNSZ2JhT3IoXG4gICAgaW5wdXRDb2xvcnMgJiZcbiAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgaW5wdXRDb2xvcnMubG9jYXRpb25DaXJjbGVzLmlubmVyLFxuICAgIG1heEZsb3dDb2xvckhjbC50b1N0cmluZygpLFxuICApO1xuICByZXR1cm4ge1xuICAgIGZsb3dzOiB7XG4gICAgICBzY2hlbWU6IGZsb3dDb2xvclNjaGVtZSxcbiAgICAgIGhpZ2hsaWdodGVkOiBmbG93Q29sb3JIaWdobGlnaHRlZCxcbiAgICB9LFxuICAgIGxvY2F0aW9uQ2lyY2xlczoge1xuICAgICAgaW5uZXI6IGlubmVyQ29sb3IsXG4gICAgICBvdXRnb2luZzogY29sb3JBc1JnYmFPcihcbiAgICAgICAgaW5wdXRDb2xvcnMgJiZcbiAgICAgICAgICBpbnB1dENvbG9ycy5sb2NhdGlvbkNpcmNsZXMgJiZcbiAgICAgICAgICBpbnB1dENvbG9ycy5sb2NhdGlvbkNpcmNsZXMub3V0Z29pbmcsXG4gICAgICAgIGRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnLFxuICAgICAgKSxcbiAgICAgIGluY29taW5nOiBjb2xvckFzUmdiYU9yKFxuICAgICAgICBpbnB1dENvbG9ycyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcy5pbmNvbWluZyxcbiAgICAgICAgbWF4Rmxvd0NvbG9ySGNsW2RhcmtNb2RlID8gJ2JyaWdodGVyJyA6ICdkYXJrZXInXSgxLjI1KS50b1N0cmluZygpLFxuICAgICAgKSxcbiAgICAgIGhpZ2hsaWdodGVkOiBjb2xvckFzUmdiYU9yKFxuICAgICAgICBpbnB1dENvbG9ycyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcyAmJlxuICAgICAgICAgIGlucHV0Q29sb3JzLmxvY2F0aW9uQ2lyY2xlcy5oaWdobGlnaHRlZCxcbiAgICAgICAgZmxvd0NvbG9ySGlnaGxpZ2h0ZWQsXG4gICAgICApLFxuICAgICAgZW1wdHk6IGVtcHR5Q29sb3IsXG4gICAgICBlbXB0eU91dGxpbmU6IG1peENvbG9yc1JHQkEoaW5uZXJDb2xvciwgZW1wdHlDb2xvciwgMC40KSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCYXNlQ29sb3JzUkdCQShcbiAgY29sb3JzOiBDb2xvcnMgfCBEaWZmQ29sb3JzIHwgdW5kZWZpbmVkLFxuKTogQmFzZUNvbG9yc1JHQkEge1xuICBjb25zdCBkYXJrTW9kZSA9IGNvbG9ycyAmJiBjb2xvcnMuZGFya01vZGUgPyB0cnVlIDogZmFsc2U7XG4gIHJldHVybiB7XG4gICAgZGFya01vZGUsXG4gICAgbG9jYXRpb25BcmVhczogZ2V0TG9jYXRpb25BcmVhQ29sb3JzUkdCQShcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMubG9jYXRpb25BcmVhcyxcbiAgICAgIGRhcmtNb2RlLFxuICAgICksXG4gICAgb3V0bGluZUNvbG9yOiBjb2xvckFzUmdiYShcbiAgICAgIChjb2xvcnMgJiYgY29sb3JzLm91dGxpbmVDb2xvcikgfHwgREVGQVVMVF9PVVRMSU5FX0NPTE9SLFxuICAgICksXG4gICAgZGltbWVkT3BhY2l0eTpcbiAgICAgIGNvbG9ycyAmJiBjb2xvcnMuZGltbWVkT3BhY2l0eSAhPSBudWxsXG4gICAgICAgID8gY29sb3JzLmRpbW1lZE9wYWNpdHlcbiAgICAgICAgOiBERUZBVUxUX0RJTU1FRF9PUEFDSVRZLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sb3JzUkdCQShjb2xvcnM6IENvbG9ycyB8IHVuZGVmaW5lZCk6IENvbG9yc1JHQkEge1xuICBjb25zdCBiYXNlQ29sb3JzUkdCQSA9IGdldEJhc2VDb2xvcnNSR0JBKGNvbG9ycyk7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbG9yc1JHQkEsXG4gICAgLi4uZ2V0Rmxvd0FuZENpcmNsZUNvbG9ycyhcbiAgICAgIGNvbG9ycyxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlmZkNvbG9yc1JHQkEoXG4gIGNvbG9yczogRGlmZkNvbG9ycyB8IHVuZGVmaW5lZCxcbik6IERpZmZDb2xvcnNSR0JBIHtcbiAgY29uc3QgYmFzZUNvbG9yc1JHQkEgPSBnZXRCYXNlQ29sb3JzUkdCQShjb2xvcnMpO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VDb2xvcnNSR0JBLFxuICAgIHBvc2l0aXZlOiBnZXRGbG93QW5kQ2lyY2xlQ29sb3JzKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5wb3NpdGl2ZSxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUVfUE9TSVRJVkUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICAgIG5lZ2F0aXZlOiBnZXRGbG93QW5kQ2lyY2xlQ29sb3JzKFxuICAgICAgY29sb3JzICYmIGNvbG9ycy5uZWdhdGl2ZSxcbiAgICAgIERFRkFVTFRfRkxPV19DT0xPUl9TQ0hFTUVfTkVHQVRJVkUsXG4gICAgICBiYXNlQ29sb3JzUkdCQS5kYXJrTW9kZSxcbiAgICApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiYUFzU3RyaW5nKGNvbG9yOiBSR0JBKTogc3RyaW5nIHtcbiAgcmV0dXJuIGByZ2JhKCR7Y29sb3Iuam9pbignLCcpfSlgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlkcG9pbnQoYTogbnVtYmVyLCBiOiBudW1iZXIsIHplcm9Ub09uZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEgKyAoYiAtIGEpICogemVyb1RvT25lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4Q29sb3JzUkdCQShcbiAgY29sb3IxOiBSR0JBLFxuICBjb2xvcjI6IFJHQkEsXG4gIHplcm9Ub09uZTogbnVtYmVyLFxuKTogUkdCQSB7XG4gIHJldHVybiBjb2xvcjEubWFwKCh2LCBpKSA9PiBtaWRwb2ludCh2LCBjb2xvcjJbaV0sIHplcm9Ub09uZSkpIGFzIFJHQkE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldENvbG9ycztcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FeatureCollection, GeometryCollection, GeometryObject } from 'geojson';
|
|
2
|
+
import { ViewState } from './types';
|
|
3
|
+
export declare type LocationProperties = any;
|
|
4
|
+
export declare function getViewStateForFeatures(featureCollection: FeatureCollection<GeometryObject, LocationProperties> | GeometryCollection, size: [number, number], opts?: {
|
|
5
|
+
pad?: number;
|
|
6
|
+
tileSize?: number;
|
|
7
|
+
minZoom?: number;
|
|
8
|
+
maxZoom?: number;
|
|
9
|
+
}): ViewState;
|
|
10
|
+
export declare function getViewStateForLocations(locations: any[], getLocationCentroid: (location: any) => [number, number], size: [number, number], opts?: {
|
|
11
|
+
pad?: number;
|
|
12
|
+
tileSize?: number;
|
|
13
|
+
minZoom?: number;
|
|
14
|
+
maxZoom?: number;
|
|
15
|
+
}): ViewState;
|
|
16
|
+
//# sourceMappingURL=getViewStateForLocations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getViewStateForLocations.d.ts","sourceRoot":"","sources":["../src/getViewStateForLocations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAElC,oBAAY,kBAAkB,GAAG,GAAG,CAAC;AAErC,wBAAgB,uBAAuB,CACrC,iBAAiB,EACb,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,CAAC,GACrD,kBAAkB,EACtB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,SAAS,CAqBX;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,GAAG,EAAE,EAChB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACxD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACtB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,SAAS,CAYX"}
|