@kepler.gl/utils 3.1.0-alpha.1 → 3.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aggregation.d.ts +13 -0
- package/dist/aggregation.js +84 -0
- package/dist/application-config.d.ts +25 -0
- package/dist/application-config.js +52 -0
- package/dist/arrow-data-container.d.ts +62 -0
- package/dist/arrow-data-container.js +331 -0
- package/dist/color-utils.d.ts +108 -0
- package/dist/color-utils.js +443 -0
- package/dist/data-container-interface.d.ts +138 -0
- package/dist/data-container-interface.js +6 -0
- package/dist/data-container-utils.d.ts +30 -0
- package/dist/data-container-utils.js +74 -0
- package/dist/data-row.d.ts +59 -0
- package/dist/data-row.js +110 -0
- package/dist/data-scale-utils.d.ts +120 -0
- package/dist/data-scale-utils.js +340 -0
- package/dist/data-utils.d.ts +98 -0
- package/dist/data-utils.js +436 -0
- package/dist/dataset-utils.d.ts +45 -0
- package/dist/dataset-utils.js +313 -0
- package/dist/dom-to-image.d.ts +73 -0
- package/dist/dom-to-image.js +421 -0
- package/dist/dom-utils.d.ts +23 -0
- package/dist/dom-utils.js +349 -0
- package/dist/effect-utils.d.ts +24 -0
- package/dist/effect-utils.js +166 -0
- package/dist/export-map-html.d.ts +9 -0
- package/dist/export-map-html.js +25 -0
- package/dist/export-utils.d.ts +40 -0
- package/dist/export-utils.js +201 -0
- package/dist/filter-utils.d.ts +331 -0
- package/dist/filter-utils.js +1214 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +38 -0
- package/dist/gl-utils.d.ts +1 -0
- package/dist/gl-utils.js +27 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +941 -0
- package/dist/indexed-data-container.d.ts +34 -0
- package/dist/indexed-data-container.js +214 -0
- package/dist/locale-utils.d.ts +2 -0
- package/dist/locale-utils.js +39 -0
- package/dist/map-info-utils.d.ts +1 -0
- package/dist/map-info-utils.js +14 -0
- package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +57 -0
- package/dist/map-style-utils/mapbox-gl-style-editor.js +188 -0
- package/dist/map-style-utils/mapbox-utils.d.ts +14 -0
- package/dist/map-style-utils/mapbox-utils.js +51 -0
- package/dist/map-utils.d.ts +9 -0
- package/dist/map-utils.js +48 -0
- package/dist/mapbox-utils.d.ts +7 -0
- package/dist/mapbox-utils.js +19 -0
- package/dist/noop.d.ts +1 -0
- package/dist/noop.js +13 -0
- package/dist/notifications-utils.d.ts +42 -0
- package/dist/notifications-utils.js +69 -0
- package/dist/observe-dimensions.d.ts +15 -0
- package/dist/observe-dimensions.js +130 -0
- package/dist/plot.d.ts +131 -0
- package/dist/plot.js +615 -0
- package/dist/position-utils.d.ts +6 -0
- package/dist/position-utils.js +26 -0
- package/dist/projection-utils.d.ts +22 -0
- package/dist/projection-utils.js +83 -0
- package/dist/quick-insertion-sort.d.ts +12 -0
- package/dist/quick-insertion-sort.js +132 -0
- package/dist/row-data-container.d.ts +31 -0
- package/dist/row-data-container.js +206 -0
- package/dist/searcher-utils.d.ts +1 -0
- package/dist/searcher-utils.js +25 -0
- package/dist/split-map-utils.d.ts +32 -0
- package/dist/split-map-utils.js +99 -0
- package/dist/strings.d.ts +4 -0
- package/dist/strings.js +16 -0
- package/dist/time.d.ts +54 -0
- package/dist/time.js +325 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.js +6 -0
- package/dist/utils.d.ts +104 -0
- package/dist/utils.js +241 -0
- package/package.json +6 -5
@@ -0,0 +1,313 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
5
|
+
value: true
|
6
|
+
});
|
7
|
+
exports.datasetColorMaker = exports.addTimeLabel = void 0;
|
8
|
+
exports.findDefaultColorField = findDefaultColorField;
|
9
|
+
exports.getFieldFormatLabels = getFieldFormatLabels;
|
10
|
+
exports.getFormatLabels = void 0;
|
11
|
+
exports.validateInputData = validateInputData;
|
12
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
13
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
14
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
15
|
+
var _constants = require("@kepler.gl/constants");
|
16
|
+
var _commonUtils = require("@kepler.gl/common-utils");
|
17
|
+
var _typeAnalyzer = require("type-analyzer");
|
18
|
+
var _assert = _interopRequireDefault(require("assert"));
|
19
|
+
var _utils = require("./utils");
|
20
|
+
var _dataUtils = require("./data-utils");
|
21
|
+
var _format = require("./format");
|
22
|
+
var _colorUtils = require("./color-utils");
|
23
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
24
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
25
|
+
var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor); // SPDX-License-Identifier: MIT
|
26
|
+
// Copyright contributors to the kepler.gl project
|
27
|
+
// apply a color for each dataset
|
28
|
+
// to use as label colors
|
29
|
+
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_colorUtils.hexToRgb);
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Random color generator
|
33
|
+
*/
|
34
|
+
function generateColor() {
|
35
|
+
var index;
|
36
|
+
return _regenerator["default"].wrap(function generateColor$(_context) {
|
37
|
+
while (1) switch (_context.prev = _context.next) {
|
38
|
+
case 0:
|
39
|
+
index = 0;
|
40
|
+
case 1:
|
41
|
+
if (!(index < datasetColors.length + 1)) {
|
42
|
+
_context.next = 7;
|
43
|
+
break;
|
44
|
+
}
|
45
|
+
if (index === datasetColors.length) {
|
46
|
+
index = 0;
|
47
|
+
}
|
48
|
+
_context.next = 5;
|
49
|
+
return datasetColors[index++];
|
50
|
+
case 5:
|
51
|
+
_context.next = 1;
|
52
|
+
break;
|
53
|
+
case 7:
|
54
|
+
case "end":
|
55
|
+
return _context.stop();
|
56
|
+
}
|
57
|
+
}, _marked);
|
58
|
+
}
|
59
|
+
var datasetColorMaker = exports.datasetColorMaker = generateColor();
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Field name prefixes and suffixes which should not be considered
|
63
|
+
* as metrics. Fields will still be included if a 'metric word'
|
64
|
+
* is found on the field name, however.
|
65
|
+
*/
|
66
|
+
var EXCLUDED_DEFAULT_FIELDS = [
|
67
|
+
// Serial numbers and identification numbers
|
68
|
+
'_id', 'id', 'index', 'uuid', 'guid', 'uid', 'gid', 'serial',
|
69
|
+
// Geographic IDs are unlikely to be interesting to color
|
70
|
+
'zip', 'code', 'post', 'region', 'fips', 'cbgs', 'h3', 's2',
|
71
|
+
// Geographic coords (but not z/elevation/altitude
|
72
|
+
// since that might be a metric)
|
73
|
+
'lat', 'lon', 'lng', 'latitude', 'longitude', '_x', '_y'];
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Prefixes and suffixes that indicate a field is a metric.
|
77
|
+
*
|
78
|
+
* Note that these are in order of preference, first being
|
79
|
+
* most preferred.
|
80
|
+
*/
|
81
|
+
var METRIC_DEFAULT_FIELDS = ['metric', 'value', 'sum', 'count', 'unique', 'mean', 'mode', 'median', 'max', 'min', 'deviation', 'variance', 'p99', 'p95', 'p75', 'p50', 'p25', 'p05',
|
82
|
+
// Abbreviations are less preferred
|
83
|
+
'cnt', 'val'];
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Choose a field to use as the default color field of a layer.
|
87
|
+
*
|
88
|
+
* The heuristic is:
|
89
|
+
*
|
90
|
+
* First, exclude fields that are on the exclusion list and don't
|
91
|
+
* have names that suggest they contain metrics. Also exclude
|
92
|
+
* field names that are blank.
|
93
|
+
*
|
94
|
+
* Next, look for a field that is of real type and contains one
|
95
|
+
* of the preferred names (in order of the preferred names).
|
96
|
+
*
|
97
|
+
* Next, look for a field that is of integer type and contains
|
98
|
+
* one of the preferred names (in order of the preferred names).
|
99
|
+
*
|
100
|
+
* Next, look for the first field that is of real type (in order
|
101
|
+
* of field index).
|
102
|
+
*
|
103
|
+
* Next, look for the first field that is of integer type (in
|
104
|
+
* order of field index).
|
105
|
+
*
|
106
|
+
* It's possible no field will be chosen (i.e. because all fields
|
107
|
+
* are strings.)
|
108
|
+
*
|
109
|
+
* @param dataset
|
110
|
+
*/
|
111
|
+
function findDefaultColorField(_ref) {
|
112
|
+
var fields = _ref.fields,
|
113
|
+
_ref$fieldPairs = _ref.fieldPairs,
|
114
|
+
fieldPairs = _ref$fieldPairs === void 0 ? [] : _ref$fieldPairs;
|
115
|
+
var fieldsWithoutExcluded = fields.filter(function (field) {
|
116
|
+
if (field.type !== _constants.ALL_FIELD_TYPES.real && field.type !== _constants.ALL_FIELD_TYPES.integer) {
|
117
|
+
// Only select numeric fields.
|
118
|
+
return false;
|
119
|
+
}
|
120
|
+
if (fieldPairs.find(function (pair) {
|
121
|
+
return pair.pair.lat.value === field.name || pair.pair.lng.value === field.name;
|
122
|
+
})) {
|
123
|
+
// Do not permit lat, lon fields
|
124
|
+
return false;
|
125
|
+
}
|
126
|
+
var normalizedFieldName = field.name.toLowerCase();
|
127
|
+
if (normalizedFieldName === '') {
|
128
|
+
// Special case excluded name when the name is blank.
|
129
|
+
return false;
|
130
|
+
}
|
131
|
+
var hasExcluded = EXCLUDED_DEFAULT_FIELDS.find(function (f) {
|
132
|
+
return normalizedFieldName.startsWith(f) || normalizedFieldName.endsWith(f);
|
133
|
+
});
|
134
|
+
var hasInclusion = METRIC_DEFAULT_FIELDS.find(function (f) {
|
135
|
+
return normalizedFieldName.startsWith(f) || normalizedFieldName.endsWith(f);
|
136
|
+
});
|
137
|
+
return !hasExcluded || hasInclusion;
|
138
|
+
});
|
139
|
+
var sortedFields = fieldsWithoutExcluded.sort(function (left, right) {
|
140
|
+
var normalizedLeft = left.name.toLowerCase();
|
141
|
+
var normalizedRight = right.name.toLowerCase();
|
142
|
+
var leftHasInclusion = METRIC_DEFAULT_FIELDS.findIndex(function (f) {
|
143
|
+
return normalizedLeft.startsWith(f) || normalizedLeft.endsWith(f);
|
144
|
+
});
|
145
|
+
var rightHasInclusion = METRIC_DEFAULT_FIELDS.findIndex(function (f) {
|
146
|
+
return normalizedRight.startsWith(f) || normalizedRight.endsWith(f);
|
147
|
+
});
|
148
|
+
if (leftHasInclusion !== rightHasInclusion) {
|
149
|
+
if (leftHasInclusion === -1) {
|
150
|
+
// Elements that do not have the inclusion list should go after those that do.
|
151
|
+
return 1;
|
152
|
+
} else if (rightHasInclusion === -1) {
|
153
|
+
// Elements that do have the inclusion list should go before those that don't.
|
154
|
+
return -1;
|
155
|
+
}
|
156
|
+
// Compare based on order in the inclusion list
|
157
|
+
return leftHasInclusion - rightHasInclusion;
|
158
|
+
}
|
159
|
+
|
160
|
+
// Compare based on type
|
161
|
+
if (left.type !== right.type) {
|
162
|
+
if (left.type === _constants.ALL_FIELD_TYPES.real) {
|
163
|
+
return -1;
|
164
|
+
}
|
165
|
+
// left is an integer and right is not
|
166
|
+
// and reals come before integers
|
167
|
+
return 1;
|
168
|
+
}
|
169
|
+
|
170
|
+
// Finally, order based on the order in the datasets columns
|
171
|
+
// @ts-expect-error
|
172
|
+
return left.index - right.index;
|
173
|
+
});
|
174
|
+
if (sortedFields.length) {
|
175
|
+
// There was a best match
|
176
|
+
return sortedFields[0];
|
177
|
+
}
|
178
|
+
// No matches
|
179
|
+
return null;
|
180
|
+
}
|
181
|
+
|
182
|
+
/**
|
183
|
+
* Validate input data, adding missing field types, rename duplicate columns
|
184
|
+
*/
|
185
|
+
function validateInputData(data) {
|
186
|
+
if (!(0, _utils.isPlainObject)(data)) {
|
187
|
+
(0, _assert["default"])('addDataToMap Error: dataset.data cannot be null');
|
188
|
+
return null;
|
189
|
+
} else if (!Array.isArray(data.fields)) {
|
190
|
+
(0, _assert["default"])('addDataToMap Error: expect dataset.data.fields to be an array');
|
191
|
+
return null;
|
192
|
+
} else if (!Array.isArray(data.rows)) {
|
193
|
+
(0, _assert["default"])('addDataToMap Error: expect dataset.data.rows to be an array');
|
194
|
+
return null;
|
195
|
+
}
|
196
|
+
var fields = data.fields,
|
197
|
+
rows = data.rows,
|
198
|
+
cols = data.cols;
|
199
|
+
|
200
|
+
// check if all fields has name, format and type
|
201
|
+
var allValid = fields.every(function (f, i) {
|
202
|
+
if (!(0, _utils.isPlainObject)(f)) {
|
203
|
+
(0, _assert["default"])("fields needs to be an array of object, but find ".concat((0, _typeof2["default"])(f)));
|
204
|
+
fields[i] = {
|
205
|
+
name: "column_".concat(i),
|
206
|
+
type: _constants.ALL_FIELD_TYPES.string
|
207
|
+
};
|
208
|
+
}
|
209
|
+
if (!f.name) {
|
210
|
+
(0, _assert["default"])("field.name is required but missing in ".concat(JSON.stringify(f)));
|
211
|
+
// assign a name
|
212
|
+
fields[i].name = "column_".concat(i);
|
213
|
+
}
|
214
|
+
if (!f.type || !_constants.ALL_FIELD_TYPES[f.type]) {
|
215
|
+
(0, _assert["default"])("unknown field type ".concat(f.type));
|
216
|
+
return false;
|
217
|
+
}
|
218
|
+
if (!fields.every(function (field) {
|
219
|
+
return field.analyzerType;
|
220
|
+
})) {
|
221
|
+
(0, _assert["default"])('field missing analyzerType');
|
222
|
+
return false;
|
223
|
+
}
|
224
|
+
|
225
|
+
// check time format is correct based on first 10 not empty element
|
226
|
+
if (f.type === _constants.ALL_FIELD_TYPES.timestamp) {
|
227
|
+
var sample = findNonEmptyRowsAtField(rows, i, 10).map(function (r) {
|
228
|
+
return {
|
229
|
+
ts: r[i]
|
230
|
+
};
|
231
|
+
});
|
232
|
+
var analyzedType = _typeAnalyzer.Analyzer.computeColMeta(sample)[0];
|
233
|
+
return analyzedType && analyzedType.category === 'TIME' && analyzedType.format === f.format;
|
234
|
+
}
|
235
|
+
|
236
|
+
// check existing string field is H3 type
|
237
|
+
if (f.type === _constants.ALL_FIELD_TYPES.string) {
|
238
|
+
var _sample = findNonEmptyRowsAtField(rows, i, 10).map(function (r) {
|
239
|
+
return r[i];
|
240
|
+
});
|
241
|
+
return _sample.every(function (item) {
|
242
|
+
return !(0, _commonUtils.h3IsValid)(item);
|
243
|
+
});
|
244
|
+
}
|
245
|
+
return true;
|
246
|
+
});
|
247
|
+
if (allValid) {
|
248
|
+
return {
|
249
|
+
rows: rows,
|
250
|
+
fields: fields,
|
251
|
+
cols: cols
|
252
|
+
};
|
253
|
+
}
|
254
|
+
|
255
|
+
// if any field has missing type, recalculate it for everyone
|
256
|
+
// because we simply lost faith in humanity
|
257
|
+
var sampleData = (0, _commonUtils.getSampleForTypeAnalyze)({
|
258
|
+
fields: fields.map(function (f) {
|
259
|
+
return f.name;
|
260
|
+
}),
|
261
|
+
rows: rows
|
262
|
+
});
|
263
|
+
var fieldOrder = fields.map(function (f) {
|
264
|
+
return f.name;
|
265
|
+
});
|
266
|
+
var meta = (0, _commonUtils.getFieldsFromData)(sampleData, fieldOrder);
|
267
|
+
var updatedFields = fields.map(function (f, i) {
|
268
|
+
return _objectSpread(_objectSpread({}, f), {}, {
|
269
|
+
type: meta[i].type,
|
270
|
+
format: meta[i].format,
|
271
|
+
analyzerType: meta[i].analyzerType
|
272
|
+
});
|
273
|
+
});
|
274
|
+
return {
|
275
|
+
fields: updatedFields,
|
276
|
+
rows: rows
|
277
|
+
};
|
278
|
+
}
|
279
|
+
function findNonEmptyRowsAtField(rows, fieldIdx, total) {
|
280
|
+
var sample = [];
|
281
|
+
var i = 0;
|
282
|
+
while (sample.length < total && i < rows.length) {
|
283
|
+
var _rows$i;
|
284
|
+
if ((0, _commonUtils.notNullorUndefined)((_rows$i = rows[i]) === null || _rows$i === void 0 ? void 0 : _rows$i[fieldIdx])) {
|
285
|
+
sample.push(rows[i]);
|
286
|
+
}
|
287
|
+
i++;
|
288
|
+
}
|
289
|
+
return sample;
|
290
|
+
}
|
291
|
+
var TIME_DISPLAY = '2020-05-11 14:00';
|
292
|
+
var addTimeLabel = exports.addTimeLabel = function addTimeLabel(formats) {
|
293
|
+
return formats.map(function (f) {
|
294
|
+
return _objectSpread(_objectSpread({}, f), {}, {
|
295
|
+
label: f.type === _constants.TOOLTIP_FORMAT_TYPES.DATE_TIME || f.type === _constants.TOOLTIP_FORMAT_TYPES.DATE ? (0, _dataUtils.getFormatter)((0, _format.getFormatValue)(f))(TIME_DISPLAY) : f.label
|
296
|
+
});
|
297
|
+
});
|
298
|
+
};
|
299
|
+
function getFieldFormatLabels(fieldType) {
|
300
|
+
var tooltipTypes = fieldType && _constants.FIELD_OPTS[fieldType].format.tooltip || [];
|
301
|
+
var formatLabels = Object.values(_constants.TOOLTIP_FORMATS).filter(function (t) {
|
302
|
+
return tooltipTypes.includes(t.type);
|
303
|
+
});
|
304
|
+
return addTimeLabel(formatLabels);
|
305
|
+
}
|
306
|
+
var getFormatLabels = exports.getFormatLabels = function getFormatLabels(fields, fieldName) {
|
307
|
+
var _fields$find;
|
308
|
+
var fieldType = (_fields$find = fields.find(function (f) {
|
309
|
+
return f.name === fieldName;
|
310
|
+
})) === null || _fields$find === void 0 ? void 0 : _fields$find.type;
|
311
|
+
return getFieldFormatLabels(fieldType);
|
312
|
+
};
|
313
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9jb21tb25VdGlscyIsIl90eXBlQW5hbHl6ZXIiLCJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfZm9ybWF0IiwiX2NvbG9yVXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9tYXJrZWQiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiZ2VuZXJhdGVDb2xvciIsImRhdGFzZXRDb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImluZGV4Iiwid3JhcCIsImdlbmVyYXRlQ29sb3IkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInN0b3AiLCJkYXRhc2V0Q29sb3JNYWtlciIsImV4cG9ydHMiLCJFWENMVURFRF9ERUZBVUxUX0ZJRUxEUyIsIk1FVFJJQ19ERUZBVUxUX0ZJRUxEUyIsImZpbmREZWZhdWx0Q29sb3JGaWVsZCIsIl9yZWYiLCJmaWVsZHMiLCJfcmVmJGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwiZmllbGRzV2l0aG91dEV4Y2x1ZGVkIiwiZmllbGQiLCJ0eXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsImludGVnZXIiLCJmaW5kIiwicGFpciIsImxhdCIsInZhbHVlIiwibmFtZSIsImxuZyIsIm5vcm1hbGl6ZWRGaWVsZE5hbWUiLCJ0b0xvd2VyQ2FzZSIsImhhc0V4Y2x1ZGVkIiwiZiIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsImhhc0luY2x1c2lvbiIsInNvcnRlZEZpZWxkcyIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJub3JtYWxpemVkTGVmdCIsIm5vcm1hbGl6ZWRSaWdodCIsImxlZnRIYXNJbmNsdXNpb24iLCJmaW5kSW5kZXgiLCJyaWdodEhhc0luY2x1c2lvbiIsInZhbGlkYXRlSW5wdXREYXRhIiwiZGF0YSIsImlzUGxhaW5PYmplY3QiLCJhc3NlcnQiLCJBcnJheSIsImlzQXJyYXkiLCJyb3dzIiwiY29scyIsImFsbFZhbGlkIiwiZXZlcnkiLCJpIiwiY29uY2F0IiwiX3R5cGVvZjIiLCJzdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYW5hbHl6ZXJUeXBlIiwidGltZXN0YW1wIiwic2FtcGxlIiwiZmluZE5vbkVtcHR5Um93c0F0RmllbGQiLCJ0cyIsImFuYWx5emVkVHlwZSIsIkFuYWx5emVyIiwiY29tcHV0ZUNvbE1ldGEiLCJjYXRlZ29yeSIsImZvcm1hdCIsIml0ZW0iLCJoM0lzVmFsaWQiLCJzYW1wbGVEYXRhIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJmaWVsZE9yZGVyIiwibWV0YSIsImdldEZpZWxkc0Zyb21EYXRhIiwidXBkYXRlZEZpZWxkcyIsImZpZWxkSWR4IiwidG90YWwiLCJfcm93cyRpIiwibm90TnVsbG9yVW5kZWZpbmVkIiwiVElNRV9ESVNQTEFZIiwiYWRkVGltZUxhYmVsIiwiZm9ybWF0cyIsImxhYmVsIiwiVE9PTFRJUF9GT1JNQVRfVFlQRVMiLCJEQVRFX1RJTUUiLCJEQVRFIiwiZ2V0Rm9ybWF0dGVyIiwiZ2V0Rm9ybWF0VmFsdWUiLCJnZXRGaWVsZEZvcm1hdExhYmVscyIsImZpZWxkVHlwZSIsInRvb2x0aXBUeXBlcyIsIkZJRUxEX09QVFMiLCJ0b29sdGlwIiwiZm9ybWF0TGFiZWxzIiwidmFsdWVzIiwiVE9PTFRJUF9GT1JNQVRTIiwiaW5jbHVkZXMiLCJnZXRGb3JtYXRMYWJlbHMiLCJmaWVsZE5hbWUiLCJfZmllbGRzJGZpbmQiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YXNldC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBTExfRklFTERfVFlQRVMsXG4gIEZJRUxEX09QVFMsXG4gIFRPT0xUSVBfRk9STUFUUyxcbiAgVE9PTFRJUF9GT1JNQVRfVFlQRVNcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSwgZ2V0RmllbGRzRnJvbURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7QW5hbHl6ZXJ9IGZyb20gJ3R5cGUtYW5hbHl6ZXInO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICBQcm9jZXNzb3JSZXN1bHQsXG4gIFJHQkNvbG9yLFxuICBGaWVsZCxcbiAgRmllbGRQYWlyLFxuICBUaW1lTGFiZWxGb3JtYXQsXG4gIFRvb2x0aXBGaWVsZHMsXG4gIFByb3RvRGF0YXNldFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7VG9vbHRpcEZvcm1hdH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtub3ROdWxsb3JVbmRlZmluZWQsIGgzSXNWYWxpZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtnZXRGb3JtYXR0ZXJ9IGZyb20gJy4vZGF0YS11dGlscyc7XG5pbXBvcnQge2dldEZvcm1hdFZhbHVlfSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICcuL2NvbG9yLXV0aWxzJztcblxuLy8gYXBwbHkgYSBjb2xvciBmb3IgZWFjaCBkYXRhc2V0XG4vLyB0byB1c2UgYXMgbGFiZWwgY29sb3JzXG5jb25zdCBkYXRhc2V0Q29sb3JzID0gW1xuICAnIzhGMkZCRicsXG4gICcjMDA1Q0ZGJyxcbiAgJyNDMDZDODQnLFxuICAnI0Y4QjE5NScsXG4gICcjNTQ3QTgyJyxcbiAgJyMzRUFDQTgnLFxuICAnI0EyRDRBQidcbl0ubWFwKGhleFRvUmdiKTtcblxuLyoqXG4gKiBSYW5kb20gY29sb3IgZ2VuZXJhdG9yXG4gKi9cbmZ1bmN0aW9uKiBnZW5lcmF0ZUNvbG9yKCk6IEdlbmVyYXRvcjxSR0JDb2xvcj4ge1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBkYXRhc2V0Q29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGRhdGFzZXRDb2xvcnMubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIHlpZWxkIGRhdGFzZXRDb2xvcnNbaW5kZXgrK107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRhdGFzZXRDb2xvck1ha2VyID0gZ2VuZXJhdGVDb2xvcigpO1xuXG4vKipcbiAqIEZpZWxkIG5hbWUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHdoaWNoIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZFxuICogYXMgbWV0cmljcy4gRmllbGRzIHdpbGwgc3RpbGwgYmUgaW5jbHVkZWQgaWYgYSAnbWV0cmljIHdvcmQnXG4gKiBpcyBmb3VuZCBvbiB0aGUgZmllbGQgbmFtZSwgaG93ZXZlci5cbiAqL1xuY29uc3QgRVhDTFVERURfREVGQVVMVF9GSUVMRFMgPSBbXG4gIC8vIFNlcmlhbCBudW1iZXJzIGFuZCBpZGVudGlmaWNhdGlvbiBudW1iZXJzXG4gICdfaWQnLFxuICAnaWQnLFxuICAnaW5kZXgnLFxuICAndXVpZCcsXG4gICdndWlkJyxcbiAgJ3VpZCcsXG4gICdnaWQnLFxuICAnc2VyaWFsJyxcbiAgLy8gR2VvZ3JhcGhpYyBJRHMgYXJlIHVubGlrZWx5IHRvIGJlIGludGVyZXN0aW5nIHRvIGNvbG9yXG4gICd6aXAnLFxuICAnY29kZScsXG4gICdwb3N0JyxcbiAgJ3JlZ2lvbicsXG4gICdmaXBzJyxcbiAgJ2NiZ3MnLFxuICAnaDMnLFxuICAnczInLFxuICAvLyBHZW9ncmFwaGljIGNvb3JkcyAoYnV0IG5vdCB6L2VsZXZhdGlvbi9hbHRpdHVkZVxuICAvLyBzaW5jZSB0aGF0IG1pZ2h0IGJlIGEgbWV0cmljKVxuICAnbGF0JyxcbiAgJ2xvbicsXG4gICdsbmcnLFxuICAnbGF0aXR1ZGUnLFxuICAnbG9uZ2l0dWRlJyxcbiAgJ194JyxcbiAgJ195J1xuXTtcblxuLyoqXG4gKiBQcmVmaXhlcyBhbmQgc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBhIGZpZWxkIGlzIGEgbWV0cmljLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVzZSBhcmUgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSwgZmlyc3QgYmVpbmdcbiAqIG1vc3QgcHJlZmVycmVkLlxuICovXG5jb25zdCBNRVRSSUNfREVGQVVMVF9GSUVMRFMgPSBbXG4gICdtZXRyaWMnLFxuICAndmFsdWUnLFxuICAnc3VtJyxcbiAgJ2NvdW50JyxcbiAgJ3VuaXF1ZScsXG4gICdtZWFuJyxcbiAgJ21vZGUnLFxuICAnbWVkaWFuJyxcbiAgJ21heCcsXG4gICdtaW4nLFxuICAnZGV2aWF0aW9uJyxcbiAgJ3ZhcmlhbmNlJyxcbiAgJ3A5OScsXG4gICdwOTUnLFxuICAncDc1JyxcbiAgJ3A1MCcsXG4gICdwMjUnLFxuICAncDA1JyxcbiAgLy8gQWJicmV2aWF0aW9ucyBhcmUgbGVzcyBwcmVmZXJyZWRcbiAgJ2NudCcsXG4gICd2YWwnXG5dO1xuXG4vKipcbiAqIENob29zZSBhIGZpZWxkIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBjb2xvciBmaWVsZCBvZiBhIGxheWVyLlxuICpcbiAqIFRoZSBoZXVyaXN0aWMgaXM6XG4gKlxuICogRmlyc3QsIGV4Y2x1ZGUgZmllbGRzIHRoYXQgYXJlIG9uIHRoZSBleGNsdXNpb24gbGlzdCBhbmQgZG9uJ3RcbiAqIGhhdmUgbmFtZXMgdGhhdCBzdWdnZXN0IHRoZXkgY29udGFpbiBtZXRyaWNzLiBBbHNvIGV4Y2x1ZGVcbiAqIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGJsYW5rLlxuICpcbiAqIE5leHQsIGxvb2sgZm9yIGEgZmllbGQgdGhhdCBpcyBvZiByZWFsIHR5cGUgYW5kIGNvbnRhaW5zIG9uZVxuICogb2YgdGhlIHByZWZlcnJlZCBuYW1lcyAoaW4gb3JkZXIgb2YgdGhlIHByZWZlcnJlZCBuYW1lcykuXG4gKlxuICogTmV4dCwgbG9vayBmb3IgYSBmaWVsZCB0aGF0IGlzIG9mIGludGVnZXIgdHlwZSBhbmQgY29udGFpbnNcbiAqIG9uZSBvZiB0aGUgcHJlZmVycmVkIG5hbWVzIChpbiBvcmRlciBvZiB0aGUgcHJlZmVycmVkIG5hbWVzKS5cbiAqXG4gKiBOZXh0LCBsb29rIGZvciB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBvZiByZWFsIHR5cGUgKGluIG9yZGVyXG4gKiBvZiBmaWVsZCBpbmRleCkuXG4gKlxuICogTmV4dCwgbG9vayBmb3IgdGhlIGZpcnN0IGZpZWxkIHRoYXQgaXMgb2YgaW50ZWdlciB0eXBlIChpblxuICogb3JkZXIgb2YgZmllbGQgaW5kZXgpLlxuICpcbiAqIEl0J3MgcG9zc2libGUgbm8gZmllbGQgd2lsbCBiZSBjaG9zZW4gKGkuZS4gYmVjYXVzZSBhbGwgZmllbGRzXG4gKiBhcmUgc3RyaW5ncy4pXG4gKlxuICogQHBhcmFtIGRhdGFzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREZWZhdWx0Q29sb3JGaWVsZCh7XG4gIGZpZWxkcyxcbiAgZmllbGRQYWlycyA9IFtdXG59OiB7XG4gIGZpZWxkczogRmllbGRbXTtcbiAgZmllbGRQYWlyczogRmllbGRQYWlyW107XG59KTogbnVsbCB8IEZpZWxkIHtcbiAgY29uc3QgZmllbGRzV2l0aG91dEV4Y2x1ZGVkID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiB7XG4gICAgaWYgKGZpZWxkLnR5cGUgIT09IEFMTF9GSUVMRF9UWVBFUy5yZWFsICYmIGZpZWxkLnR5cGUgIT09IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyKSB7XG4gICAgICAvLyBPbmx5IHNlbGVjdCBudW1lcmljIGZpZWxkcy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZmllbGRQYWlycy5maW5kKFxuICAgICAgICBwYWlyID0+IHBhaXIucGFpci5sYXQudmFsdWUgPT09IGZpZWxkLm5hbWUgfHwgcGFpci5wYWlyLmxuZy52YWx1ZSA9PT0gZmllbGQubmFtZVxuICAgICAgKVxuICAgICkge1xuICAgICAgLy8gRG8gbm90IHBlcm1pdCBsYXQsIGxvbiBmaWVsZHNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkRmllbGROYW1lID0gZmllbGQubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkRmllbGROYW1lID09PSAnJykge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGV4Y2x1ZGVkIG5hbWUgd2hlbiB0aGUgbmFtZSBpcyBibGFuay5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGFzRXhjbHVkZWQgPSBFWENMVURFRF9ERUZBVUxUX0ZJRUxEUy5maW5kKFxuICAgICAgZiA9PiBub3JtYWxpemVkRmllbGROYW1lLnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZEZpZWxkTmFtZS5lbmRzV2l0aChmKVxuICAgICk7XG4gICAgY29uc3QgaGFzSW5jbHVzaW9uID0gTUVUUklDX0RFRkFVTFRfRklFTERTLmZpbmQoXG4gICAgICBmID0+IG5vcm1hbGl6ZWRGaWVsZE5hbWUuc3RhcnRzV2l0aChmKSB8fCBub3JtYWxpemVkRmllbGROYW1lLmVuZHNXaXRoKGYpXG4gICAgKTtcbiAgICByZXR1cm4gIWhhc0V4Y2x1ZGVkIHx8IGhhc0luY2x1c2lvbjtcbiAgfSk7XG5cbiAgY29uc3Qgc29ydGVkRmllbGRzID0gZmllbGRzV2l0aG91dEV4Y2x1ZGVkLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExlZnQgPSBsZWZ0Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBub3JtYWxpemVkUmlnaHQgPSByaWdodC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbGVmdEhhc0luY2x1c2lvbiA9IE1FVFJJQ19ERUZBVUxUX0ZJRUxEUy5maW5kSW5kZXgoXG4gICAgICBmID0+IG5vcm1hbGl6ZWRMZWZ0LnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZExlZnQuZW5kc1dpdGgoZilcbiAgICApO1xuICAgIGNvbnN0IHJpZ2h0SGFzSW5jbHVzaW9uID0gTUVUUklDX0RFRkFVTFRfRklFTERTLmZpbmRJbmRleChcbiAgICAgIGYgPT4gbm9ybWFsaXplZFJpZ2h0LnN0YXJ0c1dpdGgoZikgfHwgbm9ybWFsaXplZFJpZ2h0LmVuZHNXaXRoKGYpXG4gICAgKTtcbiAgICBpZiAobGVmdEhhc0luY2x1c2lvbiAhPT0gcmlnaHRIYXNJbmNsdXNpb24pIHtcbiAgICAgIGlmIChsZWZ0SGFzSW5jbHVzaW9uID09PSAtMSkge1xuICAgICAgICAvLyBFbGVtZW50cyB0aGF0IGRvIG5vdCBoYXZlIHRoZSBpbmNsdXNpb24gbGlzdCBzaG91bGQgZ28gYWZ0ZXIgdGhvc2UgdGhhdCBkby5cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0SGFzSW5jbHVzaW9uID09PSAtMSkge1xuICAgICAgICAvLyBFbGVtZW50cyB0aGF0IGRvIGhhdmUgdGhlIGluY2x1c2lvbiBsaXN0IHNob3VsZCBnbyBiZWZvcmUgdGhvc2UgdGhhdCBkb24ndC5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgLy8gQ29tcGFyZSBiYXNlZCBvbiBvcmRlciBpbiB0aGUgaW5jbHVzaW9uIGxpc3RcbiAgICAgIHJldHVybiBsZWZ0SGFzSW5jbHVzaW9uIC0gcmlnaHRIYXNJbmNsdXNpb247XG4gICAgfVxuXG4gICAgLy8gQ29tcGFyZSBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKGxlZnQudHlwZSAhPT0gcmlnaHQudHlwZSkge1xuICAgICAgaWYgKGxlZnQudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnJlYWwpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgLy8gbGVmdCBpcyBhbiBpbnRlZ2VyIGFuZCByaWdodCBpcyBub3RcbiAgICAgIC8vIGFuZCByZWFscyBjb21lIGJlZm9yZSBpbnRlZ2Vyc1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gRmluYWxseSwgb3JkZXIgYmFzZWQgb24gdGhlIG9yZGVyIGluIHRoZSBkYXRhc2V0cyBjb2x1bW5zXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXg7XG4gIH0pO1xuXG4gIGlmIChzb3J0ZWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgLy8gVGhlcmUgd2FzIGEgYmVzdCBtYXRjaFxuICAgIHJldHVybiBzb3J0ZWRGaWVsZHNbMF07XG4gIH1cbiAgLy8gTm8gbWF0Y2hlc1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBpbnB1dCBkYXRhLCBhZGRpbmcgbWlzc2luZyBmaWVsZCB0eXBlcywgcmVuYW1lIGR1cGxpY2F0ZSBjb2x1bW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0RGF0YShkYXRhOiBQcm90b0RhdGFzZXRbJ2RhdGEnXSk6IFByb2Nlc3NvclJlc3VsdCB7XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGFzc2VydCgnYWRkRGF0YVRvTWFwIEVycm9yOiBkYXRhc2V0LmRhdGEgY2Fubm90IGJlIG51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShkYXRhLmZpZWxkcykpIHtcbiAgICBhc3NlcnQoJ2FkZERhdGFUb01hcCBFcnJvcjogZXhwZWN0IGRhdGFzZXQuZGF0YS5maWVsZHMgdG8gYmUgYW4gYXJyYXknKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnJvd3MpKSB7XG4gICAgYXNzZXJ0KCdhZGREYXRhVG9NYXAgRXJyb3I6IGV4cGVjdCBkYXRhc2V0LmRhdGEucm93cyB0byBiZSBhbiBhcnJheScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qge2ZpZWxkcywgcm93cywgY29sc30gPSBkYXRhO1xuXG4gIC8vIGNoZWNrIGlmIGFsbCBmaWVsZHMgaGFzIG5hbWUsIGZvcm1hdCBhbmQgdHlwZVxuICBjb25zdCBhbGxWYWxpZCA9IGZpZWxkcy5ldmVyeSgoZiwgaSkgPT4ge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChmKSkge1xuICAgICAgYXNzZXJ0KGBmaWVsZHMgbmVlZHMgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0LCBidXQgZmluZCAke3R5cGVvZiBmfWApO1xuICAgICAgZmllbGRzW2ldID0ge25hbWU6IGBjb2x1bW5fJHtpfWAsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9O1xuICAgIH1cblxuICAgIGlmICghZi5uYW1lKSB7XG4gICAgICBhc3NlcnQoYGZpZWxkLm5hbWUgaXMgcmVxdWlyZWQgYnV0IG1pc3NpbmcgaW4gJHtKU09OLnN0cmluZ2lmeShmKX1gKTtcbiAgICAgIC8vIGFzc2lnbiBhIG5hbWVcbiAgICAgIGZpZWxkc1tpXS5uYW1lID0gYGNvbHVtbl8ke2l9YDtcbiAgICB9XG5cbiAgICBpZiAoIWYudHlwZSB8fCAhQUxMX0ZJRUxEX1RZUEVTW2YudHlwZV0pIHtcbiAgICAgIGFzc2VydChgdW5rbm93biBmaWVsZCB0eXBlICR7Zi50eXBlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZmllbGRzLmV2ZXJ5KGZpZWxkID0+IGZpZWxkLmFuYWx5emVyVHlwZSkpIHtcbiAgICAgIGFzc2VydCgnZmllbGQgbWlzc2luZyBhbmFseXplclR5cGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB0aW1lIGZvcm1hdCBpcyBjb3JyZWN0IGJhc2VkIG9uIGZpcnN0IDEwIG5vdCBlbXB0eSBlbGVtZW50XG4gICAgaWYgKGYudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgY29uc3Qgc2FtcGxlID0gZmluZE5vbkVtcHR5Um93c0F0RmllbGQocm93cywgaSwgMTApLm1hcChyID0+ICh7dHM6IHJbaV19KSk7XG4gICAgICBjb25zdCBhbmFseXplZFR5cGUgPSBBbmFseXplci5jb21wdXRlQ29sTWV0YShzYW1wbGUpWzBdO1xuICAgICAgcmV0dXJuIGFuYWx5emVkVHlwZSAmJiBhbmFseXplZFR5cGUuY2F0ZWdvcnkgPT09ICdUSU1FJyAmJiBhbmFseXplZFR5cGUuZm9ybWF0ID09PSBmLmZvcm1hdDtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBleGlzdGluZyBzdHJpbmcgZmllbGQgaXMgSDMgdHlwZVxuICAgIGlmIChmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcpIHtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IGZpbmROb25FbXB0eVJvd3NBdEZpZWxkKHJvd3MsIGksIDEwKS5tYXAociA9PiByW2ldKTtcbiAgICAgIHJldHVybiBzYW1wbGUuZXZlcnkoaXRlbSA9PiAhaDNJc1ZhbGlkKGl0ZW0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGFsbFZhbGlkKSB7XG4gICAgcmV0dXJuIHtyb3dzLCBmaWVsZHMsIGNvbHN9O1xuICB9XG5cbiAgLy8gaWYgYW55IGZpZWxkIGhhcyBtaXNzaW5nIHR5cGUsIHJlY2FsY3VsYXRlIGl0IGZvciBldmVyeW9uZVxuICAvLyBiZWNhdXNlIHdlIHNpbXBseSBsb3N0IGZhaXRoIGluIGh1bWFuaXR5XG4gIGNvbnN0IHNhbXBsZURhdGEgPSBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGYgPT4gZi5uYW1lKSxcbiAgICByb3dzXG4gIH0pO1xuICBjb25zdCBmaWVsZE9yZGVyID0gZmllbGRzLm1hcChmID0+IGYubmFtZSk7XG4gIGNvbnN0IG1ldGEgPSBnZXRGaWVsZHNGcm9tRGF0YShzYW1wbGVEYXRhLCBmaWVsZE9yZGVyKTtcbiAgY29uc3QgdXBkYXRlZEZpZWxkcyA9IGZpZWxkcy5tYXAoKGYsIGkpID0+ICh7XG4gICAgLi4uZixcbiAgICB0eXBlOiBtZXRhW2ldLnR5cGUsXG4gICAgZm9ybWF0OiBtZXRhW2ldLmZvcm1hdCxcbiAgICBhbmFseXplclR5cGU6IG1ldGFbaV0uYW5hbHl6ZXJUeXBlXG4gIH0pKTtcblxuICByZXR1cm4ge2ZpZWxkczogdXBkYXRlZEZpZWxkcywgcm93c307XG59XG5cbmZ1bmN0aW9uIGZpbmROb25FbXB0eVJvd3NBdEZpZWxkKHJvd3M6IHVua25vd25bXVtdLCBmaWVsZElkeDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogYW55W10ge1xuICBjb25zdCBzYW1wbGU6IGFueVtdID0gW107XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKHNhbXBsZS5sZW5ndGggPCB0b3RhbCAmJiBpIDwgcm93cy5sZW5ndGgpIHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKHJvd3NbaV0/LltmaWVsZElkeF0pKSB7XG4gICAgICBzYW1wbGUucHVzaChyb3dzW2ldKTtcbiAgICB9XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiBzYW1wbGU7XG59XG5cbmNvbnN0IFRJTUVfRElTUExBWSA9ICcyMDIwLTA1LTExIDE0OjAwJztcblxuZXhwb3J0IGNvbnN0IGFkZFRpbWVMYWJlbCA9IChmb3JtYXRzOiBUaW1lTGFiZWxGb3JtYXRbXSkgPT5cbiAgZm9ybWF0cy5tYXAoZiA9PiAoe1xuICAgIC4uLmYsXG4gICAgbGFiZWw6XG4gICAgICBmLnR5cGUgPT09IFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVfVElNRSB8fCBmLnR5cGUgPT09IFRPT0xUSVBfRk9STUFUX1RZUEVTLkRBVEVcbiAgICAgICAgPyBnZXRGb3JtYXR0ZXIoZ2V0Rm9ybWF0VmFsdWUoZikpKFRJTUVfRElTUExBWSlcbiAgICAgICAgOiBmLmxhYmVsXG4gIH0pKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkRm9ybWF0TGFiZWxzKGZpZWxkVHlwZT86IHN0cmluZyk6IFRvb2x0aXBGb3JtYXRbXSB7XG4gIGNvbnN0IHRvb2x0aXBUeXBlcyA9IChmaWVsZFR5cGUgJiYgRklFTERfT1BUU1tmaWVsZFR5cGVdLmZvcm1hdC50b29sdGlwKSB8fCBbXTtcbiAgY29uc3QgZm9ybWF0TGFiZWxzOiBUaW1lTGFiZWxGb3JtYXRbXSA9IE9iamVjdC52YWx1ZXMoVE9PTFRJUF9GT1JNQVRTKS5maWx0ZXIodCA9PlxuICAgIHRvb2x0aXBUeXBlcy5pbmNsdWRlcyh0LnR5cGUpXG4gICk7XG4gIHJldHVybiBhZGRUaW1lTGFiZWwoZm9ybWF0TGFiZWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZvcm1hdExhYmVscyA9IChmaWVsZHM6IFRvb2x0aXBGaWVsZHNbXSwgZmllbGROYW1lOiBzdHJpbmcpOiBUb29sdGlwRm9ybWF0W10gPT4ge1xuICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGROYW1lKT8udHlwZTtcbiAgcmV0dXJuIGdldEZpZWxkRm9ybWF0TGFiZWxzKGZpZWxkVHlwZSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQU1BLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQWNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLE9BQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUF1QyxTQUFB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
|
@@ -0,0 +1,73 @@
|
|
1
|
+
declare const domtoimage: {
|
2
|
+
toSvg: typeof toSvg;
|
3
|
+
toPng: typeof toPng;
|
4
|
+
toJpeg: typeof toJpeg;
|
5
|
+
toBlob: typeof toBlob;
|
6
|
+
toPixelData: typeof toPixelData;
|
7
|
+
impl: {
|
8
|
+
fontFaces: {
|
9
|
+
resolveAll: () => Promise<string>;
|
10
|
+
impl: {
|
11
|
+
readAll: () => Promise<any>;
|
12
|
+
};
|
13
|
+
};
|
14
|
+
images: {
|
15
|
+
inlineAll: (node: any) => any;
|
16
|
+
impl: {
|
17
|
+
newImage: (element: any) => {
|
18
|
+
inline: (get: any) => Promise<unknown>;
|
19
|
+
};
|
20
|
+
};
|
21
|
+
};
|
22
|
+
inliner: {
|
23
|
+
inlineAll: (string: any, baseUrl: any, get: any) => Promise<any>;
|
24
|
+
shouldProcess: (string: any) => boolean;
|
25
|
+
impl: {
|
26
|
+
readUrls: (string: any) => string[];
|
27
|
+
inline: (string: any, url: any, baseUrl: any, get: any) => Promise<any>;
|
28
|
+
};
|
29
|
+
};
|
30
|
+
options: any;
|
31
|
+
};
|
32
|
+
};
|
33
|
+
/**
|
34
|
+
* @param {Node} node - The DOM Node object to render
|
35
|
+
* @param {Object} options - Rendering options
|
36
|
+
* @param {Function} [options.filter] - Should return true if passed node should be included in the output
|
37
|
+
* (excluding node means excluding it's children as well). Not called on the root node.
|
38
|
+
* @param {String} [options.bgcolor] - color for the background, any valid CSS color value.
|
39
|
+
* @param {Number} [options.width] - width to be applied to node before rendering.
|
40
|
+
* @param {Number} [options.height] - height to be applied to node before rendering.
|
41
|
+
* @param {Object} [options.style] - an object whose properties to be copied to node's style before rendering.
|
42
|
+
* @param {Number} [options.quality] - a Number between 0 and 1 indicating image quality (applicable to JPEG only), defaults to 1.0.
|
43
|
+
* @param {boolean} [options.escapeXhtmlForWebpack] - whether to apply fix for uglify error in dom-to-image (should be true for webpack builds), defaults to true.
|
44
|
+
* @param {String} [options.imagePlaceholder] - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch
|
45
|
+
* @param {Boolean} [options.cacheBust] - set to true to cache bust by appending the time to the request url
|
46
|
+
* @return {Promise} - A promise that is fulfilled with a SVG image data URL
|
47
|
+
* */
|
48
|
+
declare function toSvg(node: any, options: any): Promise<string>;
|
49
|
+
/**
|
50
|
+
* @param {Node} node - The DOM Node object to render
|
51
|
+
* @param {Object} options - Rendering options
|
52
|
+
* @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.
|
53
|
+
* */
|
54
|
+
declare function toPixelData(node: any, options: any): Promise<any>;
|
55
|
+
/**
|
56
|
+
* @param {Node} node - The DOM Node object to render
|
57
|
+
* @param {Object} options - Rendering options
|
58
|
+
* @return {Promise} - A promise that is fulfilled with a PNG image data URL
|
59
|
+
* */
|
60
|
+
declare function toPng(node: any, options: any): Promise<any>;
|
61
|
+
/**
|
62
|
+
* @param {Node} node - The DOM Node object to render
|
63
|
+
* @param {Object} options - Rendering options
|
64
|
+
* @return {Promise} - A promise that is fulfilled with a JPEG image data URL
|
65
|
+
* */
|
66
|
+
declare function toJpeg(node: any, options: any): Promise<any>;
|
67
|
+
/**
|
68
|
+
* @param {Node} node - The DOM Node object to render
|
69
|
+
* @param {Object} options - Rendering options
|
70
|
+
* @return {Promise} - A promise that is fulfilled with a PNG image blob
|
71
|
+
* */
|
72
|
+
declare function toBlob(node: any, options: any): Promise<unknown>;
|
73
|
+
export default domtoimage;
|