flexdataset 0.21.2 → 0.22.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/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/model.d.ts +4 -3
- package/dist/src/model.js +3 -3
- package/dist/src/schema/table.schema.json +1 -1
- package/dist/src/table-types/{iceberg-parquet.d.ts → iceberg-parquet-v2.d.ts} +17 -8
- package/dist/src/table-types/iceberg-parquet-v2.js +469 -0
- package/dist/src/table-types/registry.js +3 -3
- package/package.json +1 -1
- package/dist/src/table-types/iceberg-parquet.js +0 -471
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Iceberg (parquet) format-version-2 table type.
|
|
4
|
+
*
|
|
5
|
+
* Iceberg partitions are transforms applied to a data column, so duplicate
|
|
6
|
+
* detection keys on the (source column, normalized transform) pair — `year(ts)`
|
|
7
|
+
* and `month(ts)` are distinct, while `day` and `DAY` collapse.
|
|
8
|
+
*
|
|
9
|
+
* The format version is encoded in the `tableType` discriminator: this engine is
|
|
10
|
+
* inherently v2, so a present `formatVersion` must equal `EXPECTED_FORMAT_VERSION`.
|
|
11
|
+
* A future `iceberg_parquet_v3` sibling subclass overrides that one constant.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.IcebergParquetV2Table = void 0;
|
|
15
|
+
const table_type_1 = require("../table-type");
|
|
16
|
+
const iceberg_1 = require("../iceberg");
|
|
17
|
+
/**
|
|
18
|
+
* Whether a string is a positive integer (digits only, value > 0). Iceberg
|
|
19
|
+
* table-property values are strings, so numeric checks parse the string.
|
|
20
|
+
*
|
|
21
|
+
* @param value Property value string.
|
|
22
|
+
* @returns True when `value` is a positive integer.
|
|
23
|
+
*/
|
|
24
|
+
function isPositiveInteger(value) {
|
|
25
|
+
return /^\d+$/.test(value) && Number(value) > 0;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether a string is a non-negative integer (digits only, value >= 0).
|
|
29
|
+
*
|
|
30
|
+
* @param value Property value string.
|
|
31
|
+
* @returns True when `value` is a non-negative integer.
|
|
32
|
+
*/
|
|
33
|
+
function isNonNegativeInteger(value) {
|
|
34
|
+
return /^\d+$/.test(value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Whether a string is an integer within an inclusive range.
|
|
38
|
+
*
|
|
39
|
+
* @param value Property value string.
|
|
40
|
+
* @param min Inclusive lower bound.
|
|
41
|
+
* @param max Inclusive upper bound.
|
|
42
|
+
* @returns True when `value` is an integer in `[min, max]`.
|
|
43
|
+
*/
|
|
44
|
+
function isIntegerInRange(value, min, max) {
|
|
45
|
+
if (!/^\d+$/.test(value)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const parsed = Number(value);
|
|
49
|
+
return parsed >= min && parsed <= max;
|
|
50
|
+
}
|
|
51
|
+
/** Iceberg (parquet) format-version-2 table. */
|
|
52
|
+
class IcebergParquetV2Table extends table_type_1.TableTypeBase {
|
|
53
|
+
/**
|
|
54
|
+
* The Iceberg format version this engine pins to. A present `formatVersion`
|
|
55
|
+
* must equal this. A future v3 sibling subclass overrides this single value.
|
|
56
|
+
*/
|
|
57
|
+
static EXPECTED_FORMAT_VERSION = 2;
|
|
58
|
+
/**
|
|
59
|
+
* Validate a column type against the Iceberg v0 type registry.
|
|
60
|
+
*
|
|
61
|
+
* @param type Type string from a column definition.
|
|
62
|
+
* @returns True when the type is a valid Iceberg type.
|
|
63
|
+
*/
|
|
64
|
+
isValidColumnType(type) {
|
|
65
|
+
return (0, iceberg_1.isValidIcebergType)(type);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Iceberg partition rules.
|
|
69
|
+
*
|
|
70
|
+
* Emits: `NO_DUPLICATE_PARTITIONS` (keyed by `${name} ${transformKind}:${param}`,
|
|
71
|
+
* falling back to a lowercased trim of the raw transform when it doesn't
|
|
72
|
+
* parse, so whitespace / case variants of the same transform collapse),
|
|
73
|
+
* `ICEBERG_TRANSFORM_SOURCE_EXISTS`, `ICEBERG_TRANSFORM_VALID`, and
|
|
74
|
+
* `ICEBERG_TRANSFORM_SOURCE_TYPE_LEGAL`.
|
|
75
|
+
*
|
|
76
|
+
* @returns Every partition-related violation.
|
|
77
|
+
*/
|
|
78
|
+
partitionViolations() {
|
|
79
|
+
const violations = [];
|
|
80
|
+
const { partitions, } = this.definition;
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
partitions.forEach((partition, index) => {
|
|
83
|
+
const key = this.partitionKey(partition);
|
|
84
|
+
if (seen.has(key)) {
|
|
85
|
+
violations.push(this.violation({
|
|
86
|
+
level: 'error',
|
|
87
|
+
code: 'NO_DUPLICATE_PARTITIONS',
|
|
88
|
+
field: `partitions[${index}]`,
|
|
89
|
+
message: `duplicate partition: "${partition.name}" with transform "${partition.type}"`,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
seen.add(key);
|
|
93
|
+
});
|
|
94
|
+
partitions.forEach((partition, index) => {
|
|
95
|
+
const sourceColumn = this.definition.columns.find((column) => column.name === partition.name);
|
|
96
|
+
if (sourceColumn === undefined) {
|
|
97
|
+
violations.push(this.violation({
|
|
98
|
+
level: 'error',
|
|
99
|
+
code: 'ICEBERG_TRANSFORM_SOURCE_EXISTS',
|
|
100
|
+
field: `partitions[${index}].name`,
|
|
101
|
+
message: `Iceberg partition source column "${partition.name}" is not defined in columns`,
|
|
102
|
+
}));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const transform = (0, iceberg_1.parseIcebergTransform)(partition.type);
|
|
106
|
+
if (transform === null) {
|
|
107
|
+
violations.push(this.violation({
|
|
108
|
+
level: 'error',
|
|
109
|
+
code: 'ICEBERG_TRANSFORM_VALID',
|
|
110
|
+
field: `partitions[${index}].type`,
|
|
111
|
+
message: `"${partition.type}" is not a valid Iceberg partition transform`,
|
|
112
|
+
}));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const sourceType = (0, iceberg_1.parseIcebergType)(sourceColumn.type);
|
|
116
|
+
if (sourceType !== null && !(0, iceberg_1.transformLegalOnType)(transform, sourceType)) {
|
|
117
|
+
violations.push(this.violation({
|
|
118
|
+
level: 'error',
|
|
119
|
+
code: 'ICEBERG_TRANSFORM_SOURCE_TYPE_LEGAL',
|
|
120
|
+
field: `partitions[${index}].type`,
|
|
121
|
+
message: `transform "${partition.type}" is not legal on `
|
|
122
|
+
+ `column "${partition.name}" of type "${sourceColumn.type}"`,
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return violations;
|
|
127
|
+
}
|
|
128
|
+
/// Table-property keys whose value must come from a closed set.
|
|
129
|
+
static ENUM_PROPERTIES = {
|
|
130
|
+
'write.format.default': [
|
|
131
|
+
'parquet',
|
|
132
|
+
'avro',
|
|
133
|
+
'orc',
|
|
134
|
+
],
|
|
135
|
+
'write.parquet.compression-codec': [
|
|
136
|
+
'zstd',
|
|
137
|
+
'gzip',
|
|
138
|
+
'snappy',
|
|
139
|
+
'lz4',
|
|
140
|
+
'none',
|
|
141
|
+
],
|
|
142
|
+
'write.avro.compression-codec': [
|
|
143
|
+
'gzip',
|
|
144
|
+
'zstd',
|
|
145
|
+
'snappy',
|
|
146
|
+
'uncompressed',
|
|
147
|
+
],
|
|
148
|
+
'write.orc.compression-codec': [
|
|
149
|
+
'zstd',
|
|
150
|
+
'lz4',
|
|
151
|
+
'lzo',
|
|
152
|
+
'zlib',
|
|
153
|
+
'snappy',
|
|
154
|
+
'none',
|
|
155
|
+
],
|
|
156
|
+
'write.distribution-mode': [
|
|
157
|
+
'none',
|
|
158
|
+
'hash',
|
|
159
|
+
'range',
|
|
160
|
+
],
|
|
161
|
+
'write.metadata.compression-codec': [
|
|
162
|
+
'none',
|
|
163
|
+
'gzip',
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
/// Table-property keys whose value must be a positive integer.
|
|
167
|
+
static POSITIVE_INT_PROPERTIES = [
|
|
168
|
+
'write.target-file-size-bytes',
|
|
169
|
+
'history.expire.max-snapshot-age-ms',
|
|
170
|
+
'history.expire.min-snapshots-to-keep',
|
|
171
|
+
'history.expire.max-ref-age-ms',
|
|
172
|
+
'write.metadata.previous-versions-max',
|
|
173
|
+
'commit.retry.min-wait-ms',
|
|
174
|
+
'commit.retry.max-wait-ms',
|
|
175
|
+
'commit.retry.total-timeout-ms',
|
|
176
|
+
];
|
|
177
|
+
/// Table-property keys whose value must be a non-negative integer.
|
|
178
|
+
static NON_NEGATIVE_INT_PROPERTIES = [
|
|
179
|
+
'commit.retry.num-retries',
|
|
180
|
+
];
|
|
181
|
+
/// Table-property keys whose value must be an integer within an inclusive range.
|
|
182
|
+
static INT_RANGE_PROPERTIES = {
|
|
183
|
+
'write.parquet.compression-level': {
|
|
184
|
+
min: 1,
|
|
185
|
+
max: 22,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
/// Legal sort directions and null orderings.
|
|
189
|
+
static SORT_DIRECTIONS = new Set([
|
|
190
|
+
'asc',
|
|
191
|
+
'desc',
|
|
192
|
+
]);
|
|
193
|
+
static SORT_NULL_ORDERS = new Set([
|
|
194
|
+
'nulls-first',
|
|
195
|
+
'nulls-last',
|
|
196
|
+
]);
|
|
197
|
+
/**
|
|
198
|
+
* Iceberg engine-specific rules: format version, table properties, and sort
|
|
199
|
+
* order.
|
|
200
|
+
*
|
|
201
|
+
* @returns Every engine-specific violation.
|
|
202
|
+
*/
|
|
203
|
+
engineSpecificViolations() {
|
|
204
|
+
return [
|
|
205
|
+
...this.formatVersionViolations(),
|
|
206
|
+
...this.tablePropertyViolations(),
|
|
207
|
+
...this.sortOrderViolations(),
|
|
208
|
+
...this.identifierFieldViolations(),
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Validate the Iceberg sort order.
|
|
213
|
+
*
|
|
214
|
+
* Emits `NO_DUPLICATE_SORT_FIELDS` (keyed by source column + normalized
|
|
215
|
+
* transform), `ICEBERG_SORT_COLUMN_EXISTS`, `ICEBERG_SORT_DIRECTION_VALID`,
|
|
216
|
+
* `ICEBERG_SORT_NULL_ORDER_VALID`, `ICEBERG_SORT_TRANSFORM_VALID`, and
|
|
217
|
+
* `ICEBERG_SORT_TRANSFORM_TYPE_LEGAL`.
|
|
218
|
+
*
|
|
219
|
+
* @returns Every sort-order violation.
|
|
220
|
+
*/
|
|
221
|
+
sortOrderViolations() {
|
|
222
|
+
const violations = [];
|
|
223
|
+
const { sortOrder, } = this.definition;
|
|
224
|
+
const seen = new Set();
|
|
225
|
+
sortOrder.forEach((field, index) => {
|
|
226
|
+
const key = this.sortFieldKey(field);
|
|
227
|
+
if (seen.has(key)) {
|
|
228
|
+
violations.push(this.violation({
|
|
229
|
+
level: 'error',
|
|
230
|
+
code: 'NO_DUPLICATE_SORT_FIELDS',
|
|
231
|
+
field: `sortOrder[${index}]`,
|
|
232
|
+
message: `duplicate sort field: "${field.column}"`
|
|
233
|
+
+ `${field.transform ? ` with transform "${field.transform}"` : ''}`,
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
seen.add(key);
|
|
237
|
+
});
|
|
238
|
+
sortOrder.forEach((field, index) => {
|
|
239
|
+
if (!IcebergParquetV2Table.SORT_DIRECTIONS.has(field.direction)) {
|
|
240
|
+
violations.push(this.violation({
|
|
241
|
+
level: 'error',
|
|
242
|
+
code: 'ICEBERG_SORT_DIRECTION_VALID',
|
|
243
|
+
field: `sortOrder[${index}].direction`,
|
|
244
|
+
message: `sort direction "${field.direction}" must be "asc" or "desc"`,
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
if (!IcebergParquetV2Table.SORT_NULL_ORDERS.has(field.nullOrder)) {
|
|
248
|
+
violations.push(this.violation({
|
|
249
|
+
level: 'error',
|
|
250
|
+
code: 'ICEBERG_SORT_NULL_ORDER_VALID',
|
|
251
|
+
field: `sortOrder[${index}].nullOrder`,
|
|
252
|
+
message: `sort null order "${field.nullOrder}" must be "nulls-first" or "nulls-last"`,
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
const sourceColumn = this.definition.columns.find((column) => column.name === field.column);
|
|
256
|
+
if (sourceColumn === undefined) {
|
|
257
|
+
violations.push(this.violation({
|
|
258
|
+
level: 'error',
|
|
259
|
+
code: 'ICEBERG_SORT_COLUMN_EXISTS',
|
|
260
|
+
field: `sortOrder[${index}].column`,
|
|
261
|
+
message: `sort column "${field.column}" is not defined in columns`,
|
|
262
|
+
}));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (field.transform === undefined) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const transform = (0, iceberg_1.parseIcebergTransform)(field.transform);
|
|
269
|
+
if (transform === null) {
|
|
270
|
+
violations.push(this.violation({
|
|
271
|
+
level: 'error',
|
|
272
|
+
code: 'ICEBERG_SORT_TRANSFORM_VALID',
|
|
273
|
+
field: `sortOrder[${index}].transform`,
|
|
274
|
+
message: `"${field.transform}" is not a valid Iceberg transform`,
|
|
275
|
+
}));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const sourceType = (0, iceberg_1.parseIcebergType)(sourceColumn.type);
|
|
279
|
+
if (sourceType !== null && !(0, iceberg_1.transformLegalOnType)(transform, sourceType)) {
|
|
280
|
+
violations.push(this.violation({
|
|
281
|
+
level: 'error',
|
|
282
|
+
code: 'ICEBERG_SORT_TRANSFORM_TYPE_LEGAL',
|
|
283
|
+
field: `sortOrder[${index}].transform`,
|
|
284
|
+
message: `transform "${field.transform}" is not legal on `
|
|
285
|
+
+ `column "${field.column}" of type "${sourceColumn.type}"`,
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
return violations;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Normalize a sort field into its identity key. An omitted transform and an
|
|
293
|
+
* explicit `identity` collapse to the same key so they count as duplicates.
|
|
294
|
+
*
|
|
295
|
+
* @param field Sort field to key.
|
|
296
|
+
* @returns The identity string for duplicate detection.
|
|
297
|
+
*/
|
|
298
|
+
sortFieldKey(field) {
|
|
299
|
+
if (field.transform === undefined) {
|
|
300
|
+
return `${field.column} identity:`;
|
|
301
|
+
}
|
|
302
|
+
const transform = (0, iceberg_1.parseIcebergTransform)(field.transform);
|
|
303
|
+
const normalizedTransform = transform
|
|
304
|
+
? `${transform.kind}:${transform.param ?? ''}`
|
|
305
|
+
: field.transform.trim().toLowerCase();
|
|
306
|
+
return `${field.column} ${normalizedTransform}`;
|
|
307
|
+
}
|
|
308
|
+
/// ICEBERG_FORMAT_VERSION_VALID — `formatVersion`, when set, equals the
|
|
309
|
+
/// version this engine pins to (2 for `iceberg_parquet_v2`).
|
|
310
|
+
formatVersionViolations() {
|
|
311
|
+
const { formatVersion, } = this.definition;
|
|
312
|
+
const expected = this.constructor.EXPECTED_FORMAT_VERSION;
|
|
313
|
+
if (formatVersion === undefined || formatVersion === expected) {
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
return [
|
|
317
|
+
this.violation({
|
|
318
|
+
level: 'error',
|
|
319
|
+
code: 'ICEBERG_FORMAT_VERSION_VALID',
|
|
320
|
+
field: 'formatVersion',
|
|
321
|
+
message: `Iceberg formatVersion "${formatVersion}" must be ${expected}`,
|
|
322
|
+
}),
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Validate the closed-domain Iceberg table properties. Keys outside the
|
|
327
|
+
* known set pass through unvalidated.
|
|
328
|
+
*
|
|
329
|
+
* Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`,
|
|
330
|
+
* `ICEBERG_PROPERTY_NON_NEGATIVE_INT`, `ICEBERG_PROPERTY_INT_RANGE`, and
|
|
331
|
+
* `ICEBERG_COMMIT_RETRY_ORDERING`.
|
|
332
|
+
*
|
|
333
|
+
* @returns Every table-property violation.
|
|
334
|
+
*/
|
|
335
|
+
tablePropertyViolations() {
|
|
336
|
+
const violations = [];
|
|
337
|
+
const properties = this.definition.tableProperties;
|
|
338
|
+
for (const [key, value,] of Object.entries(properties)) {
|
|
339
|
+
const allowed = IcebergParquetV2Table.ENUM_PROPERTIES[key];
|
|
340
|
+
if (allowed !== undefined && !allowed.includes(value)) {
|
|
341
|
+
violations.push(this.violation({
|
|
342
|
+
level: 'error',
|
|
343
|
+
code: 'ICEBERG_PROPERTY_ENUM_VALID',
|
|
344
|
+
field: `tableProperties["${key}"]`,
|
|
345
|
+
message: `table property "${key}" value "${value}" must be one of: ${allowed.join(', ')}`,
|
|
346
|
+
}));
|
|
347
|
+
}
|
|
348
|
+
if (IcebergParquetV2Table.POSITIVE_INT_PROPERTIES.includes(key) && !isPositiveInteger(value)) {
|
|
349
|
+
violations.push(this.violation({
|
|
350
|
+
level: 'error',
|
|
351
|
+
code: 'ICEBERG_PROPERTY_POSITIVE_INT',
|
|
352
|
+
field: `tableProperties["${key}"]`,
|
|
353
|
+
message: `table property "${key}" value "${value}" must be a positive integer`,
|
|
354
|
+
}));
|
|
355
|
+
}
|
|
356
|
+
if (IcebergParquetV2Table.NON_NEGATIVE_INT_PROPERTIES.includes(key) && !isNonNegativeInteger(value)) {
|
|
357
|
+
violations.push(this.violation({
|
|
358
|
+
level: 'error',
|
|
359
|
+
code: 'ICEBERG_PROPERTY_NON_NEGATIVE_INT',
|
|
360
|
+
field: `tableProperties["${key}"]`,
|
|
361
|
+
message: `table property "${key}" value "${value}" must be a non-negative integer`,
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
364
|
+
const range = IcebergParquetV2Table.INT_RANGE_PROPERTIES[key];
|
|
365
|
+
if (range !== undefined && !isIntegerInRange(value, range.min, range.max)) {
|
|
366
|
+
violations.push(this.violation({
|
|
367
|
+
level: 'error',
|
|
368
|
+
code: 'ICEBERG_PROPERTY_INT_RANGE',
|
|
369
|
+
field: `tableProperties["${key}"]`,
|
|
370
|
+
message: `table property "${key}" value "${value}" must be an integer between `
|
|
371
|
+
+ `${range.min} and ${range.max}`,
|
|
372
|
+
}));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
violations.push(...this.commitRetryOrderingViolations(properties));
|
|
376
|
+
return violations;
|
|
377
|
+
}
|
|
378
|
+
/// ICEBERG_COMMIT_RETRY_ORDERING — commit.retry waits obey
|
|
379
|
+
/// min-wait-ms <= max-wait-ms <= total-timeout-ms when all are positive ints.
|
|
380
|
+
commitRetryOrderingViolations(properties) {
|
|
381
|
+
const values = [
|
|
382
|
+
properties['commit.retry.min-wait-ms'],
|
|
383
|
+
properties['commit.retry.max-wait-ms'],
|
|
384
|
+
properties['commit.retry.total-timeout-ms'],
|
|
385
|
+
];
|
|
386
|
+
if (!values.every((value) => value !== undefined && isPositiveInteger(value))) {
|
|
387
|
+
return [];
|
|
388
|
+
}
|
|
389
|
+
const [min, max, total,] = values.map(Number);
|
|
390
|
+
if (min <= max && max <= total) {
|
|
391
|
+
return [];
|
|
392
|
+
}
|
|
393
|
+
return [
|
|
394
|
+
this.violation({
|
|
395
|
+
level: 'error',
|
|
396
|
+
code: 'ICEBERG_COMMIT_RETRY_ORDERING',
|
|
397
|
+
field: 'tableProperties["commit.retry.min-wait-ms"]',
|
|
398
|
+
message: 'commit.retry waits must satisfy min-wait-ms <= max-wait-ms <= total-timeout-ms',
|
|
399
|
+
}),
|
|
400
|
+
];
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Validate Iceberg identifier fields (the row-identity / equality-delete
|
|
404
|
+
* key). Equality deletes are a v2 feature, which this engine inherently is;
|
|
405
|
+
* identifier fields must be required primitive columns that are not
|
|
406
|
+
* float/double.
|
|
407
|
+
*
|
|
408
|
+
* Emits `ICEBERG_IDENTIFIER_COLUMN_EXISTS`, `ICEBERG_IDENTIFIER_REQUIRED`,
|
|
409
|
+
* and `ICEBERG_IDENTIFIER_TYPE_PRIMITIVE`.
|
|
410
|
+
*
|
|
411
|
+
* @returns Every identifier-field violation.
|
|
412
|
+
*/
|
|
413
|
+
identifierFieldViolations() {
|
|
414
|
+
const violations = [];
|
|
415
|
+
const { identifierFields, } = this.definition;
|
|
416
|
+
if (identifierFields.length === 0) {
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
identifierFields.forEach((name, index) => {
|
|
420
|
+
const field = `identifierFields[${index}]`;
|
|
421
|
+
const column = this.definition.columns.find((candidate) => candidate.name === name);
|
|
422
|
+
if (column === undefined) {
|
|
423
|
+
violations.push(this.violation({
|
|
424
|
+
level: 'error',
|
|
425
|
+
code: 'ICEBERG_IDENTIFIER_COLUMN_EXISTS',
|
|
426
|
+
field,
|
|
427
|
+
message: `identifier field "${name}" is not defined in columns`,
|
|
428
|
+
}));
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (column.nullable === true) {
|
|
432
|
+
violations.push(this.violation({
|
|
433
|
+
level: 'error',
|
|
434
|
+
code: 'ICEBERG_IDENTIFIER_REQUIRED',
|
|
435
|
+
field,
|
|
436
|
+
message: `identifier field "${name}" must be required (nullable: false)`,
|
|
437
|
+
}));
|
|
438
|
+
}
|
|
439
|
+
const type = (0, iceberg_1.parseIcebergType)(column.type);
|
|
440
|
+
if (type === null || type.kind === iceberg_1.IcebergTypeKind.FLOAT || type.kind === iceberg_1.IcebergTypeKind.DOUBLE) {
|
|
441
|
+
violations.push(this.violation({
|
|
442
|
+
level: 'error',
|
|
443
|
+
code: 'ICEBERG_IDENTIFIER_TYPE_PRIMITIVE',
|
|
444
|
+
field,
|
|
445
|
+
message: `identifier field "${name}" must be a primitive type other than float or double`,
|
|
446
|
+
}));
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
return violations;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Normalize a partition into its identity key. When the transform parses,
|
|
453
|
+
* collapse on `${kind}:${param}` so `day` and `DAY`, `bucket[16]` and
|
|
454
|
+
* `bucket[ 16 ]` are the same. When the transform doesn't parse, the
|
|
455
|
+
* lowercased trim of the raw string is the best identity we have.
|
|
456
|
+
*
|
|
457
|
+
* @param partition Partition to key.
|
|
458
|
+
* @returns The identity string for duplicate detection.
|
|
459
|
+
*/
|
|
460
|
+
partitionKey(partition) {
|
|
461
|
+
const transform = (0, iceberg_1.parseIcebergTransform)(partition.type);
|
|
462
|
+
const normalizedTransform = transform
|
|
463
|
+
? `${transform.kind}:${transform.param ?? ''}`
|
|
464
|
+
: partition.type.trim().toLowerCase();
|
|
465
|
+
return `${partition.name} ${normalizedTransform}`;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
exports.IcebergParquetV2Table = IcebergParquetV2Table;
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC12Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBT0gsOENBRXVCO0FBQ3ZCLHdDQU1vQjtBQUVwQjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDcEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxLQUFhO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELE1BQWEscUJBQXNCLFNBQVEsMEJBQWE7SUFDcEQ7OztPQUdHO0lBQ08sTUFBTSxDQUFVLHVCQUF1QixHQUFHLENBQUMsQ0FBQztJQUV0RDs7Ozs7T0FLRztJQUNJLGlCQUFpQixDQUFDLElBQVk7UUFDakMsT0FBTyxJQUFBLDRCQUFrQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksbUJBQW1CO1FBQ3RC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RCxNQUFNLG1CQUFtQixHQUFHLFNBQVM7WUFDakMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3RELENBQUM7O0FBOWNMLHNEQStjQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSWNlYmVyZyAocGFycXVldCkgZm9ybWF0LXZlcnNpb24tMiB0YWJsZSB0eXBlLlxuICpcbiAqIEljZWJlcmcgcGFydGl0aW9ucyBhcmUgdHJhbnNmb3JtcyBhcHBsaWVkIHRvIGEgZGF0YSBjb2x1bW4sIHNvIGR1cGxpY2F0ZVxuICogZGV0ZWN0aW9uIGtleXMgb24gdGhlIChzb3VyY2UgY29sdW1uLCBub3JtYWxpemVkIHRyYW5zZm9ybSkgcGFpciDigJQgYHllYXIodHMpYFxuICogYW5kIGBtb250aCh0cylgIGFyZSBkaXN0aW5jdCwgd2hpbGUgYGRheWAgYW5kIGBEQVlgIGNvbGxhcHNlLlxuICpcbiAqIFRoZSBmb3JtYXQgdmVyc2lvbiBpcyBlbmNvZGVkIGluIHRoZSBgdGFibGVUeXBlYCBkaXNjcmltaW5hdG9yOiB0aGlzIGVuZ2luZSBpc1xuICogaW5oZXJlbnRseSB2Miwgc28gYSBwcmVzZW50IGBmb3JtYXRWZXJzaW9uYCBtdXN0IGVxdWFsIGBFWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTmAuXG4gKiBBIGZ1dHVyZSBgaWNlYmVyZ19wYXJxdWV0X3YzYCBzaWJsaW5nIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGF0IG9uZSBjb25zdGFudC5cbiAqL1xuXG5pbXBvcnQge1xuICAgIFBhcnRpdGlvbixcbiAgICBTb3J0RmllbGQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4uL3RhYmxlLXR5cGUnO1xuaW1wb3J0IHtcbiAgICBJY2ViZXJnVHlwZUtpbmQsXG4gICAgaXNWYWxpZEljZWJlcmdUeXBlLFxuICAgIHBhcnNlSWNlYmVyZ1RyYW5zZm9ybSxcbiAgICBwYXJzZUljZWJlcmdUeXBlLFxuICAgIHRyYW5zZm9ybUxlZ2FsT25UeXBlLFxufSBmcm9tICcuLi9pY2ViZXJnJztcblxuLyoqXG4gKiBXaGV0aGVyIGEgc3RyaW5nIGlzIGEgcG9zaXRpdmUgaW50ZWdlciAoZGlnaXRzIG9ubHksIHZhbHVlID4gMCkuIEljZWJlcmdcbiAqIHRhYmxlLXByb3BlcnR5IHZhbHVlcyBhcmUgc3RyaW5ncywgc28gbnVtZXJpYyBjaGVja3MgcGFyc2UgdGhlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgUHJvcGVydHkgdmFsdWUgc3RyaW5nLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGB2YWx1ZWAgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QodmFsdWUpICYmIE51bWJlcih2YWx1ZSkgPiAwO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciAoZGlnaXRzIG9ubHksIHZhbHVlID49IDApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eXFxkKyQvLnRlc3QodmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYW4gaW50ZWdlciB3aXRoaW4gYW4gaW5jbHVzaXZlIHJhbmdlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbWluIEluY2x1c2l2ZSBsb3dlciBib3VuZC5cbiAqIEBwYXJhbSBtYXggSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciBpbiBgW21pbiwgbWF4XWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlckluUmFuZ2UodmFsdWU6IHN0cmluZywgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCEvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIHBhcnNlZCA+PSBtaW4gJiYgcGFyc2VkIDw9IG1heDtcbn1cblxuLyoqIEljZWJlcmcgKHBhcnF1ZXQpIGZvcm1hdC12ZXJzaW9uLTIgdGFibGUuICovXG5leHBvcnQgY2xhc3MgSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlIGV4dGVuZHMgVGFibGVUeXBlQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIEljZWJlcmcgZm9ybWF0IHZlcnNpb24gdGhpcyBlbmdpbmUgcGlucyB0by4gQSBwcmVzZW50IGBmb3JtYXRWZXJzaW9uYFxuICAgICAqIG11c3QgZXF1YWwgdGhpcy4gQSBmdXR1cmUgdjMgc2libGluZyBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcyBzaW5nbGUgdmFsdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBFWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTiA9IDI7XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIEljZWJlcmcgdjAgdHlwZSByZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgc3RyaW5nIGZyb20gYSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHR5cGUgaXMgYSB2YWxpZCBJY2ViZXJnIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGlzVmFsaWRDb2x1bW5UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNWYWxpZEljZWJlcmdUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgcGFydGl0aW9uIHJ1bGVzLlxuICAgICAqXG4gICAgICogRW1pdHM6IGBOT19EVVBMSUNBVEVfUEFSVElUSU9OU2AgKGtleWVkIGJ5IGAke25hbWV9ICR7dHJhbnNmb3JtS2luZH06JHtwYXJhbX1gLFxuICAgICAqIGZhbGxpbmcgYmFjayB0byBhIGxvd2VyY2FzZWQgdHJpbSBvZiB0aGUgcmF3IHRyYW5zZm9ybSB3aGVuIGl0IGRvZXNuJ3RcbiAgICAgKiBwYXJzZSwgc28gd2hpdGVzcGFjZSAvIGNhc2UgdmFyaWFudHMgb2YgdGhlIHNhbWUgdHJhbnNmb3JtIGNvbGxhcHNlKSxcbiAgICAgKiBgSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUU2AsIGBJQ0VCRVJHX1RSQU5TRk9STV9WQUxJRGAsIGFuZFxuICAgICAqIGBJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfVFlQRV9MRUdBTGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnBhcnRpdGlvbktleShwYXJ0aXRpb24pO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ05PX0RVUExJQ0FURV9QQVJUSVRJT05TJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgcGFydGl0aW9uOiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgd2l0aCB0cmFuc2Zvcm0gXCIke3BhcnRpdGlvbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJ0aXRpb25zLmZvckVhY2goKHBhcnRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IHBhcnRpdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJY2ViZXJnIHBhcnRpdGlvbiBzb3VyY2UgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfVFJBTlNGT1JNX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgYSB2YWxpZCBJY2ViZXJnIHBhcnRpdGlvbiB0cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gcGFyc2VJY2ViZXJnVHlwZShzb3VyY2VDb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gbnVsbCAmJiAhdHJhbnNmb3JtTGVnYWxPblR5cGUodHJhbnNmb3JtLCBzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX1RZUEVfTEVHQUwnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdHJhbnNmb3JtIFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgbGVnYWwgb24gYFxuICAgICAgICAgICAgICAgICAgICAgICAgKyBgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBvZiB0eXBlIFwiJHtzb3VyY2VDb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGNvbWUgZnJvbSBhIGNsb3NlZCBzZXQuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5VTV9QUk9QRVJUSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gICAgICAgICd3cml0ZS5mb3JtYXQuZGVmYXVsdCc6IFtcbiAgICAgICAgICAgICdwYXJxdWV0JyxcbiAgICAgICAgICAgICdhdnJvJyxcbiAgICAgICAgICAgICdvcmMnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUucGFycXVldC5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdnemlwJyxcbiAgICAgICAgICAgICdzbmFwcHknLFxuICAgICAgICAgICAgJ2x6NCcsXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgIF0sXG4gICAgICAgICd3cml0ZS5hdnJvLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ3NuYXBweScsXG4gICAgICAgICAgICAndW5jb21wcmVzc2VkJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm9yYy5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdsejQnLFxuICAgICAgICAgICAgJ2x6bycsXG4gICAgICAgICAgICAnemxpYicsXG4gICAgICAgICAgICAnc25hcHB5JyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLmRpc3RyaWJ1dGlvbi1tb2RlJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2hhc2gnLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICBdLFxuICAgIH07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1NJVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICd3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1zbmFwc2hvdC1hZ2UtbXMnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWluLXNuYXBzaG90cy10by1rZWVwJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1yZWYtYWdlLW1zJyxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLnByZXZpb3VzLXZlcnNpb25zLW1heCcsXG4gICAgICAgICdjb21taXQucmV0cnkubWluLXdhaXQtbXMnLFxuICAgICAgICAnY29tbWl0LnJldHJ5Lm1heC13YWl0LW1zJyxcbiAgICAgICAgJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJyxcbiAgICBdO1xuXG4gICAgLy8vIFRhYmxlLXByb3BlcnR5IGtleXMgd2hvc2UgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5PTl9ORUdBVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICdjb21taXQucmV0cnkubnVtLXJldHJpZXMnLFxuICAgIF07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgd2l0aGluIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTlRfUkFOR0VfUFJPUEVSVElFUzogUmVjb3JkPHN0cmluZywgeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfT4gPSB7XG4gICAgICAgICd3cml0ZS5wYXJxdWV0LmNvbXByZXNzaW9uLWxldmVsJzoge1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiAyMixcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8vIExlZ2FsIHNvcnQgZGlyZWN0aW9ucyBhbmQgbnVsbCBvcmRlcmluZ3MuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09SVF9ESVJFQ1RJT05TID0gbmV3IFNldChbXG4gICAgICAgICdhc2MnLFxuICAgICAgICAnZGVzYycsXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTT1JUX05VTExfT1JERVJTID0gbmV3IFNldChbXG4gICAgICAgICdudWxscy1maXJzdCcsXG4gICAgICAgICdudWxscy1sYXN0JyxcbiAgICBdKTtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgZW5naW5lLXNwZWNpZmljIHJ1bGVzOiBmb3JtYXQgdmVyc2lvbiwgdGFibGUgcHJvcGVydGllcywgYW5kIHNvcnRcbiAgICAgKiBvcmRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGVuZ2luZS1zcGVjaWZpYyB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGVuZ2luZVNwZWNpZmljVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLmZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnNvcnRPcmRlclZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuaWRlbnRpZmllckZpZWxkVmlvbGF0aW9ucygpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBJY2ViZXJnIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgTk9fRFVQTElDQVRFX1NPUlRfRklFTERTYCAoa2V5ZWQgYnkgc291cmNlIGNvbHVtbiArIG5vcm1hbGl6ZWRcbiAgICAgKiB0cmFuc2Zvcm0pLCBgSUNFQkVSR19TT1JUX0NPTFVNTl9FWElTVFNgLCBgSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRGAsXG4gICAgICogYElDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEYCwgYElDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSURgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHNvcnQtb3JkZXIgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydE9yZGVyVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc29ydEZpZWxkS2V5KGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfU09SVF9GSUVMRFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHNvcnQgZmllbGQ6IFwiJHtmaWVsZC5jb2x1bW59XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAke2ZpZWxkLnRyYW5zZm9ybSA/IGAgd2l0aCB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cImAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLlNPUlRfRElSRUNUSU9OUy5oYXMoZmllbGQuZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS5kaXJlY3Rpb25gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc29ydCBkaXJlY3Rpb24gXCIke2ZpZWxkLmRpcmVjdGlvbn1cIiBtdXN0IGJlIFwiYXNjXCIgb3IgXCJkZXNjXCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLlNPUlRfTlVMTF9PUkRFUlMuaGFzKGZpZWxkLm51bGxPcmRlcikpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLm51bGxPcmRlcmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzb3J0IG51bGwgb3JkZXIgXCIke2ZpZWxkLm51bGxPcmRlcn1cIiBtdXN0IGJlIFwibnVsbHMtZmlyc3RcIiBvciBcIm51bGxzLWxhc3RcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBmaWVsZC5jb2x1bW4pO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1NPUlRfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS5jb2x1bW5gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc29ydCBjb2x1bW4gXCIke2ZpZWxkLmNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmllbGQudHJhbnNmb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0oZmllbGQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0udHJhbnNmb3JtYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtmaWVsZC50cmFuc2Zvcm19XCIgaXMgbm90IGEgdmFsaWQgSWNlYmVyZyB0cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gcGFyc2VJY2ViZXJnVHlwZShzb3VyY2VDb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gbnVsbCAmJiAhdHJhbnNmb3JtTGVnYWxPblR5cGUodHJhbnNmb3JtLCBzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLnRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cIiBpcyBub3QgbGVnYWwgb24gYFxuICAgICAgICAgICAgICAgICAgICAgICAgKyBgY29sdW1uIFwiJHtmaWVsZC5jb2x1bW59XCIgb2YgdHlwZSBcIiR7c291cmNlQ29sdW1uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIGEgc29ydCBmaWVsZCBpbnRvIGl0cyBpZGVudGl0eSBrZXkuIEFuIG9taXR0ZWQgdHJhbnNmb3JtIGFuZCBhblxuICAgICAqIGV4cGxpY2l0IGBpZGVudGl0eWAgY29sbGFwc2UgdG8gdGhlIHNhbWUga2V5IHNvIHRoZXkgY291bnQgYXMgZHVwbGljYXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZCBTb3J0IGZpZWxkIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydEZpZWxkS2V5KGZpZWxkOiBTb3J0RmllbGQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoZmllbGQudHJhbnNmb3JtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZC5jb2x1bW59IGlkZW50aXR5OmA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKGZpZWxkLnRyYW5zZm9ybSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgID8gYCR7dHJhbnNmb3JtLmtpbmR9OiR7dHJhbnNmb3JtLnBhcmFtID8/ICcnfWBcbiAgICAgICAgICAgIDogZmllbGQudHJhbnNmb3JtLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gYCR7ZmllbGQuY29sdW1ufSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG5cbiAgICAvLy8gSUNFQkVSR19GT1JNQVRfVkVSU0lPTl9WQUxJRCDigJQgYGZvcm1hdFZlcnNpb25gLCB3aGVuIHNldCwgZXF1YWxzIHRoZVxuICAgIC8vLyB2ZXJzaW9uIHRoaXMgZW5naW5lIHBpbnMgdG8gKDIgZm9yIGBpY2ViZXJnX3BhcnF1ZXRfdjJgKS5cbiAgICBwcml2YXRlIGZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZm9ybWF0VmVyc2lvbixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlKS5FWFBFQ1RFRF9GT1JNQVRfVkVSU0lPTjtcbiAgICAgICAgaWYgKGZvcm1hdFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBmb3JtYXRWZXJzaW9uID09PSBleHBlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfRk9STUFUX1ZFUlNJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZm9ybWF0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgZm9ybWF0VmVyc2lvbiBcIiR7Zm9ybWF0VmVyc2lvbn1cIiBtdXN0IGJlICR7ZXhwZWN0ZWR9YCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBjbG9zZWQtZG9tYWluIEljZWJlcmcgdGFibGUgcHJvcGVydGllcy4gS2V5cyBvdXRzaWRlIHRoZVxuICAgICAqIGtub3duIHNldCBwYXNzIHRocm91Z2ggdW52YWxpZGF0ZWQuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgSUNFQkVSR19QUk9QRVJUWV9FTlVNX1ZBTElEYCwgYElDRUJFUkdfUFJPUEVSVFlfUE9TSVRJVkVfSU5UYCxcbiAgICAgKiBgSUNFQkVSR19QUk9QRVJUWV9OT05fTkVHQVRJVkVfSU5UYCwgYElDRUJFUkdfUFJPUEVSVFlfSU5UX1JBTkdFYCwgYW5kXG4gICAgICogYElDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHRhYmxlLXByb3BlcnR5IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZGVmaW5pdGlvbi50YWJsZVByb3BlcnRpZXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgXSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IEljZWJlcmdQYXJxdWV0VjJUYWJsZS5FTlVNX1BST1BFUlRJRVNba2V5XTtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgIWFsbG93ZWQuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0VOVU1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIG9uZSBvZjogJHthbGxvd2VkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChJY2ViZXJnUGFycXVldFYyVGFibGUuUE9TSVRJVkVfSU5UX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSAmJiAhaXNQb3NpdGl2ZUludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX1BPU0lUSVZFX0lOVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChJY2ViZXJnUGFycXVldFYyVGFibGUuTk9OX05FR0FUSVZFX0lOVF9QUk9QRVJUSUVTLmluY2x1ZGVzKGtleSkgJiYgIWlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19QUk9QRVJUWV9OT05fTkVHQVRJVkVfSU5UJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGB0YWJsZVByb3BlcnRpZXNbXCIke2tleX1cIl1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgcHJvcGVydHkgXCIke2tleX1cIiB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLklOVF9SQU5HRV9QUk9QRVJUSUVTW2tleV07XG4gICAgICAgICAgICBpZiAocmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZSwgcmFuZ2UubWluLCByYW5nZS5tYXgpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0lOVF9SQU5HRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7cmFuZ2UubWlufSBhbmQgJHtyYW5nZS5tYXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy5jb21taXRSZXRyeU9yZGVyaW5nVmlvbGF0aW9ucyhwcm9wZXJ0aWVzKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIElDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HIOKAlCBjb21taXQucmV0cnkgd2FpdHMgb2JleVxuICAgIC8vLyBtaW4td2FpdC1tcyA8PSBtYXgtd2FpdC1tcyA8PSB0b3RhbC10aW1lb3V0LW1zIHdoZW4gYWxsIGFyZSBwb3NpdGl2ZSBpbnRzLlxuICAgIHByaXZhdGUgY29tbWl0UmV0cnlPcmRlcmluZ1Zpb2xhdGlvbnMocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgICAgICAgcHJvcGVydGllc1snY29tbWl0LnJldHJ5Lm1pbi13YWl0LW1zJ10sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzWydjb21taXQucmV0cnkubWF4LXdhaXQtbXMnXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXNbJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJ10sXG4gICAgICAgIF07XG4gICAgICAgIGlmICghdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgIF0gPSB2YWx1ZXMubWFwKE51bWJlcik7XG4gICAgICAgIGlmIChtaW4gPD0gbWF4ICYmIG1heCA8PSB0b3RhbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3RhYmxlUHJvcGVydGllc1tcImNvbW1pdC5yZXRyeS5taW4td2FpdC1tc1wiXScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2NvbW1pdC5yZXRyeSB3YWl0cyBtdXN0IHNhdGlzZnkgbWluLXdhaXQtbXMgPD0gbWF4LXdhaXQtbXMgPD0gdG90YWwtdGltZW91dC1tcycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBJY2ViZXJnIGlkZW50aWZpZXIgZmllbGRzICh0aGUgcm93LWlkZW50aXR5IC8gZXF1YWxpdHktZGVsZXRlXG4gICAgICoga2V5KS4gRXF1YWxpdHkgZGVsZXRlcyBhcmUgYSB2MiBmZWF0dXJlLCB3aGljaCB0aGlzIGVuZ2luZSBpbmhlcmVudGx5IGlzO1xuICAgICAqIGlkZW50aWZpZXIgZmllbGRzIG11c3QgYmUgcmVxdWlyZWQgcHJpbWl0aXZlIGNvbHVtbnMgdGhhdCBhcmUgbm90XG4gICAgICogZmxvYXQvZG91YmxlLlxuICAgICAqXG4gICAgICogRW1pdHMgYElDRUJFUkdfSURFTlRJRklFUl9DT0xVTU5fRVhJU1RTYCwgYElDRUJFUkdfSURFTlRJRklFUl9SRVFVSVJFRGAsXG4gICAgICogYW5kIGBJQ0VCRVJHX0lERU5USUZJRVJfVFlQRV9QUklNSVRJVkVgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaWRlbnRpZmllci1maWVsZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBpZGVudGlmaWVyRmllbGRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaWRlbnRpZmllckZpZWxkcyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBpZiAoaWRlbnRpZmllckZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkZW50aWZpZXJGaWVsZHMuZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGlkZW50aWZpZXJGaWVsZHNbJHtpbmRleH1dYDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgaWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX0lERU5USUZJRVJfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpZmllciBmaWVsZCBcIiR7bmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbi5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19JREVOVElGSUVSX1JFUVVJUkVEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGlmaWVyIGZpZWxkIFwiJHtuYW1lfVwiIG11c3QgYmUgcmVxdWlyZWQgKG51bGxhYmxlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKGNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUua2luZCA9PT0gSWNlYmVyZ1R5cGVLaW5kLkZMT0FUIHx8IHR5cGUua2luZCA9PT0gSWNlYmVyZ1R5cGVLaW5kLkRPVUJMRSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19JREVOVElGSUVSX1RZUEVfUFJJTUlUSVZFJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGlmaWVyIGZpZWxkIFwiJHtuYW1lfVwiIG11c3QgYmUgYSBwcmltaXRpdmUgdHlwZSBvdGhlciB0aGFuIGZsb2F0IG9yIGRvdWJsZWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBwYXJ0aXRpb24gaW50byBpdHMgaWRlbnRpdHkga2V5LiBXaGVuIHRoZSB0cmFuc2Zvcm0gcGFyc2VzLFxuICAgICAqIGNvbGxhcHNlIG9uIGAke2tpbmR9OiR7cGFyYW19YCBzbyBgZGF5YCBhbmQgYERBWWAsIGBidWNrZXRbMTZdYCBhbmRcbiAgICAgKiBgYnVja2V0WyAxNiBdYCBhcmUgdGhlIHNhbWUuIFdoZW4gdGhlIHRyYW5zZm9ybSBkb2Vzbid0IHBhcnNlLCB0aGVcbiAgICAgKiBsb3dlcmNhc2VkIHRyaW0gb2YgdGhlIHJhdyBzdHJpbmcgaXMgdGhlIGJlc3QgaWRlbnRpdHkgd2UgaGF2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb24gUGFydGl0aW9uIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFydGl0aW9uS2V5KHBhcnRpdGlvbjogUGFydGl0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBwYXJ0aXRpb24udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGAke3BhcnRpdGlvbi5uYW1lfSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG59XG4iXX0=
|
|
@@ -8,12 +8,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.createTableType = createTableType;
|
|
9
9
|
const model_1 = require("../model");
|
|
10
10
|
const hive_parquet_1 = require("./hive-parquet");
|
|
11
|
-
const
|
|
11
|
+
const iceberg_parquet_v2_1 = require("./iceberg-parquet-v2");
|
|
12
12
|
const postgres_18_1 = require("./postgres-18");
|
|
13
13
|
/// Exhaustive map: every value of the `TableType` enum has a concrete subclass.
|
|
14
14
|
const REGISTRY = {
|
|
15
15
|
[model_1.TableType.HIVE_PARQUET]: hive_parquet_1.HiveParquetTable,
|
|
16
|
-
[model_1.TableType.
|
|
16
|
+
[model_1.TableType.ICEBERG_PARQUET_V2]: iceberg_parquet_v2_1.IcebergParquetV2Table,
|
|
17
17
|
[model_1.TableType.POSTGRES_18]: postgres_18_1.Postgres18Table,
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
@@ -33,4 +33,4 @@ function createTableType(fields) {
|
|
|
33
33
|
const Constructor = REGISTRY[tableType] ?? hive_parquet_1.HiveParquetTable;
|
|
34
34
|
return new Constructor(fields);
|
|
35
35
|
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7O0FBbUNILDBDQVVDO0FBM0NELG9DQUVrQjtBQUtsQixpREFFd0I7QUFDeEIsNkRBRThCO0FBQzlCLCtDQUV1QjtBQUt2QixnRkFBZ0Y7QUFDaEYsTUFBTSxRQUFRLEdBQTRDO0lBQ3RELENBQUMsaUJBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSwrQkFBZ0I7SUFDMUMsQ0FBQyxpQkFBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsMENBQXFCO0lBQ3JELENBQUMsaUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSw2QkFBZTtDQUMzQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsTUFBdUI7SUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFzQixDQUFDO0lBQzNELDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsNkJBQTZCO0lBQzdCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSwrQkFBZ0IsQ0FBQztJQUM1RCxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlZ2lzdHJ5IG1hcHBpbmcgdGhlIGB0YWJsZVR5cGVgIHN0cmluZyB0byB0aGUgY29uY3JldGUgYFRhYmxlVHlwZUJhc2VgXG4gKiBzdWJjbGFzcyB0aGF0IGltcGxlbWVudHMgaXQuIEFkZGluZyBhIG5ldyBlbmdpbmUgaXMgYSBtYXR0ZXIgb2Ygd3JpdGluZyBhXG4gKiBzdWJjbGFzcyBhbmQgYWRkaW5nIG9uZSBlbnRyeSBoZXJlLlxuICovXG5cbmltcG9ydCB7XG4gICAgVGFibGVUeXBlLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG4gICAgVGFibGVUeXBlRmllbGRzLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgSGl2ZVBhcnF1ZXRUYWJsZSxcbn0gZnJvbSAnLi9oaXZlLXBhcnF1ZXQnO1xuaW1wb3J0IHtcbiAgICBJY2ViZXJnUGFycXVldFYyVGFibGUsXG59IGZyb20gJy4vaWNlYmVyZy1wYXJxdWV0LXYyJztcbmltcG9ydCB7XG4gICAgUG9zdGdyZXMxOFRhYmxlLFxufSBmcm9tICcuL3Bvc3RncmVzLTE4JztcblxuLyoqIENvbnN0cnVjdG9yIHNpZ25hdHVyZSBzaGFyZWQgYnkgZXZlcnkgY29uY3JldGUgdGFibGUgc3ViY2xhc3MuICovXG50eXBlIFRhYmxlVHlwZUNvbnN0cnVjdG9yID0gbmV3IChmaWVsZHM6IFRhYmxlVHlwZUZpZWxkcykgPT4gVGFibGVUeXBlQmFzZTtcblxuLy8vIEV4aGF1c3RpdmUgbWFwOiBldmVyeSB2YWx1ZSBvZiB0aGUgYFRhYmxlVHlwZWAgZW51bSBoYXMgYSBjb25jcmV0ZSBzdWJjbGFzcy5cbmNvbnN0IFJFR0lTVFJZOiBSZWNvcmQ8VGFibGVUeXBlLCBUYWJsZVR5cGVDb25zdHJ1Y3Rvcj4gPSB7XG4gICAgW1RhYmxlVHlwZS5ISVZFX1BBUlFVRVRdOiBIaXZlUGFycXVldFRhYmxlLFxuICAgIFtUYWJsZVR5cGUuSUNFQkVSR19QQVJRVUVUX1YyXTogSWNlYmVyZ1BhcnF1ZXRWMlRhYmxlLFxuICAgIFtUYWJsZVR5cGUuUE9TVEdSRVNfMThdOiBQb3N0Z3JlczE4VGFibGUsXG59O1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgc3ViY2xhc3MgZm9yIHRoZSBnaXZlbiBmaWVsZHMuXG4gKlxuICogQHBhcmFtIGZpZWxkcyBUaGUgbm9ybWFsaXplZCB0YWJsZSBmaWVsZHMuXG4gKiBAcmV0dXJucyBBIGNvbmNyZXRlIHRhYmxlIGluc3RhbmNlIGZvciB0aGUgZW5naW5lIG5hbWVkIGJ5IGBmaWVsZHMuZGVmaW5pdGlvbi50YWJsZVR5cGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVUeXBlKGZpZWxkczogVGFibGVUeXBlRmllbGRzKTogVGFibGVUeXBlQmFzZSB7XG4gICAgY29uc3QgdGFibGVUeXBlID0gZmllbGRzLmRlZmluaXRpb24udGFibGVUeXBlIGFzIFRhYmxlVHlwZTtcbiAgICAvLy8gQW4gdW5yZWNvZ25pemVkIGB0YWJsZVR5cGVgIG9ubHkgb2NjdXJzIHdoZW4gTGF5ZXIgMSBhbHJlYWR5IGZsYWdnZWQgdGhlXG4gICAgLy8vIGZpbGU6IHN1Y2ggdGFibGVzIGFyZSBza2lwcGVkIGJ5IGludHJhLXRhYmxlIHJ1bGVzIGFuZCBza2lwcGVkIGFzIEZLXG4gICAgLy8vIHRhcmdldHMsIHNvIHRoZSBjaG9pY2UgaGVyZSBpcyBwdXJlbHkgZm9yIGNyb3NzLWZpbGUgKnJlc29sdXRpb24qICh0aGVcbiAgICAvLy8gaW5zdGFuY2Ugc3RpbGwgbmVlZHMgdG8gbGFuZCBpbiBgd29ybGQudGFibGVzYCBzbyBkZXBlbmRzT24gLyBGSyBzb3VyY2VcbiAgICAvLy8gbG9va3VwcyBkb24ndCBwcmV0ZW5kIHRoZSBmaWxlIGlzIG1pc3NpbmcpLiBgSGl2ZVBhcnF1ZXRUYWJsZWAgaXMgdGhlXG4gICAgLy8vIHJlc29sdXRpb24tb25seSBmYWxsYmFjay5cbiAgICBjb25zdCBDb25zdHJ1Y3RvciA9IFJFR0lTVFJZW3RhYmxlVHlwZV0gPz8gSGl2ZVBhcnF1ZXRUYWJsZTtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZpZWxkcyk7XG59XG4iXX0=
|
package/package.json
CHANGED