flexdataset 0.6.1 → 0.8.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.
@@ -52,6 +52,9 @@ function asBoolean(value) {
52
52
  function asOptionalBoolean(value) {
53
53
  return typeof value === 'boolean' ? value : undefined;
54
54
  }
55
+ function asOptionalNumber(value) {
56
+ return typeof value === 'number' ? value : undefined;
57
+ }
55
58
  function asStringArray(value) {
56
59
  return asArray(value).filter((item) => typeof item === 'string');
57
60
  }
@@ -76,6 +79,16 @@ function normalizePartitions(value) {
76
79
  };
77
80
  });
78
81
  }
82
+ function normalizeStringMap(value) {
83
+ const record = asRecord(value);
84
+ const result = {};
85
+ for (const [key, raw,] of Object.entries(record)) {
86
+ if (typeof raw === 'string') {
87
+ result[key] = raw;
88
+ }
89
+ }
90
+ return result;
91
+ }
79
92
  function normalizeForeignKeys(value) {
80
93
  return asArray(value).map((raw) => {
81
94
  const record = asRecord(raw);
@@ -94,9 +107,11 @@ function normalizeTableDefinition(raw) {
94
107
  description: asString(record.description),
95
108
  tableType: asString(record.tableType),
96
109
  isRawData: asBoolean(record.isRawData),
110
+ formatVersion: asOptionalNumber(record.formatVersion),
97
111
  columns: normalizeColumns(record.columns),
98
112
  primaryKey: asStringArray(record.primaryKey),
99
113
  partitions: normalizePartitions(record.partitions),
114
+ tableProperties: normalizeStringMap(record.tableProperties),
100
115
  dependsOn: asStringArray(record.dependsOn),
101
116
  foreignKeys: normalizeForeignKeys(record.foreignKeys),
102
117
  };
@@ -240,4 +255,4 @@ function loadRoot(rootDir) {
240
255
  violations,
241
256
  };
242
257
  }
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpSUgsNEJBd0lDO0FBdlFELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFVN0IsNkNBRXNCO0FBSXRCLHFEQUVnQztBQWVoQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQWdDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFrQixFQUFFLENB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SUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7Z0JBQ3RDLE9BQU8sRUFBRSxXQUFXLFVBQVUsc0NBQXNDLFlBQVksR0FBRzthQUN0RixDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxFQUFFLFVBQVU7WUFDaEIsT0FBTztZQUNQLFdBQVc7WUFDWCxNQUFNLEVBQUUsWUFBWTtTQUN2QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILEtBQUssRUFBRTtZQUNILE9BQU8sRUFBRSxZQUFZO1lBQ3JCLE9BQU87WUFDUCxNQUFNO1NBQ1Q7UUFDRCxVQUFVO0tBQ2IsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGVzeXN0ZW0gbG9hZGVyLiBXYWxrcyBhIGRhdGFzZXQgcm9vdCwgcGFyc2VzIGVhY2ggSlNPTiBmaWxlLCBydW5zIExheWVyIDFcbiAqIHN0cnVjdHVyYWwgdmFsaWRhdGlvbiwgYW5kIG5vcm1hbGl6ZXMgZXZlcnl0aGluZyBpbnRvIGEgYFdvcmxkYCBvZlxuICogY29uY3JldGUgYFRhYmxlVHlwZUJhc2VgIGluc3RhbmNlcyB0aGF0IHRoZSBzZW1hbnRpYyBydWxlcyBvcGVyYXRlIG9uLlxuICpcbiAqIFBhcnNlIGVycm9ycywgc3RydWN0dXJhbCBlcnJvcnMsIGFuZCBhIG1pc3Npbmcgc2NoZW1hLWRlc2NyaXB0aW9uIGZpbGUgYXJlXG4gKiByZXBvcnRlZCBoZXJlOyBhbGwgY3Jvc3MtZmllbGQgLyBjcm9zcy1maWxlIGxvZ2ljIGxpdmVzIGluIHRoZSB0YWJsZS10eXBlXG4gKiBjbGFzc2VzIChgLi90YWJsZS10eXBlLnRzYCwgYC4vdGFibGUtdHlwZXMvKmApLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7XG4gICAgQ29sdW1uLFxuICAgIEZvcmVpZ25LZXksXG4gICAgUGFydGl0aW9uLFxuICAgIFNjaGVtYURlc2NyaXB0aW9uLFxuICAgIFRhYmxlRGVmaW5pdGlvbixcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZSxcbn0gZnJvbSAnLi9zdHJ1Y3R1cmFsJztcbmltcG9ydCB7XG4gICAgVGFibGVUeXBlQmFzZSxcbn0gZnJvbSAnLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgY3JlYXRlVGFibGVUeXBlLFxufSBmcm9tICcuL3RhYmxlLXR5cGVzL3JlZ2lzdHJ5JztcbmltcG9ydCB7XG4gICAgTG9hZGVkU2NoZW1hLFxuICAgIFdvcmxkLFxufSBmcm9tICcuL3dvcmxkJztcblxuLyoqIFJlc3VsdCBvZiBsb2FkaW5nIGEgcm9vdDogdGhlIG1vZGVsIHBsdXMgYW55IGxvYWQtdGltZSB2aW9sYXRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkT3V0Y29tZSB7XG4gICAgLyoqIFRoZSBsb2FkZWQgbW9kZWwuICovXG4gICAgcmVhZG9ubHkgd29ybGQ6IFdvcmxkO1xuXG4gICAgLyoqIFBhcnNlLCBzdHJ1Y3R1cmFsLCBhbmQgbWlzc2luZy1kZXNjcmlwdGlvbiB2aW9sYXRpb25zLiAqL1xuICAgIHJlYWRvbmx5IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG59XG5cbmZ1bmN0aW9uIGFzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxCb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbnModmFsdWU6IHVua25vd24pOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICB0eXBlOiBhc1N0cmluZyhyZWNvcmQudHlwZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXNTdHJpbmcocmVjb3JkLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgICAgIG51bGxhYmxlOiBhc09wdGlvbmFsQm9vbGVhbihyZWNvcmQubnVsbGFibGUpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJ0aXRpb25zKHZhbHVlOiB1bmtub3duKTogUGFydGl0aW9uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKHZhbHVlOiB1bmtub3duKTogRm9yZWlnbktleVtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlOiBhc1N0cmluZyhyZWNvcmQuc291cmNlVGFibGUpLFxuICAgICAgICAgICAgc291cmNlQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQuc291cmNlQ29sdW1uKSxcbiAgICAgICAgICAgIGxvY2FsQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQubG9jYWxDb2x1bW4pLFxuICAgICAgICAgICAgYWxsb3dOdWxsczogYXNCb29sZWFuKHJlY29yZC5hbGxvd051bGxzKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGFibGVEZWZpbml0aW9uKHJhdzogdW5rbm93bik6IFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIHRhYmxlVHlwZTogYXNTdHJpbmcocmVjb3JkLnRhYmxlVHlwZSksXG4gICAgICAgIGlzUmF3RGF0YTogYXNCb29sZWFuKHJlY29yZC5pc1Jhd0RhdGEpLFxuICAgICAgICBjb2x1bW5zOiBub3JtYWxpemVDb2x1bW5zKHJlY29yZC5jb2x1bW5zKSxcbiAgICAgICAgcHJpbWFyeUtleTogYXNTdHJpbmdBcnJheShyZWNvcmQucHJpbWFyeUtleSksXG4gICAgICAgIHBhcnRpdGlvbnM6IG5vcm1hbGl6ZVBhcnRpdGlvbnMocmVjb3JkLnBhcnRpdGlvbnMpLFxuICAgICAgICBkZXBlbmRzT246IGFzU3RyaW5nQXJyYXkocmVjb3JkLmRlcGVuZHNPbiksXG4gICAgICAgIGZvcmVpZ25LZXlzOiBub3JtYWxpemVGb3JlaWduS2V5cyhyZWNvcmQuZm9yZWlnbktleXMpLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjaGVtYURlc2NyaXB0aW9uKHJhdzogdW5rbm93bik6IFNjaGVtYURlc2NyaXB0aW9uIHtcbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNwZWNWZXJzaW9uOiBhc1N0cmluZyhyZWNvcmQuc3BlY1ZlcnNpb24pLFxuICAgICAgICBkZXNjcmlwdGlvbjogYXNTdHJpbmcocmVjb3JkLmRlc2NyaXB0aW9uKSxcbiAgICB9O1xufVxuXG4vLy8gU2NoZW1hIGFuZCB0YWJsZSBuYW1lcyBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIHNvIHRoZXkgY2FuIGJlIHJlZmVyZW5jZWRcbi8vLyBmcm9tIGBkZXBlbmRzT25gIGFuZCBmb3JlaWduIGtleXMsIHdob3NlIHBhdHRlcm5zIHJlcXVpcmUgdGhlIHNhbWUgc2hhcGUuXG5jb25zdCBOQU1FX1JFID0gL15bYS16MC05X10rJC87XG5cbi8qKlxuICogTG9hZCBhIGRhdGFzZXQgcm9vdCBpbnRvIGEgYFdvcmxkYC5cbiAqXG4gKiBAcGFyYW0gcm9vdERpciBBYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkYXRhc2V0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgbG9hZGVkIHdvcmxkIHBsdXMgbG9hZC10aW1lIHZpb2xhdGlvbnMuXG4gKiBAdGhyb3dzIEVycm9yIFdoZW4gYHJvb3REaXJgIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUm9vdChyb290RGlyOiBzdHJpbmcpOiBMb2FkT3V0Y29tZSB7XG4gICAgY29uc3QgYWJzb2x1dGVSb290ID0gcGF0aC5yZXNvbHZlKHJvb3REaXIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhhYnNvbHV0ZVJvb3QpIHx8ICFmcy5zdGF0U3luYyhhYnNvbHV0ZVJvb3QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhc2V0IHJvb3QgaXMgbm90IGEgZGlyZWN0b3J5OiAke2Fic29sdXRlUm9vdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgTG9hZGVkU2NoZW1hPigpO1xuICAgIGNvbnN0IHRhYmxlcyA9IG5ldyBNYXA8c3RyaW5nLCBUYWJsZVR5cGVCYXNlPigpO1xuXG4gICAgY29uc3Qgc2NoZW1hRGlycyA9IGZzLnJlYWRkaXJTeW5jKGFic29sdXRlUm9vdCwge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNjaGVtYURpciBvZiBzY2hlbWFEaXJzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBzY2hlbWFEaXIubmFtZTtcbiAgICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihhYnNvbHV0ZVJvb3QsIHNjaGVtYU5hbWUpO1xuXG4gICAgICAgIGlmICghTkFNRV9SRS50ZXN0KHNjaGVtYU5hbWUpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfTkFNRV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgIHBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYHNjaGVtYSBuYW1lIFwiJHtzY2hlbWFOYW1lfVwiIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2UgKG1hdGNoaW5nICR7TkFNRV9SRX0pYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzY0ZpbGVOYW1lID0gYCR7c2NoZW1hTmFtZX0uanNvbmA7XG4gICAgICAgIGNvbnN0IGpzb25GaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcuanNvbicpKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG5cbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uOiBTY2hlbWFEZXNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBsb2FkZWRUYWJsZXM6IFRhYmxlVHlwZUJhc2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBqc29uRmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgICAgICAgIGxldCBwYXJzZWQ6IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnRklMRV9QQVJTRV9FUlJPUicsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkIEpTT046ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWxlID09PSBkZXNjRmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3R1cmFsID0gdmFsaWRhdGVTdHJ1Y3R1cmUoJ3NjaGVtYScsIHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdHJ1Y3R1cmFsRXJyb3Igb2Ygc3RydWN0dXJhbC5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9WQUxJREFUSU9OJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzdHJ1Y3R1cmFsRXJyb3IuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cnVjdHVyYWxFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBub3JtYWxpemVTY2hlbWFEZXNjcmlwdGlvbihwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBmaWxlLnNsaWNlKDAsIC0nLmpzb24nLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBxdWFsaWZpZWROYW1lID0gYCR7c2NoZW1hTmFtZX0uJHt0YWJsZU5hbWV9YDtcblxuICAgICAgICAgICAgaWYgKCFOQU1FX1JFLnRlc3QodGFibGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnVEFCTEVfTkFNRV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBuYW1lIFwiJHt0YWJsZU5hbWV9XCIgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSAobWF0Y2hpbmcgJHtOQU1FX1JFfSlgLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdHJ1Y3R1cmFsID0gdmFsaWRhdGVTdHJ1Y3R1cmUoJ3RhYmxlJywgcGFyc2VkKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RydWN0dXJhbEVycm9yIG9mIHN0cnVjdHVyYWwuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfVkFMSURBVElPTicsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHN0cnVjdHVyYWxFcnJvci5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cnVjdHVyYWxFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRUYWJsZSA9IGNyZWF0ZVRhYmxlVHlwZSh7XG4gICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgIG5hbWU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxseVZhbGlkOiBzdHJ1Y3R1cmFsLnZhbGlkLFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246IG5vcm1hbGl6ZVRhYmxlRGVmaW5pdGlvbihwYXJzZWQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2FkZWRUYWJsZXMucHVzaChsb2FkZWRUYWJsZSk7XG4gICAgICAgICAgICB0YWJsZXMuc2V0KHF1YWxpZmllZE5hbWUsIGxvYWRlZFRhYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX0RFU0NfUFJFU0VOVCcsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihkaXJQYXRoLCBkZXNjRmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzY2hlbWEgXCIke3NjaGVtYU5hbWV9XCIgaXMgbWlzc2luZyBpdHMgZGVzY3JpcHRpb24gZmlsZSBcIiR7ZGVzY0ZpbGVOYW1lfVwiYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NoZW1hcy5zZXQoc2NoZW1hTmFtZSwge1xuICAgICAgICAgICAgbmFtZTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRhYmxlczogbG9hZGVkVGFibGVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3b3JsZDoge1xuICAgICAgICAgICAgcm9vdERpcjogYWJzb2x1dGVSb290LFxuICAgICAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgICAgIHRhYmxlcyxcbiAgICAgICAgfSxcbiAgICAgICAgdmlvbGF0aW9ucyxcbiAgICB9O1xufVxuIl19
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxSkgsNEJBd0lDO0FBM1JELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFVN0IsNkNBRXNCO0FBSXRCLHFEQUVnQztBQWVoQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQWdDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYztJQUNwQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxT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YWRlci4gV2Fsa3MgYSBkYXRhc2V0IHJvb3QsIHBhcnNlcyBlYWNoIEpTT04gZmlsZSwgcnVucyBMYXllciAxXG4gKiBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24sIGFuZCBub3JtYWxpemVzIGV2ZXJ5dGhpbmcgaW50byBhIGBXb3JsZGAgb2ZcbiAqIGNvbmNyZXRlIGBUYWJsZVR5cGVCYXNlYCBpbnN0YW5jZXMgdGhhdCB0aGUgc2VtYW50aWMgcnVsZXMgb3BlcmF0ZSBvbi5cbiAqXG4gKiBQYXJzZSBlcnJvcnMsIHN0cnVjdHVyYWwgZXJyb3JzLCBhbmQgYSBtaXNzaW5nIHNjaGVtYS1kZXNjcmlwdGlvbiBmaWxlIGFyZVxuICogcmVwb3J0ZWQgaGVyZTsgYWxsIGNyb3NzLWZpZWxkIC8gY3Jvc3MtZmlsZSBsb2dpYyBsaXZlcyBpbiB0aGUgdGFibGUtdHlwZVxuICogY2xhc3NlcyAoYC4vdGFibGUtdHlwZS50c2AsIGAuL3RhYmxlLXR5cGVzLypgKS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge1xuICAgIENvbHVtbixcbiAgICBGb3JlaWduS2V5LFxuICAgIFBhcnRpdGlvbixcbiAgICBTY2hlbWFEZXNjcmlwdGlvbixcbiAgICBUYWJsZURlZmluaXRpb24sXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUsXG59IGZyb20gJy4vc3RydWN0dXJhbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIGNyZWF0ZVRhYmxlVHlwZSxcbn0gZnJvbSAnLi90YWJsZS10eXBlcy9yZWdpc3RyeSc7XG5pbXBvcnQge1xuICAgIExvYWRlZFNjaGVtYSxcbiAgICBXb3JsZCxcbn0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKiBSZXN1bHQgb2YgbG9hZGluZyBhIHJvb3Q6IHRoZSBtb2RlbCBwbHVzIGFueSBsb2FkLXRpbWUgdmlvbGF0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZE91dGNvbWUge1xuICAgIC8qKiBUaGUgbG9hZGVkIG1vZGVsLiAqL1xuICAgIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAgIC8qKiBQYXJzZSwgc3RydWN0dXJhbCwgYW5kIG1pc3NpbmctZGVzY3JpcHRpb24gdmlvbGF0aW9ucy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cblxuZnVuY3Rpb24gYXNSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9O1xufVxuXG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnO1xufVxuXG5mdW5jdGlvbiBhc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgPyB2YWx1ZSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb2x1bW5zKHZhbHVlOiB1bmtub3duKTogQ29sdW1uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgICBudWxsYWJsZTogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLm51bGxhYmxlKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFydGl0aW9ucyh2YWx1ZTogdW5rbm93bik6IFBhcnRpdGlvbltdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IGFzU3RyaW5nKHJlY29yZC50eXBlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGVzY3JpcHRpb24pLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdNYXAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZCh2YWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBbXG4gICAgICAgIGtleSxcbiAgICAgICAgcmF3LFxuICAgIF0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcmF3O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKHZhbHVlOiB1bmtub3duKTogRm9yZWlnbktleVtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlOiBhc1N0cmluZyhyZWNvcmQuc291cmNlVGFibGUpLFxuICAgICAgICAgICAgc291cmNlQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQuc291cmNlQ29sdW1uKSxcbiAgICAgICAgICAgIGxvY2FsQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQubG9jYWxDb2x1bW4pLFxuICAgICAgICAgICAgYWxsb3dOdWxsczogYXNCb29sZWFuKHJlY29yZC5hbGxvd051bGxzKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGFibGVEZWZpbml0aW9uKHJhdzogdW5rbm93bik6IFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIHRhYmxlVHlwZTogYXNTdHJpbmcocmVjb3JkLnRhYmxlVHlwZSksXG4gICAgICAgIGlzUmF3RGF0YTogYXNCb29sZWFuKHJlY29yZC5pc1Jhd0RhdGEpLFxuICAgICAgICBmb3JtYXRWZXJzaW9uOiBhc09wdGlvbmFsTnVtYmVyKHJlY29yZC5mb3JtYXRWZXJzaW9uKSxcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplQ29sdW1ucyhyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIHByaW1hcnlLZXk6IGFzU3RyaW5nQXJyYXkocmVjb3JkLnByaW1hcnlLZXkpLFxuICAgICAgICBwYXJ0aXRpb25zOiBub3JtYWxpemVQYXJ0aXRpb25zKHJlY29yZC5wYXJ0aXRpb25zKSxcbiAgICAgICAgdGFibGVQcm9wZXJ0aWVzOiBub3JtYWxpemVTdHJpbmdNYXAocmVjb3JkLnRhYmxlUHJvcGVydGllcyksXG4gICAgICAgIGRlcGVuZHNPbjogYXNTdHJpbmdBcnJheShyZWNvcmQuZGVwZW5kc09uKSxcbiAgICAgICAgZm9yZWlnbktleXM6IG5vcm1hbGl6ZUZvcmVpZ25LZXlzKHJlY29yZC5mb3JlaWduS2V5cyksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2NoZW1hRGVzY3JpcHRpb24ocmF3OiB1bmtub3duKTogU2NoZW1hRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3BlY1ZlcnNpb246IGFzU3RyaW5nKHJlY29yZC5zcGVjVmVyc2lvbiksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGVzY3JpcHRpb24pLFxuICAgIH07XG59XG5cbi8vLyBTY2hlbWEgYW5kIHRhYmxlIG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2Ugc28gdGhleSBjYW4gYmUgcmVmZXJlbmNlZFxuLy8vIGZyb20gYGRlcGVuZHNPbmAgYW5kIGZvcmVpZ24ga2V5cywgd2hvc2UgcGF0dGVybnMgcmVxdWlyZSB0aGUgc2FtZSBzaGFwZS5cbmNvbnN0IE5BTUVfUkUgPSAvXlthLXowLTlfXSskLztcblxuLyoqXG4gKiBMb2FkIGEgZGF0YXNldCByb290IGludG8gYSBgV29ybGRgLlxuICpcbiAqIEBwYXJhbSByb290RGlyIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRhdGFzZXQgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBsb2FkZWQgd29ybGQgcGx1cyBsb2FkLXRpbWUgdmlvbGF0aW9ucy5cbiAqIEB0aHJvd3MgRXJyb3IgV2hlbiBgcm9vdERpcmAgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRSb290KHJvb3REaXI6IHN0cmluZyk6IExvYWRPdXRjb21lIHtcbiAgICBjb25zdCBhYnNvbHV0ZVJvb3QgPSBwYXRoLnJlc29sdmUocm9vdERpcik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGFic29sdXRlUm9vdCkgfHwgIWZzLnN0YXRTeW5jKGFic29sdXRlUm9vdCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGFzZXQgcm9vdCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7YWJzb2x1dGVSb290fWApO1xuICAgIH1cblxuICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgY29uc3Qgc2NoZW1hcyA9IG5ldyBNYXA8c3RyaW5nLCBMb2FkZWRTY2hlbWE+KCk7XG4gICAgY29uc3QgdGFibGVzID0gbmV3IE1hcDxzdHJpbmcsIFRhYmxlVHlwZUJhc2U+KCk7XG5cbiAgICBjb25zdCBzY2hlbWFEaXJzID0gZnMucmVhZGRpclN5bmMoYWJzb2x1dGVSb290LCB7XG4gICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgfSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAhZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcblxuICAgIGZvciAoY29uc3Qgc2NoZW1hRGlyIG9mIHNjaGVtYURpcnMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IHNjaGVtYURpci5uYW1lO1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGFic29sdXRlUm9vdCwgc2NoZW1hTmFtZSk7XG5cbiAgICAgICAgaWYgKCFOQU1FX1JFLnRlc3Qoc2NoZW1hTmFtZSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9OQU1FX1ZBTElEJyxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aDogZGlyUGF0aCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc2NoZW1hIG5hbWUgXCIke3NjaGVtYU5hbWV9XCIgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSAobWF0Y2hpbmcgJHtOQU1FX1JFfSlgLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXNjRmlsZU5hbWUgPSBgJHtzY2hlbWFOYW1lfS5qc29uYDtcbiAgICAgICAgY29uc3QganNvbkZpbGVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aClcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5qc29uJykpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcblxuICAgICAgICBsZXQgZGVzY3JpcHRpb246IFNjaGVtYURlc2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGxvYWRlZFRhYmxlczogVGFibGVUeXBlQmFzZVtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGpzb25GaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcblxuICAgICAgICAgICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdGSUxFX1BBUlNFX0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGludmFsaWQgSlNPTjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbGUgPT09IGRlc2NGaWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdHVyYWwgPSB2YWxpZGF0ZVN0cnVjdHVyZSgnc2NoZW1hJywgcGFyc2VkKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0cnVjdHVyYWxFcnJvciBvZiBzdHJ1Y3R1cmFsLmVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX1ZBTElEQVRJT04nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHN0cnVjdHVyYWxFcnJvci5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogc3RydWN0dXJhbEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5vcm1hbGl6ZVNjaGVtYURlc2NyaXB0aW9uKHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGZpbGUuc2xpY2UoMCwgLScuanNvbicubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpZmllZE5hbWUgPSBgJHtzY2hlbWFOYW1lfS4ke3RhYmxlTmFtZX1gO1xuXG4gICAgICAgICAgICBpZiAoIU5BTUVfUkUudGVzdCh0YWJsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdUQUJMRV9OQU1FX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIG5hbWUgXCIke3RhYmxlTmFtZX1cIiBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIChtYXRjaGluZyAke05BTUVfUkV9KWAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0cnVjdHVyYWwgPSB2YWxpZGF0ZVN0cnVjdHVyZSgndGFibGUnLCBwYXJzZWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdHJ1Y3R1cmFsRXJyb3Igb2Ygc3RydWN0dXJhbC5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9WQUxJREFUSU9OJyxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogc3RydWN0dXJhbEVycm9yLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogc3RydWN0dXJhbEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFRhYmxlID0gY3JlYXRlVGFibGVUeXBlKHtcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgbmFtZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RydWN0dXJhbGx5VmFsaWQ6IHN0cnVjdHVyYWwudmFsaWQsXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjogbm9ybWFsaXplVGFibGVEZWZpbml0aW9uKHBhcnNlZCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvYWRlZFRhYmxlcy5wdXNoKGxvYWRlZFRhYmxlKTtcbiAgICAgICAgICAgIHRhYmxlcy5zZXQocXVhbGlmaWVkTmFtZSwgbG9hZGVkVGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfREVTQ19QUkVTRU5UJyxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKGRpclBhdGgsIGRlc2NGaWxlTmFtZSksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYHNjaGVtYSBcIiR7c2NoZW1hTmFtZX1cIiBpcyBtaXNzaW5nIGl0cyBkZXNjcmlwdGlvbiBmaWxlIFwiJHtkZXNjRmlsZU5hbWV9XCJgLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzY2hlbWFzLnNldChzY2hlbWFOYW1lLCB7XG4gICAgICAgICAgICBuYW1lOiBzY2hlbWFOYW1lLFxuICAgICAgICAgICAgZGlyUGF0aCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGFibGVzOiBsb2FkZWRUYWJsZXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHdvcmxkOiB7XG4gICAgICAgICAgICByb290RGlyOiBhYnNvbHV0ZVJvb3QsXG4gICAgICAgICAgICBzY2hlbWFzLFxuICAgICAgICAgICAgdGFibGVzLFxuICAgICAgICB9LFxuICAgICAgICB2aW9sYXRpb25zLFxuICAgIH07XG59XG4iXX0=
@@ -66,12 +66,24 @@ export interface TableDefinition {
66
66
  readonly tableType: string;
67
67
  /** Whether this table is the top of the pipeline. */
68
68
  readonly isRawData: boolean;
69
+ /**
70
+ * Iceberg table format version (1, 2, or 3). Optional and engine-specific:
71
+ * only the Iceberg engine validates it. Other engines ignore it.
72
+ */
73
+ readonly formatVersion?: number;
69
74
  /** Data columns. */
70
75
  readonly columns: Column[];
71
76
  /** Primary-key column names. */
72
77
  readonly primaryKey: string[];
73
78
  /** Partition entries (engine-specific semantics). */
74
79
  readonly partitions: Partition[];
80
+ /**
81
+ * Engine table properties as a string→string map (e.g. Iceberg
82
+ * `write.target-file-size-bytes`, Hive `parquet.compression`). Optional.
83
+ * Only keys with a known, closed legal domain are validated per engine;
84
+ * unknown keys pass through unvalidated.
85
+ */
86
+ readonly tableProperties: Record<string, string>;
75
87
  /** Upstream tables in `schema.table` format. */
76
88
  readonly dependsOn: string[];
77
89
  /** Foreign keys. */
package/dist/src/model.js CHANGED
@@ -23,4 +23,4 @@ exports.TABLE_TYPES = [
23
23
  TableType.ICEBERG_PARQUET,
24
24
  TableType.POSTGRES_18,
25
25
  ];
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBBIGZvcmVpZ24ta2V5IHJlZmVyZW5jZSB0byBhIGNvbHVtbiBpbiBhbm90aGVyIHRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JlaWduS2V5IHtcbiAgICAvKiogUmVmZXJlbmNlZCB0YWJsZSBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgc291cmNlVGFibGU6IHN0cmluZztcblxuICAgIC8qKiBSZWZlcmVuY2VkIGNvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZUNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIExvY2FsIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSByZWZlcmVuY2UuICovXG4gICAgcmVhZG9ubHkgbG9jYWxDb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsb2NhbCBjb2x1bW4gbWF5IGJlIG51bGwuICovXG4gICAgcmVhZG9ubHkgYWxsb3dOdWxsczogYm9vbGVhbjtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbiAob3B0aW9uYWwgYXJyYXlzIGRlZmF1bHRlZCB0byBlbXB0eSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKiogRW5naW5lLiBNYXkgYmUgYW4gdW5rbm93biBzdHJpbmcgaWYgdGhlIGZpbGUgZmFpbGVkIHN0cnVjdHVyYWwgY2hlY2tzLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhpcyB0YWJsZSBpcyB0aGUgdG9wIG9mIHRoZSBwaXBlbGluZS4gKi9cbiAgICByZWFkb25seSBpc1Jhd0RhdGE6IGJvb2xlYW47XG5cbiAgICAvKiogRGF0YSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gICAgLyoqIFByaW1hcnkta2V5IGNvbHVtbiBuYW1lcy4gKi9cbiAgICByZWFkb25seSBwcmltYXJ5S2V5OiBzdHJpbmdbXTtcblxuICAgIC8qKiBQYXJ0aXRpb24gZW50cmllcyAoZW5naW5lLXNwZWNpZmljIHNlbWFudGljcykuICovXG4gICAgcmVhZG9ubHkgcGFydGl0aW9uczogUGFydGl0aW9uW107XG5cbiAgICAvKiogVXBzdHJlYW0gdGFibGVzIGluIGBzY2hlbWEudGFibGVgIGZvcm1hdC4gKi9cbiAgICByZWFkb25seSBkZXBlbmRzT246IHN0cmluZ1tdO1xuXG4gICAgLyoqIEZvcmVpZ24ga2V5cy4gKi9cbiAgICByZWFkb25seSBmb3JlaWduS2V5czogRm9yZWlnbktleVtdO1xufVxuXG4vKiogQSBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSdzIG5vcm1hbGl6ZWQgY29udGVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRGVzY3JpcHRpb24ge1xuICAgIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIGZpbGUuICovXG4gICAgcmVhZG9ubHkgc3BlY1ZlcnNpb246IHN0cmluZztcblxuICAgIC8qKiBIdW1hbiBkZXNjcmlwdGlvbi4gKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKiogU2V2ZXJpdHkgb2YgYSB2aW9sYXRpb24uICovXG5leHBvcnQgdHlwZSBWaW9sYXRpb25MZXZlbCA9ICdlcnJvcicgfCAnd2FybmluZyc7XG5cbi8qKiBBIHNpbmdsZSB2YWxpZGF0aW9uIGZpbmRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpb2xhdGlvbiB7XG4gICAgLyoqIFNldmVyaXR5LiBgZXJyb3JgIGZhaWxzIHZhbGlkYXRpb247IGB3YXJuaW5nYCBkb2VzIG5vdC4gKi9cbiAgICByZWFkb25seSBsZXZlbDogVmlvbGF0aW9uTGV2ZWw7XG5cbiAgICAvKiogU3RhYmxlIG1hY2hpbmUtcmVhZGFibGUgcnVsZSBjb2RlIChlLmcuIGBQS19DT0xVTU5TX0VYSVNUYCkuICovXG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyBzY2hlbWEsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyB0YWJsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSB0YWJsZT86IHN0cmluZztcblxuICAgIC8qKiBGaWVsZCBwYXRoIHdpdGhpbiB0aGUgZmlsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBmaWVsZD86IHN0cmluZztcblxuICAgIC8qKiBTb3VyY2UgZmlsZSBwYXRoLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gKi9cbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgYWdncmVnYXRlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIGEgcm9vdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLyoqIFRydWUgd2hlbiB0aGVyZSBhcmUgbm8gYGVycm9yYC1sZXZlbCB2aW9sYXRpb25zLiAqL1xuICAgIHJlYWRvbmx5IG9rOiBib29sZWFuO1xuXG4gICAgLyoqIEFsbCBmaW5kaW5ncywgZXJyb3JzIGFuZCB3YXJuaW5ncy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBBIGZvcmVpZ24ta2V5IHJlZmVyZW5jZSB0byBhIGNvbHVtbiBpbiBhbm90aGVyIHRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JlaWduS2V5IHtcbiAgICAvKiogUmVmZXJlbmNlZCB0YWJsZSBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgc291cmNlVGFibGU6IHN0cmluZztcblxuICAgIC8qKiBSZWZlcmVuY2VkIGNvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZUNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIExvY2FsIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSByZWZlcmVuY2UuICovXG4gICAgcmVhZG9ubHkgbG9jYWxDb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsb2NhbCBjb2x1bW4gbWF5IGJlIG51bGwuICovXG4gICAgcmVhZG9ubHkgYWxsb3dOdWxsczogYm9vbGVhbjtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbiAob3B0aW9uYWwgYXJyYXlzIGRlZmF1bHRlZCB0byBlbXB0eSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKiogRW5naW5lLiBNYXkgYmUgYW4gdW5rbm93biBzdHJpbmcgaWYgdGhlIGZpbGUgZmFpbGVkIHN0cnVjdHVyYWwgY2hlY2tzLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhpcyB0YWJsZSBpcyB0aGUgdG9wIG9mIHRoZSBwaXBlbGluZS4gKi9cbiAgICByZWFkb25seSBpc1Jhd0RhdGE6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJY2ViZXJnIHRhYmxlIGZvcm1hdCB2ZXJzaW9uICgxLCAyLCBvciAzKS4gT3B0aW9uYWwgYW5kIGVuZ2luZS1zcGVjaWZpYzpcbiAgICAgKiBvbmx5IHRoZSBJY2ViZXJnIGVuZ2luZSB2YWxpZGF0ZXMgaXQuIE90aGVyIGVuZ2luZXMgaWdub3JlIGl0LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcm1hdFZlcnNpb24/OiBudW1iZXI7XG5cbiAgICAvKiogRGF0YSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gICAgLyoqIFByaW1hcnkta2V5IGNvbHVtbiBuYW1lcy4gKi9cbiAgICByZWFkb25seSBwcmltYXJ5S2V5OiBzdHJpbmdbXTtcblxuICAgIC8qKiBQYXJ0aXRpb24gZW50cmllcyAoZW5naW5lLXNwZWNpZmljIHNlbWFudGljcykuICovXG4gICAgcmVhZG9ubHkgcGFydGl0aW9uczogUGFydGl0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBFbmdpbmUgdGFibGUgcHJvcGVydGllcyBhcyBhIHN0cmluZ+KGknN0cmluZyBtYXAgKGUuZy4gSWNlYmVyZ1xuICAgICAqIGB3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzYCwgSGl2ZSBgcGFycXVldC5jb21wcmVzc2lvbmApLiBPcHRpb25hbC5cbiAgICAgKiBPbmx5IGtleXMgd2l0aCBhIGtub3duLCBjbG9zZWQgbGVnYWwgZG9tYWluIGFyZSB2YWxpZGF0ZWQgcGVyIGVuZ2luZTtcbiAgICAgKiB1bmtub3duIGtleXMgcGFzcyB0aHJvdWdoIHVudmFsaWRhdGVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhYmxlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgIC8qKiBVcHN0cmVhbSB0YWJsZXMgaW4gYHNjaGVtYS50YWJsZWAgZm9ybWF0LiAqL1xuICAgIHJlYWRvbmx5IGRlcGVuZHNPbjogc3RyaW5nW107XG5cbiAgICAvKiogRm9yZWlnbiBrZXlzLiAqL1xuICAgIHJlYWRvbmx5IGZvcmVpZ25LZXlzOiBGb3JlaWduS2V5W107XG59XG5cbi8qKiBBIHNjaGVtYS1kZXNjcmlwdGlvbiBmaWxlJ3Mgbm9ybWFsaXplZCBjb250ZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTZXZlcml0eSBvZiBhIHZpb2xhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIFZpb2xhdGlvbkxldmVsID0gJ2Vycm9yJyB8ICd3YXJuaW5nJztcblxuLyoqIEEgc2luZ2xlIHZhbGlkYXRpb24gZmluZGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlvbGF0aW9uIHtcbiAgICAvKiogU2V2ZXJpdHkuIGBlcnJvcmAgZmFpbHMgdmFsaWRhdGlvbjsgYHdhcm5pbmdgIGRvZXMgbm90LiAqL1xuICAgIHJlYWRvbmx5IGxldmVsOiBWaW9sYXRpb25MZXZlbDtcblxuICAgIC8qKiBTdGFibGUgbWFjaGluZS1yZWFkYWJsZSBydWxlIGNvZGUgKGUuZy4gYFBLX0NPTFVNTlNfRVhJU1RgKS4gKi9cbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cbiAgICAvKiogT3duaW5nIHNjaGVtYSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XG5cbiAgICAvKiogT3duaW5nIHRhYmxlLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlPzogc3RyaW5nO1xuXG4gICAgLyoqIEZpZWxkIHBhdGggd2l0aGluIHRoZSBmaWxlLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IGZpZWxkPzogc3RyaW5nO1xuXG4gICAgLyoqIFNvdXJjZSBmaWxlIHBhdGgsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlLiAqL1xuICAgIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFRoZSBhZ2dyZWdhdGUgcmVzdWx0IG9mIHZhbGlkYXRpbmcgYSByb290LiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAvKiogVHJ1ZSB3aGVuIHRoZXJlIGFyZSBubyBgZXJyb3JgLWxldmVsIHZpb2xhdGlvbnMuICovXG4gICAgcmVhZG9ubHkgb2s6IGJvb2xlYW47XG5cbiAgICAvKiogQWxsIGZpbmRpbmdzLCBlcnJvcnMgYW5kIHdhcm5pbmdzLiAqL1xuICAgIHJlYWRvbmx5IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdO1xufVxuIl19
@@ -38,6 +38,9 @@
38
38
  "isRawData": {
39
39
  "type": "boolean"
40
40
  },
41
+ "formatVersion": {
42
+ "type": "integer"
43
+ },
41
44
  "columns": {
42
45
  "type": "array",
43
46
  "minItems": 1,
@@ -59,6 +62,12 @@
59
62
  "$ref": "#/definitions/column"
60
63
  }
61
64
  },
65
+ "tableProperties": {
66
+ "type": "object",
67
+ "additionalProperties": {
68
+ "type": "string"
69
+ }
70
+ },
62
71
  "dependsOn": {
63
72
  "type": "array",
64
73
  "items": {
@@ -90,6 +90,14 @@ export declare abstract class TableTypeBase {
90
90
  * @returns Every partition-related violation this table produces.
91
91
  */
92
92
  abstract partitionViolations(): Violation[];
93
+ /**
94
+ * Engine-specific intra-table rules beyond column-type and partition checks
95
+ * (e.g. Iceberg format-version / table properties, Postgres indexes). The
96
+ * base engine has none; subclasses override to add them.
97
+ *
98
+ * @returns Engine-specific intra-table violations. Empty by default.
99
+ */
100
+ engineSpecificViolations(): Violation[];
93
101
  private primaryKeyViolations;
94
102
  private duplicateColumnViolations;
95
103
  private columnTypeViolations;
@@ -95,6 +95,16 @@ class TableTypeBase {
95
95
  ...duplicates,
96
96
  ];
97
97
  }
98
+ /**
99
+ * Engine-specific intra-table rules beyond column-type and partition checks
100
+ * (e.g. Iceberg format-version / table properties, Postgres indexes). The
101
+ * base engine has none; subclasses override to add them.
102
+ *
103
+ * @returns Engine-specific intra-table violations. Empty by default.
104
+ */
105
+ engineSpecificViolations() {
106
+ return [];
107
+ }
98
108
  /// ////////////////////////////////////////////////////////////////////////
99
109
  // Agnostic intra-table rules.
100
110
  /// PK_COLUMNS_EXIST — every primary-key column exists in `columns`.
@@ -206,6 +216,7 @@ class TableTypeBase {
206
216
  ...this.partitionViolations(),
207
217
  ...this.rawConsistencyViolations(),
208
218
  ...this.nullabilityViolations(),
219
+ ...this.engineSpecificViolations(),
209
220
  ];
210
221
  }
211
222
  /// ////////////////////////////////////////////////////////////////////////
@@ -305,4 +316,4 @@ class TableTypeBase {
305
316
  }
306
317
  }
307
318
  exports.TableTypeBase = TableTypeBase;
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFtQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQXNCLGFBQWE7SUFDL0IsMEJBQTBCO0lBQ1YsTUFBTSxDQUFTO0lBRS9CLGtCQUFrQjtJQUNGLElBQUksQ0FBUztJQUU3QixpQ0FBaUM7SUFDakIsYUFBYSxDQUFTO0lBRXRDLHdDQUF3QztJQUN4QixRQUFRLENBQVM7SUFFakMsNkRBQTZEO0lBQzdDLGlCQUFpQixDQUFVO0lBRTNDLDZCQUE2QjtJQUNiLFVBQVUsQ0FBa0I7SUFFNUM7Ozs7O09BS0c7SUFDSCxZQUFZLE1BQXVCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHNEQUFzRDtJQUV0RDs7Ozs7T0FLRztJQUNPLFNBQVMsQ0FBQyxPQUFxRDtRQUNyRSxNQUFNLFFBQVEsR0FBbUI7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDdEIsQ0FBQztRQUNGLE9BQU87WUFDSCxHQUFHLE9BQU87WUFDVixHQUFHLFFBQVE7U0FDZCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sU0FBUyxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNPLGNBQWMsQ0FBQyxLQUFlO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQixVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPO1lBQ0gsR0FBRyxVQUFVO1NBQ2hCLENBQUM7SUFDTixDQUFDO0lBcUJELDRFQUE0RTtJQUM1RSw4QkFBOEI7SUFFOUIsb0VBQW9FO0lBQzVELG9CQUFvQjtRQUN4QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLEtBQUssRUFBRSxZQUFZO29CQUNuQixPQUFPLEVBQUUsdUJBQXVCLFFBQVEsNkJBQTZCO2lCQUN4RSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELGtFQUFrRTtJQUMxRCx5QkFBeUI7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNoRSxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLDBCQUEwQixTQUFTLEdBQUc7U0FDbEQsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsMEVBQTBFO0lBQ2xFLG9CQUFvQjtRQUN4QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLEtBQUssRUFBRSxXQUFXLEtBQUssUUFBUTtvQkFDL0IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksb0JBQW9CLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxRQUFROzBCQUN2RSxlQUFlLE1BQU0sQ0FBQyxJQUFJLEdBQUc7aUJBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELG1EQUFtRDtJQUMzQyx3QkFBd0I7UUFDNUIsTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEVBQ0YsU0FBUyxFQUNULFNBQVMsR0FDWixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEIsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEtBQUssRUFBRSxPQUFPO2dCQUNkLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixPQUFPLEVBQUUsd0RBQXdEO2FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEtBQUssRUFBRSxPQUFPO2dCQUNkLElBQUksRUFBRSw0QkFBNEI7Z0JBQ2xDLEtBQUssRUFBRSxXQUFXO2dCQUNsQixPQUFPLEVBQUUsc0VBQXNFO2FBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsd0VBQXdFO0lBQ2hFLHFCQUFxQjtRQUN6QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBRW5DLHlFQUF5RTtRQUN6RSx1QkFBdUI7UUFDdkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztZQUN4RixJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsd0JBQXdCO29CQUM5QixLQUFLLEVBQUUsWUFBWTtvQkFDbkIsT0FBTyxFQUFFLHVCQUF1QixRQUFRLGdEQUFnRDtpQkFDM0YsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUYsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLDJCQUEyQjtvQkFDakMsS0FBSyxFQUFFLGVBQWUsS0FBSyxjQUFjO29CQUN6QyxPQUFPLEVBQUUsOENBQThDLEVBQUUsQ0FBQyxXQUFXLDRCQUE0QjtpQkFDcEcsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxvQkFBb0I7UUFDdkIsT0FBTztZQUNILEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ25DLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2xDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1NBQ2xDLENBQUM7SUFDTixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUVwQix5RUFBeUU7SUFDakUsbUJBQW1CLENBQUMsS0FBWTtRQUNwQyxNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUscUJBQXFCO29CQUMzQixLQUFLLEVBQUUsYUFBYSxLQUFLLEdBQUc7b0JBQzVCLE9BQU8sRUFBRSxjQUFjLFVBQVUscUNBQXFDO2lCQUN6RSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw2Q0FBNkM7SUFDckMsb0JBQW9CLENBQUMsS0FBWSxFQUFFLEVBQWMsRUFBRSxLQUFhO1FBQ3BFLE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsZUFBZSxLQUFLLEdBQUcsQ0FBQztRQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEtBQUssRUFBRSxPQUFPO2dCQUNkLElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLEtBQUssRUFBRSxHQUFHLEtBQUssY0FBYztnQkFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyw2QkFBNkI7YUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSw4RUFBOEU7UUFDOUUsZ0NBQWdDO1FBQ2hDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM5RCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsS0FBSyxFQUFFLEdBQUcsS0FBSyxjQUFjO2dCQUM3QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxXQUFXLHFDQUFxQzthQUN2RixDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUMzQixLQUFLLEVBQUUsT0FBTztnQkFDZCxJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxLQUFLLEVBQUUsR0FBRyxLQUFLLGNBQWM7Z0JBQzdCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDLFdBQVcscUNBQXFDO2FBQzVGLENBQUMsQ0FBQyxDQUFDO1lBQ0osT0FBTyxVQUFVLENBQUM7UUFDdEIsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSx1RUFBdUU7UUFDdkUsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixPQUFPLFVBQVUsQ0FBQztRQUN0QixDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUMzQixLQUFLLEVBQUUsT0FBTztnQkFDZCxJQUFJLEVBQUUseUJBQXlCO2dCQUMvQixLQUFLLEVBQUUsR0FBRyxLQUFLLGVBQWU7Z0JBQzlCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxDQUFDLFlBQVksd0JBQXdCLEVBQUUsQ0FBQyxXQUFXLEdBQUc7YUFDbEcsQ0FBQyxDQUFDLENBQUM7WUFDSixPQUFPLFVBQVUsQ0FBQztRQUN0QixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEtBQUssRUFBRSxTQUFTO2dCQUNoQixJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixLQUFLLEVBQUUsR0FBRyxLQUFLLGVBQWU7Z0JBQzlCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxDQUFDLFlBQVksbUNBQW1DO3NCQUNuRixPQUFPLEVBQUUsQ0FBQyxXQUFXLEdBQUc7YUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQixDQUFDLEtBQVk7UUFDbkMsTUFBTSxVQUFVLEdBQWdCO1lBQzVCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztTQUNyQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztDQUNKO0FBaFZELHNDQWdWQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBsb2FkZWQgdGFibGUuIE9uZSBzdWJjbGFzcyBwZXIgZW5naW5lLlxuICpcbiAqIEhvbGRzIHRoZSBub3JtYWxpemVkIHRhYmxlIGlkZW50aXR5IGFuZCBkZWZpbml0aW9uLCBwbHVzIHRoZVxuICogZW5naW5lLWFnbm9zdGljIExheWVyIDIgcnVsZXMgYXMgY29uY3JldGUgbWV0aG9kcy4gRW5naW5lLXNwZWNpZmljIHJ1bGVzXG4gKiAoY29sdW1uLXR5cGUgdmFsaWRpdHksIHBhcnRpdGlvbiBzZW1hbnRpY3MpIGFyZSBhYnN0cmFjdCDigJQgZWFjaCBzdWJjbGFzc1xuICogaW1wbGVtZW50cyB0aGVtLCB3aGljaCBpcyB0aGUgbGV2ZXIgdGhhdCBsZXRzIG5ldyBlbmdpbmVzIHBsdWcgaW4gd2l0aG91dFxuICogZWRpdGluZyBzY2F0dGVyZWQgc3dpdGNoZXMuIFRoZSBjcm9zcy1maWxlIHJ1bGVzIGFyZSBjb25jcmV0ZSBoZXJlIHRvbztcbiAqIHRoZXkgdGFrZSB0aGUgd29ybGQgYnkgYW4gaW50ZXJmYWNlIHNvIHRoZSBjeWNsZSBiZXR3ZWVuIHRoaXMgbW9kdWxlIGFuZFxuICogYC4vd29ybGRgIGlzIGtlcHQgYXQgdHlwZS1sZXZlbCBvbmx5LlxuICovXG5cbmltcG9ydCB7XG4gICAgRm9yZWlnbktleSxcbiAgICBUYWJsZURlZmluaXRpb24sXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB0eXBlIHtcbiAgICBXb3JsZCxcbn0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKiBGaWVsZHMgcmVxdWlyZWQgdG8gY29uc3RydWN0IGFueSBjb25jcmV0ZSB0YWJsZSBzdWJjbGFzcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVUeXBlRmllbGRzIHtcbiAgICAvKiogT3duaW5nIHNjaGVtYSBuYW1lICh0aGUgZm9sZGVyIG5hbWUpLiAqL1xuICAgIHJlYWRvbmx5IHNjaGVtYTogc3RyaW5nO1xuXG4gICAgLyoqIFRhYmxlIG5hbWUgKHRoZSBmaWxlIG5hbWUgd2l0aG91dCBgLmpzb25gKS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogYHNjaGVtYS50YWJsZWAgaWRlbnRpZmllci4gKi9cbiAgICByZWFkb25seSBxdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUuICovXG4gICAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBmaWxlIHBhc3NlZCBMYXllciAxIHN0cnVjdHVyYWwgdmFsaWRhdGlvbi4gKi9cbiAgICByZWFkb25seSBzdHJ1Y3R1cmFsbHlWYWxpZDogYm9vbGVhbjtcblxuICAgIC8qKiBOb3JtYWxpemVkIGRlZmluaXRpb24uICovXG4gICAgcmVhZG9ubHkgZGVmaW5pdGlvbjogVGFibGVEZWZpbml0aW9uO1xufVxuXG4vKiogUHJlLWZpbGxlZCBsb2NhdGlvbiBmaWVsZHMgYXR0YWNoZWQgdG8gZXZlcnkgdmlvbGF0aW9uIGEgdGFibGUgZW1pdHMuICovXG50eXBlIExvY2F0aW9uRmllbGRzID0gUGljazxWaW9sYXRpb24sICdzY2hlbWEnIHwgJ3RhYmxlJyB8ICdwYXRoJz47XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIGVuZ2luZS1zcGVjaWZpYyB0YWJsZSB0eXBlcy5cbiAqXG4gKiBTdWJjbGFzc2VzIGltcGxlbWVudCBgaXNWYWxpZENvbHVtblR5cGVgICh0aGUgZW5naW5lJ3MgdHlwZSByZWdpc3RyeSkgYW5kXG4gKiBgcGFydGl0aW9uVmlvbGF0aW9uc2AgKHRoZSBlbmdpbmUncyBwYXJ0aXRpb24gc2VtYW50aWNzKS4gRXZlcnl0aGluZyBlbHNlXG4gKiDigJQgcHJpbWFyeS1rZXkgY2hlY2tzLCBkdXBlcywgcmF3IGNvbnNpc3RlbmN5LCBkZXBlbmRzLW9uIHJlc29sdXRpb24sXG4gKiBmb3JlaWduLWtleSBjaGVja3Mg4oCUIGlzIGlkZW50aWNhbCBhY3Jvc3MgZW5naW5lcyBhbmQgbGl2ZXMgaGVyZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRhYmxlVHlwZUJhc2Uge1xuICAgIC8qKiBPd25pbmcgc2NoZW1hIG5hbWUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVtYTogc3RyaW5nO1xuXG4gICAgLyoqIFRhYmxlIG5hbWUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBgc2NoZW1hLnRhYmxlYCBpZGVudGlmaWVyLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBxdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZmlsZSBwYXNzZWQgTGF5ZXIgMSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24uICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN0cnVjdHVyYWxseVZhbGlkOiBib29sZWFuO1xuXG4gICAgLyoqIE5vcm1hbGl6ZWQgZGVmaW5pdGlvbi4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVmaW5pdGlvbjogVGFibGVEZWZpbml0aW9uO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgdGFibGUgaW5zdGFuY2UgZnJvbSB0aGUgbm9ybWFsaXplZCBmaWVsZHMgcHJvZHVjZWQgYnkgdGhlXG4gICAgICogbG9hZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkcyBUaGUgdGFibGUgaWRlbnRpdHkgcGx1cyBpdHMgcGFyc2VkLCBub3JtYWxpemVkIGRlZmluaXRpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZmllbGRzOiBUYWJsZVR5cGVGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBmaWVsZHMuc2NoZW1hO1xuICAgICAgICB0aGlzLm5hbWUgPSBmaWVsZHMubmFtZTtcbiAgICAgICAgdGhpcy5xdWFsaWZpZWROYW1lID0gZmllbGRzLnF1YWxpZmllZE5hbWU7XG4gICAgICAgIHRoaXMuZmlsZVBhdGggPSBmaWVsZHMuZmlsZVBhdGg7XG4gICAgICAgIHRoaXMuc3RydWN0dXJhbGx5VmFsaWQgPSBmaWVsZHMuc3RydWN0dXJhbGx5VmFsaWQ7XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGZpZWxkcy5kZWZpbml0aW9uO1xuICAgIH1cblxuICAgIC8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXJzIHNoYXJlZCBieSBpbnRyYS10YWJsZSBhbmQgY3Jvc3MtZmlsZSBydWxlcy5cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgdmlvbGF0aW9uIHByZS1maWxsZWQgd2l0aCB0aGlzIHRhYmxlJ3MgbG9jYXRpb24gZmllbGRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcnRpYWwgVGhlIGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgcnVsZSBmaXJpbmcgKGNvZGUsIGxldmVsLCBtZXNzYWdlLCBmaWVsZCkuXG4gICAgICogQHJldHVybnMgQSBmdWxsIGBWaW9sYXRpb25gIHdpdGggYHNjaGVtYWAsIGB0YWJsZWAsIGFuZCBgcGF0aGAgc2V0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB2aW9sYXRpb24ocGFydGlhbDogT21pdDxWaW9sYXRpb24sICdzY2hlbWEnIHwgJ3RhYmxlJyB8ICdwYXRoJz4pOiBWaW9sYXRpb24ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbjogTG9jYXRpb25GaWVsZHMgPSB7XG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMuZmlsZVBhdGgsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICAgICAgLi4ubG9jYXRpb24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHRhYmxlIGRlY2xhcmVzIGEgZGF0YSBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIENvbHVtbiBuYW1lIHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIGBuYW1lYCBtYXRjaGVzIGFueSBjb2x1bW4gaW4gYGRlZmluaXRpb24uY29sdW1uc2AuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhc0NvbHVtbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgbmFtZXMgdGhhdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSBsaXN0LCBwcmVzZXJ2aW5nIHRoZSBvcmRlclxuICAgICAqIG9mIGZpcnN0IGR1cGxpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWVzIE5hbWVzIHRvIHNjYW4uXG4gICAgICogQHJldHVybnMgRHVwbGljYXRlZCBuYW1lcywgZWFjaCBsaXN0ZWQgb25jZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmluZER1cGxpY2F0ZXMobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGVzLmFkZChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5kdXBsaWNhdGVzLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBFbmdpbmUtc3BlY2lmaWMgY29udHJhY3QuXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGB0eXBlYCBpcyBhIHZhbGlkIGNvbHVtbi10eXBlIHN0cmluZyBmb3IgdGhpcyBlbmdpbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBDb2x1bW4gdHlwZSBzdHJpbmcgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBlbmdpbmUgYWNjZXB0cyB0aGUgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEVuZ2luZS1zcGVjaWZpYyBwYXJ0aXRpb24gcnVsZXM6IGR1cGxpY2F0ZSBkZXRlY3Rpb24gcGx1cyB0aGUgZW5naW5lJ3NcbiAgICAgKiBrZXkvY29sdW1uIHJlc29sdXRpb24gYW5kIHR5cGUgLyB0cmFuc2Zvcm0gLyBzdHJhdGVneSBsZWdhbGl0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHBhcnRpdGlvbi1yZWxhdGVkIHZpb2xhdGlvbiB0aGlzIHRhYmxlIHByb2R1Y2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBwYXJ0aXRpb25WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdO1xuXG4gICAgLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEFnbm9zdGljIGludHJhLXRhYmxlIHJ1bGVzLlxuXG4gICAgLy8vIFBLX0NPTFVNTlNfRVhJU1Qg4oCUIGV2ZXJ5IHByaW1hcnkta2V5IGNvbHVtbiBleGlzdHMgaW4gYGNvbHVtbnNgLlxuICAgIHByaXZhdGUgcHJpbWFyeUtleVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBrQ29sdW1uIG9mIHRoaXMuZGVmaW5pdGlvbi5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKHBrQ29sdW1uKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUEtfQ09MVU1OU19FWElTVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbWFyeUtleScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwcmltYXJ5LWtleSBjb2x1bW4gXCIke3BrQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gTk9fRFVQTElDQVRFX0NPTFVNTlMg4oCUIGNvbHVtbiBuYW1lcyBhcmUgdW5pcXVlIHdpdGhpbiBhIHRhYmxlLlxuICAgIHByaXZhdGUgZHVwbGljYXRlQ29sdW1uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZER1cGxpY2F0ZXMobmFtZXMpLm1hcCgoZHVwbGljYXRlKSA9PiB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICBmaWVsZDogJ2NvbHVtbnMnLFxuICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBjb2x1bW4gbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vLyBDT0xVTU5fVFlQRV9WQUxJRCDigJQgZXZlcnkgY29sdW1uIHR5cGUgaXMgdmFsaWQgZm9yIHRoZSB0YWJsZSdzIGVuZ2luZS5cbiAgICBwcml2YXRlIGNvbHVtblR5cGVWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRDb2x1bW5UeXBlKGNvbHVtbi50eXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnQ09MVU1OX1RZUEVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYGNvbHVtbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke2NvbHVtbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5kZWZpbml0aW9uLnRhYmxlVHlwZX0gdHlwZSBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBmb3IgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFJBV19OT19ERVBFTkRTX09OIC8gTk9OUkFXX1JFUVVJUkVTX0RFUEVORFNfT04uXG4gICAgcHJpdmF0ZSByYXdDb25zaXN0ZW5jeVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc1Jhd0RhdGEsXG4gICAgICAgICAgICBkZXBlbmRzT24sXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG4gICAgICAgIGlmIChpc1Jhd0RhdGEgJiYgZGVwZW5kc09uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1JBV19OT19ERVBFTkRTX09OJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2RlcGVuZHNPbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ3JhdyB0YWJsZXMgKGlzUmF3RGF0YT10cnVlKSBtdXN0IG5vdCBkZWNsYXJlIGRlcGVuZHNPbicsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1Jhd0RhdGEgJiYgZGVwZW5kc09uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9OUkFXX1JFUVVJUkVTX0RFUEVORFNfT04nLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZGVwZW5kc09uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbm9uLXJhdyB0YWJsZXMgKGlzUmF3RGF0YT1mYWxzZSkgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBkZXBlbmRzT24nLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBQS19DT0xVTU5fTk9UX05VTExBQkxFIC8gRktfTlVMTEFCSUxJVFlfQ09OU0lTVEVOVCDigJQgcGVyLWNvbHVtblxuICAgIC8vLyBudWxsYWJpbGl0eSBjb250cmFkaWN0aW9ucyBhZ2FpbnN0IHRoZSBwcmltYXJ5IGtleSBhbmQgZm9yZWlnbiBrZXlzLlxuICAgIHByaXZhdGUgbnVsbGFiaWxpdHlWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcblxuICAgICAgICAvLy8gQSBwcmltYXJ5LWtleSBjb2x1bW4gaXMgaW1wbGljaXRseSBOT1QgTlVMTCwgc28gZGVjbGFyaW5nIGl0IG51bGxhYmxlXG4gICAgICAgIC8vLyBpcyBhIGNvbnRyYWRpY3Rpb24uXG4gICAgICAgIGZvciAoY29uc3QgcGtDb2x1bW4gb2YgdGhpcy5kZWZpbml0aW9uLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHBrQ29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4ubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BLX0NPTFVNTl9OT1RfTlVMTEFCTEUnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW1hcnlLZXknLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgcHJpbWFyeS1rZXkgY29sdW1uIFwiJHtwa0NvbHVtbn1cIiBjYW5ub3QgYmUgbnVsbGFibGUgKGRlY2xhcmVkIG51bGxhYmxlOiB0cnVlKWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8vIEEgTk9UIE5VTEwgbG9jYWwgY29sdW1uIGNhbiBuZXZlciBiZSBudWxsLCBzbyBhIGZvcmVpZ24ga2V5IHRoYXRcbiAgICAgICAgLy8vIHBlcm1pdHMgbnVsbHMgb24gaXQgaXMgaW5jb25zaXN0ZW50LlxuICAgICAgICB0aGlzLmRlZmluaXRpb24uZm9yZWlnbktleXMuZm9yRWFjaCgoZmssIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBmay5sb2NhbENvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLm51bGxhYmxlID09PSBmYWxzZSAmJiBmay5hbGxvd051bGxzKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0ZLX05VTExBQklMSVRZX0NPTlNJU1RFTlQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYGZvcmVpZ25LZXlzWyR7aW5kZXh9XS5hbGxvd051bGxzYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IGFsbG93cyBudWxscyBidXQgbG9jYWwgY29sdW1uIFwiJHtmay5sb2NhbENvbHVtbn1cIiBpcyBkZWNsYXJlZCBub24tbnVsbGFibGVgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGludHJhLXRhYmxlIHZpb2xhdGlvbnMgZm9yIHRoaXMgdGFibGUgKGVuZ2luZS1hZ25vc3RpYyBydWxlcyBwbHVzXG4gICAgICogdGhlIGVuZ2luZS1zcGVjaWZpYyBwYXJ0aXRpb24gcnVsZXMpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaW50cmEtdGFibGUgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGludHJhVGFibGVWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLnRoaXMucHJpbWFyeUtleVZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuZHVwbGljYXRlQ29sdW1uVmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5jb2x1bW5UeXBlVmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5wYXJ0aXRpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnJhd0NvbnNpc3RlbmN5VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5udWxsYWJpbGl0eVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ3Jvc3MtZmlsZSBydWxlcy5cblxuICAgIC8vLyBERVBFTkRTX09OX1JFU09MVkVTIOKAlCBldmVyeSBkZXBlbmRzT24gZW50cnkgcmVzb2x2ZXMgdG8gYSByZWFsIHRhYmxlLlxuICAgIHByaXZhdGUgZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZDogV29ybGQpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uZm9yRWFjaCgoZGVwZW5kZW5jeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghd29ybGQudGFibGVzLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnREVQRU5EU19PTl9SRVNPTFZFUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgZGVwZW5kc09uWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkZXBlbmRzT24gXCIke2RlcGVuZGVuY3l9XCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIGtub3duIHRhYmxlYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gRm9yZWlnbi1rZXkgY2hlY2tzIGZvciBhIHNpbmdsZSBGSyBlbnRyeS5cbiAgICBwcml2YXRlIGZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkOiBXb3JsZCwgZms6IEZvcmVpZ25LZXksIGluZGV4OiBudW1iZXIpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGZpZWxkID0gYGZvcmVpZ25LZXlzWyR7aW5kZXh9XWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihmay5sb2NhbENvbHVtbikpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX0xPQ0FMX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0ubG9jYWxDb2x1bW5gLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBsb2NhbCBjb2x1bW4gXCIke2ZrLmxvY2FsQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vIEEgc2VsZi1yZWZlcmVudGlhbCBmb3JlaWduIGtleSAoZS5nLiBhIGBwYXJlbnRfaWRgIHBvaW50aW5nIGF0IHRoZSBzYW1lXG4gICAgICAgIC8vLyB0YWJsZSdzIGtleSkgZG9lcyBub3QgY3JlYXRlIGEgcGlwZWxpbmUgZGVwZW5kZW5jeSwgc28gaXQgaXMgZXhlbXB0IGZyb21cbiAgICAgICAgLy8vIEZLX0lNUExJRVNfREVQRU5ERU5DWSDigJQgcmVxdWlyaW5nIGEgc2VsZi1gZGVwZW5kc09uYCB3b3VsZCBvdGhlcndpc2UgZm9yY2VcbiAgICAgICAgLy8vIGEgc3B1cmlvdXMgZGVwZW5kZW5jeSBjeWNsZS5cbiAgICAgICAgY29uc3QgaXNTZWxmUmVmZXJlbmNlID0gZmsuc291cmNlVGFibGUgPT09IHRoaXMucXVhbGlmaWVkTmFtZTtcbiAgICAgICAgaWYgKCFpc1NlbGZSZWZlcmVuY2UgJiYgIXRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uaW5jbHVkZXMoZmsuc291cmNlVGFibGUpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19JTVBMSUVTX0RFUEVOREVOQ1knLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlVGFibGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBmb3JlaWduIGtleSB0YXJnZXRzIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBidXQgaXQgaXMgbm90IGxpc3RlZCBpbiBkZXBlbmRzT25gLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gd29ybGQudGFibGVzLmdldChmay5zb3VyY2VUYWJsZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRktfU09VUkNFX1RBQkxFX1JFU09MVkVTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZVRhYmxlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgc291cmNlIHRhYmxlIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEga25vd24gdGFibGVgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8gVGhlIHRhcmdldCdzIG93biBzdHJ1Y3R1cmFsIGVycm9ycyAocmVwb3J0ZWQgYnkgTGF5ZXIgMSkgYWxyZWFkeSBleHBsYWluXG4gICAgICAgIC8vLyB3aHkgaXRzIGNvbHVtbnMgY2FuJ3QgYmUgdHJ1c3RlZDsgc2tpcCBjb2x1bW4tbGV2ZWwgY2hlY2tzIHRvIGF2b2lkXG4gICAgICAgIC8vLyBwaWxpbmcgbWlzbGVhZGluZyBmaW5kaW5ncyBvbiB0b3AuXG4gICAgICAgIGlmICghdGFyZ2V0LnN0cnVjdHVyYWxseVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldEhhc0NvbHVtbiA9IHRhcmdldC5kZWZpbml0aW9uLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gZmsuc291cmNlQ29sdW1uKTtcbiAgICAgICAgaWYgKCF0YXJnZXRIYXNDb2x1bW4pIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX1NPVVJDRV9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5kZWZpbml0aW9uLnByaW1hcnlLZXkuaW5jbHVkZXMoZmsuc291cmNlQ29sdW1uKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19TT1VSQ0VfSVNfS0VZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkgYFxuICAgICAgICAgICAgICAgICAgICArIGBvZiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGNyb3NzLWZpbGUgdmlvbGF0aW9ucyBmb3IgdGhpcyB0YWJsZSAoYGRlcGVuZHNPbmAgcmVzb2x1dGlvbiBwbHVzXG4gICAgICogdGhlIGZ1bGwgZm9yZWlnbi1rZXkgc3VpdGUpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdvcmxkIFRoZSBsb2FkZWQgZGF0YXNldCByb290LlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNyb3NzLWZpbGUgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGNyb3NzRmlsZVZpb2xhdGlvbnMod29ybGQ6IFdvcmxkKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZCksXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5mb3JlaWduS2V5cy5mb3JFYWNoKChmaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLmZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkLCBmaywgaW5kZXgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWJsZS10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFtQ0g7Ozs7Ozs7R0FPRztBQUNILE1BQXNCLGFBQWE7SUFDL0IsMEJBQTBCO0lBQ1YsTUFBTSxDQUFTO0lBRS9CLGtCQUFrQjtJQUNGLElBQUksQ0FBUztJQUU3QixpQ0FBaUM7SUFDakIsYUFBYSxDQUFTO0lBRXRDLHdDQUF3QztJQUN4QixRQUFRLENBQVM7SUFFakMsNkRBQTZEO0lBQzdDLGlCQUFpQixDQUFVO0lBRTNDLDZCQUE2QjtJQUNiLFVBQVUsQ0FBa0I7SUFFNUM7Ozs7O09BS0c7SUFDSCxZQUFZLE1BQXVCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLHNEQUFzRDtJQUV0RDs7Ozs7T0FLRztJQUNPLFNBQVMsQ0FBQyxPQUFxRDtRQUNyRSxNQUFNLFFBQVEsR0FBbUI7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDdEIsQ0FBQztRQUNGLE9BQU87WUFDSCxHQUFHLE9BQU87WUFDVixHQUFHLFFBQVE7U0FDZCxDQUFD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O2FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUIsQ0FBQyxLQUFZO1FBQ25DLE1BQU0sVUFBVSxHQUFnQjtZQUM1QixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7U0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSjtBQTVWRCxzQ0E0VkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgbG9hZGVkIHRhYmxlLiBPbmUgc3ViY2xhc3MgcGVyIGVuZ2luZS5cbiAqXG4gKiBIb2xkcyB0aGUgbm9ybWFsaXplZCB0YWJsZSBpZGVudGl0eSBhbmQgZGVmaW5pdGlvbiwgcGx1cyB0aGVcbiAqIGVuZ2luZS1hZ25vc3RpYyBMYXllciAyIHJ1bGVzIGFzIGNvbmNyZXRlIG1ldGhvZHMuIEVuZ2luZS1zcGVjaWZpYyBydWxlc1xuICogKGNvbHVtbi10eXBlIHZhbGlkaXR5LCBwYXJ0aXRpb24gc2VtYW50aWNzKSBhcmUgYWJzdHJhY3Qg4oCUIGVhY2ggc3ViY2xhc3NcbiAqIGltcGxlbWVudHMgdGhlbSwgd2hpY2ggaXMgdGhlIGxldmVyIHRoYXQgbGV0cyBuZXcgZW5naW5lcyBwbHVnIGluIHdpdGhvdXRcbiAqIGVkaXRpbmcgc2NhdHRlcmVkIHN3aXRjaGVzLiBUaGUgY3Jvc3MtZmlsZSBydWxlcyBhcmUgY29uY3JldGUgaGVyZSB0b287XG4gKiB0aGV5IHRha2UgdGhlIHdvcmxkIGJ5IGFuIGludGVyZmFjZSBzbyB0aGUgY3ljbGUgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmRcbiAqIGAuL3dvcmxkYCBpcyBrZXB0IGF0IHR5cGUtbGV2ZWwgb25seS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIEZvcmVpZ25LZXksXG4gICAgVGFibGVEZWZpbml0aW9uLFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ybGQsXG59IGZyb20gJy4vd29ybGQnO1xuXG4vKiogRmllbGRzIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCBhbnkgY29uY3JldGUgdGFibGUgc3ViY2xhc3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlVHlwZUZpZWxkcyB7XG4gICAgLyoqIE93bmluZyBzY2hlbWEgbmFtZSAodGhlIGZvbGRlciBuYW1lKS4gKi9cbiAgICByZWFkb25seSBzY2hlbWE6IHN0cmluZztcblxuICAgIC8qKiBUYWJsZSBuYW1lICh0aGUgZmlsZSBuYW1lIHdpdGhvdXQgYC5qc29uYCkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIGBzY2hlbWEudGFibGVgIGlkZW50aWZpZXIuICovXG4gICAgcmVhZG9ubHkgcXVhbGlmaWVkTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlLiAqL1xuICAgIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZmlsZSBwYXNzZWQgTGF5ZXIgMSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24uICovXG4gICAgcmVhZG9ubHkgc3RydWN0dXJhbGx5VmFsaWQ6IGJvb2xlYW47XG5cbiAgICAvKiogTm9ybWFsaXplZCBkZWZpbml0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlZmluaXRpb246IFRhYmxlRGVmaW5pdGlvbjtcbn1cblxuLyoqIFByZS1maWxsZWQgbG9jYXRpb24gZmllbGRzIGF0dGFjaGVkIHRvIGV2ZXJ5IHZpb2xhdGlvbiBhIHRhYmxlIGVtaXRzLiAqL1xudHlwZSBMb2NhdGlvbkZpZWxkcyA9IFBpY2s8VmlvbGF0aW9uLCAnc2NoZW1hJyB8ICd0YWJsZScgfCAncGF0aCc+O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBlbmdpbmUtc3BlY2lmaWMgdGFibGUgdHlwZXMuXG4gKlxuICogU3ViY2xhc3NlcyBpbXBsZW1lbnQgYGlzVmFsaWRDb2x1bW5UeXBlYCAodGhlIGVuZ2luZSdzIHR5cGUgcmVnaXN0cnkpIGFuZFxuICogYHBhcnRpdGlvblZpb2xhdGlvbnNgICh0aGUgZW5naW5lJ3MgcGFydGl0aW9uIHNlbWFudGljcykuIEV2ZXJ5dGhpbmcgZWxzZVxuICog4oCUIHByaW1hcnkta2V5IGNoZWNrcywgZHVwZXMsIHJhdyBjb25zaXN0ZW5jeSwgZGVwZW5kcy1vbiByZXNvbHV0aW9uLFxuICogZm9yZWlnbi1rZXkgY2hlY2tzIOKAlCBpcyBpZGVudGljYWwgYWNyb3NzIGVuZ2luZXMgYW5kIGxpdmVzIGhlcmUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKiogT3duaW5nIHNjaGVtYSBuYW1lLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzY2hlbWE6IHN0cmluZztcblxuICAgIC8qKiBUYWJsZSBuYW1lLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogYHNjaGVtYS50YWJsZWAgaWRlbnRpZmllci4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcXVhbGlmaWVkTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgcGFzc2VkIExheWVyIDEgc3RydWN0dXJhbCB2YWxpZGF0aW9uLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdHJ1Y3R1cmFsbHlWYWxpZDogYm9vbGVhbjtcblxuICAgIC8qKiBOb3JtYWxpemVkIGRlZmluaXRpb24uICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmluaXRpb246IFRhYmxlRGVmaW5pdGlvbjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRhYmxlIGluc3RhbmNlIGZyb20gdGhlIG5vcm1hbGl6ZWQgZmllbGRzIHByb2R1Y2VkIGJ5IHRoZVxuICAgICAqIGxvYWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZHMgVGhlIHRhYmxlIGlkZW50aXR5IHBsdXMgaXRzIHBhcnNlZCwgbm9ybWFsaXplZCBkZWZpbml0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZpZWxkczogVGFibGVUeXBlRmllbGRzKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gZmllbGRzLnNjaGVtYTtcbiAgICAgICAgdGhpcy5uYW1lID0gZmllbGRzLm5hbWU7XG4gICAgICAgIHRoaXMucXVhbGlmaWVkTmFtZSA9IGZpZWxkcy5xdWFsaWZpZWROYW1lO1xuICAgICAgICB0aGlzLmZpbGVQYXRoID0gZmllbGRzLmZpbGVQYXRoO1xuICAgICAgICB0aGlzLnN0cnVjdHVyYWxseVZhbGlkID0gZmllbGRzLnN0cnVjdHVyYWxseVZhbGlkO1xuICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBmaWVsZHMuZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gSGVscGVycyBzaGFyZWQgYnkgaW50cmEtdGFibGUgYW5kIGNyb3NzLWZpbGUgcnVsZXMuXG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCBhIHZpb2xhdGlvbiBwcmUtZmlsbGVkIHdpdGggdGhpcyB0YWJsZSdzIGxvY2F0aW9uIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aWFsIFRoZSBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHJ1bGUgZmlyaW5nIChjb2RlLCBsZXZlbCwgbWVzc2FnZSwgZmllbGQpLlxuICAgICAqIEByZXR1cm5zIEEgZnVsbCBgVmlvbGF0aW9uYCB3aXRoIGBzY2hlbWFgLCBgdGFibGVgLCBhbmQgYHBhdGhgIHNldC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdmlvbGF0aW9uKHBhcnRpYWw6IE9taXQ8VmlvbGF0aW9uLCAnc2NoZW1hJyB8ICd0YWJsZScgfCAncGF0aCc+KTogVmlvbGF0aW9uIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb246IExvY2F0aW9uRmllbGRzID0ge1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBwYXRoOiB0aGlzLmZpbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucGFydGlhbCxcbiAgICAgICAgICAgIC4uLmxvY2F0aW9uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyB0YWJsZSBkZWNsYXJlcyBhIGRhdGEgY29sdW1uIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBDb2x1bW4gbmFtZSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiBgbmFtZWAgbWF0Y2hlcyBhbnkgY29sdW1uIGluIGBkZWZpbml0aW9uLmNvbHVtbnNgLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYXNDb2x1bW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIG5hbWVzIHRoYXQgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGEgbGlzdCwgcHJlc2VydmluZyB0aGUgb3JkZXJcbiAgICAgKiBvZiBmaXJzdCBkdXBsaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lcyBOYW1lcyB0byBzY2FuLlxuICAgICAqIEByZXR1cm5zIER1cGxpY2F0ZWQgbmFtZXMsIGVhY2ggbGlzdGVkIG9uY2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZpbmREdXBsaWNhdGVzKG5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZHVwbGljYXRlcy5hZGQobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWVuLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uZHVwbGljYXRlcyxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gRW5naW5lLXNwZWNpZmljIGNvbnRyYWN0LlxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBgdHlwZWAgaXMgYSB2YWxpZCBjb2x1bW4tdHlwZSBzdHJpbmcgZm9yIHRoaXMgZW5naW5lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgQ29sdW1uIHR5cGUgc3RyaW5nIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgZW5naW5lIGFjY2VwdHMgdGhlIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGlzVmFsaWRDb2x1bW5UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBFbmdpbmUtc3BlY2lmaWMgcGFydGl0aW9uIHJ1bGVzOiBkdXBsaWNhdGUgZGV0ZWN0aW9uIHBsdXMgdGhlIGVuZ2luZSdzXG4gICAgICoga2V5L2NvbHVtbiByZXNvbHV0aW9uIGFuZCB0eXBlIC8gdHJhbnNmb3JtIC8gc3RyYXRlZ3kgbGVnYWxpdHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24gdGhpcyB0YWJsZSBwcm9kdWNlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgcGFydGl0aW9uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXTtcblxuICAgIC8qKlxuICAgICAqIEVuZ2luZS1zcGVjaWZpYyBpbnRyYS10YWJsZSBydWxlcyBiZXlvbmQgY29sdW1uLXR5cGUgYW5kIHBhcnRpdGlvbiBjaGVja3NcbiAgICAgKiAoZS5nLiBJY2ViZXJnIGZvcm1hdC12ZXJzaW9uIC8gdGFibGUgcHJvcGVydGllcywgUG9zdGdyZXMgaW5kZXhlcykuIFRoZVxuICAgICAqIGJhc2UgZW5naW5lIGhhcyBub25lOyBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIGFkZCB0aGVtLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRW5naW5lLXNwZWNpZmljIGludHJhLXRhYmxlIHZpb2xhdGlvbnMuIEVtcHR5IGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgcHVibGljIGVuZ2luZVNwZWNpZmljVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQWdub3N0aWMgaW50cmEtdGFibGUgcnVsZXMuXG5cbiAgICAvLy8gUEtfQ09MVU1OU19FWElTVCDigJQgZXZlcnkgcHJpbWFyeS1rZXkgY29sdW1uIGV4aXN0cyBpbiBgY29sdW1uc2AuXG4gICAgcHJpdmF0ZSBwcmltYXJ5S2V5VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGtDb2x1bW4gb2YgdGhpcy5kZWZpbml0aW9uLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4ocGtDb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQS19DT0xVTU5TX0VYSVNUJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdwcmltYXJ5S2V5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHByaW1hcnkta2V5IGNvbHVtbiBcIiR7cGtDb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBOT19EVVBMSUNBVEVfQ09MVU1OUyDigJQgY29sdW1uIG5hbWVzIGFyZSB1bmlxdWUgd2l0aGluIGEgdGFibGUuXG4gICAgcHJpdmF0ZSBkdXBsaWNhdGVDb2x1bW5WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgbmFtZXMgPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kRHVwbGljYXRlcyhuYW1lcykubWFwKChkdXBsaWNhdGUpID0+IHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgY29kZTogJ05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgIGZpZWxkOiAnY29sdW1ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIGNvbHVtbiBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8vIENPTFVNTl9UWVBFX1ZBTElEIOKAlCBldmVyeSBjb2x1bW4gdHlwZSBpcyB2YWxpZCBmb3IgdGhlIHRhYmxlJ3MgZW5naW5lLlxuICAgIHByaXZhdGUgY29sdW1uVHlwZVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZENvbHVtblR5cGUoY29sdW1uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdDT0xVTU5fVFlQRV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgY29sdW1uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7Y29sdW1uLnR5cGV9XCIgaXMgbm90IGEgdmFsaWQgJHt0aGlzLmRlZmluaXRpb24udGFibGVUeXBlfSB0eXBlIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYGZvciBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gUkFXX05PX0RFUEVORFNfT04gLyBOT05SQVdfUkVRVUlSRVNfREVQRU5EU19PTi5cbiAgICBwcml2YXRlIHJhd0NvbnNpc3RlbmN5VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlzUmF3RGF0YSxcbiAgICAgICAgICAgIGRlcGVuZHNPbixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKGlzUmF3RGF0YSAmJiBkZXBlbmRzT24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUkFXX05PX0RFUEVORFNfT04nLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZGVwZW5kc09uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAncmF3IHRhYmxlcyAoaXNSYXdEYXRhPXRydWUpIG11c3Qgbm90IGRlY2xhcmUgZGVwZW5kc09uJyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmF3RGF0YSAmJiBkZXBlbmRzT24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdOT05SQVdfUkVRVUlSRVNfREVQRU5EU19PTicsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdkZXBlbmRzT24nLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdub24tcmF3IHRhYmxlcyAoaXNSYXdEYXRhPWZhbHNlKSBtdXN0IGRlY2xhcmUgYXQgbGVhc3Qgb25lIGRlcGVuZHNPbicsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFBLX0NPTFVNTl9OT1RfTlVMTEFCTEUgLyBGS19OVUxMQUJJTElUWV9DT05TSVNURU5UIOKAlCBwZXItY29sdW1uXG4gICAgLy8vIG51bGxhYmlsaXR5IGNvbnRyYWRpY3Rpb25zIGFnYWluc3QgdGhlIHByaW1hcnkga2V5IGFuZCBmb3JlaWduIGtleXMuXG4gICAgcHJpdmF0ZSBudWxsYWJpbGl0eVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIC8vLyBBIHByaW1hcnkta2V5IGNvbHVtbiBpcyBpbXBsaWNpdGx5IE5PVCBOVUxMLCBzbyBkZWNsYXJpbmcgaXQgbnVsbGFibGVcbiAgICAgICAgLy8vIGlzIGEgY29udHJhZGljdGlvbi5cbiAgICAgICAgZm9yIChjb25zdCBwa0NvbHVtbiBvZiB0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcGtDb2x1bW4pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUEtfQ09MVU1OX05PVF9OVUxMQUJMRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAncHJpbWFyeUtleScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwcmltYXJ5LWtleSBjb2x1bW4gXCIke3BrQ29sdW1ufVwiIGNhbm5vdCBiZSBudWxsYWJsZSAoZGVjbGFyZWQgbnVsbGFibGU6IHRydWUpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLy8gQSBOT1QgTlVMTCBsb2NhbCBjb2x1bW4gY2FuIG5ldmVyIGJlIG51bGwsIHNvIGEgZm9yZWlnbiBrZXkgdGhhdFxuICAgICAgICAvLy8gcGVybWl0cyBudWxscyBvbiBpdCBpcyBpbmNvbnNpc3RlbnQuXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5mb3JlaWduS2V5cy5mb3JFYWNoKChmaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IGZrLmxvY2FsQ29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4ubnVsbGFibGUgPT09IGZhbHNlICYmIGZrLmFsbG93TnVsbHMpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnRktfTlVMTEFCSUxJVFlfQ09OU0lTVEVOVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgZm9yZWlnbktleXNbJHtpbmRleH1dLmFsbG93TnVsbHNgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgYWxsb3dzIG51bGxzIGJ1dCBsb2NhbCBjb2x1bW4gXCIke2ZrLmxvY2FsQ29sdW1ufVwiIGlzIGRlY2xhcmVkIG5vbi1udWxsYWJsZWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGwgaW50cmEtdGFibGUgdmlvbGF0aW9ucyBmb3IgdGhpcyB0YWJsZSAoZW5naW5lLWFnbm9zdGljIHJ1bGVzIHBsdXNcbiAgICAgKiB0aGUgZW5naW5lLXNwZWNpZmljIHBhcnRpdGlvbiBydWxlcykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBpbnRyYS10YWJsZSB2aW9sYXRpb24gdGhpcyB0YWJsZSBwcm9kdWNlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50cmFUYWJsZVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5wcmltYXJ5S2V5VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5kdXBsaWNhdGVDb2x1bW5WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmNvbHVtblR5cGVWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnBhcnRpdGlvblZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMucmF3Q29uc2lzdGVuY3lWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLm51bGxhYmlsaXR5VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5lbmdpbmVTcGVjaWZpY1Zpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ3Jvc3MtZmlsZSBydWxlcy5cblxuICAgIC8vLyBERVBFTkRTX09OX1JFU09MVkVTIOKAlCBldmVyeSBkZXBlbmRzT24gZW50cnkgcmVzb2x2ZXMgdG8gYSByZWFsIHRhYmxlLlxuICAgIHByaXZhdGUgZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZDogV29ybGQpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uZm9yRWFjaCgoZGVwZW5kZW5jeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghd29ybGQudGFibGVzLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnREVQRU5EU19PTl9SRVNPTFZFUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgZGVwZW5kc09uWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkZXBlbmRzT24gXCIke2RlcGVuZGVuY3l9XCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIGtub3duIHRhYmxlYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gRm9yZWlnbi1rZXkgY2hlY2tzIGZvciBhIHNpbmdsZSBGSyBlbnRyeS5cbiAgICBwcml2YXRlIGZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkOiBXb3JsZCwgZms6IEZvcmVpZ25LZXksIGluZGV4OiBudW1iZXIpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGZpZWxkID0gYGZvcmVpZ25LZXlzWyR7aW5kZXh9XWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihmay5sb2NhbENvbHVtbikpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX0xPQ0FMX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0ubG9jYWxDb2x1bW5gLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBsb2NhbCBjb2x1bW4gXCIke2ZrLmxvY2FsQ29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vIEEgc2VsZi1yZWZlcmVudGlhbCBmb3JlaWduIGtleSAoZS5nLiBhIGBwYXJlbnRfaWRgIHBvaW50aW5nIGF0IHRoZSBzYW1lXG4gICAgICAgIC8vLyB0YWJsZSdzIGtleSkgZG9lcyBub3QgY3JlYXRlIGEgcGlwZWxpbmUgZGVwZW5kZW5jeSwgc28gaXQgaXMgZXhlbXB0IGZyb21cbiAgICAgICAgLy8vIEZLX0lNUExJRVNfREVQRU5ERU5DWSDigJQgcmVxdWlyaW5nIGEgc2VsZi1gZGVwZW5kc09uYCB3b3VsZCBvdGhlcndpc2UgZm9yY2VcbiAgICAgICAgLy8vIGEgc3B1cmlvdXMgZGVwZW5kZW5jeSBjeWNsZS5cbiAgICAgICAgY29uc3QgaXNTZWxmUmVmZXJlbmNlID0gZmsuc291cmNlVGFibGUgPT09IHRoaXMucXVhbGlmaWVkTmFtZTtcbiAgICAgICAgaWYgKCFpc1NlbGZSZWZlcmVuY2UgJiYgIXRoaXMuZGVmaW5pdGlvbi5kZXBlbmRzT24uaW5jbHVkZXMoZmsuc291cmNlVGFibGUpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19JTVBMSUVTX0RFUEVOREVOQ1knLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uc291cmNlVGFibGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBmb3JlaWduIGtleSB0YXJnZXRzIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBidXQgaXQgaXMgbm90IGxpc3RlZCBpbiBkZXBlbmRzT25gLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gd29ybGQudGFibGVzLmdldChmay5zb3VyY2VUYWJsZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRktfU09VUkNFX1RBQkxFX1JFU09MVkVTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZVRhYmxlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZm9yZWlnbiBrZXkgc291cmNlIHRhYmxlIFwiJHtmay5zb3VyY2VUYWJsZX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEga25vd24gdGFibGVgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLy8gVGhlIHRhcmdldCdzIG93biBzdHJ1Y3R1cmFsIGVycm9ycyAocmVwb3J0ZWQgYnkgTGF5ZXIgMSkgYWxyZWFkeSBleHBsYWluXG4gICAgICAgIC8vLyB3aHkgaXRzIGNvbHVtbnMgY2FuJ3QgYmUgdHJ1c3RlZDsgc2tpcCBjb2x1bW4tbGV2ZWwgY2hlY2tzIHRvIGF2b2lkXG4gICAgICAgIC8vLyBwaWxpbmcgbWlzbGVhZGluZyBmaW5kaW5ncyBvbiB0b3AuXG4gICAgICAgIGlmICghdGFyZ2V0LnN0cnVjdHVyYWxseVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldEhhc0NvbHVtbiA9IHRhcmdldC5kZWZpbml0aW9uLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gZmsuc291cmNlQ29sdW1uKTtcbiAgICAgICAgaWYgKCF0YXJnZXRIYXNDb2x1bW4pIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0ZLX1NPVVJDRV9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5kZWZpbml0aW9uLnByaW1hcnlLZXkuaW5jbHVkZXMoZmsuc291cmNlQ29sdW1uKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdGS19TT1VSQ0VfSVNfS0VZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnNvdXJjZUNvbHVtbmAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGZvcmVpZ24ga2V5IHNvdXJjZSBjb2x1bW4gXCIke2ZrLnNvdXJjZUNvbHVtbn1cIiBpcyBub3QgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkgYFxuICAgICAgICAgICAgICAgICAgICArIGBvZiBcIiR7Zmsuc291cmNlVGFibGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGNyb3NzLWZpbGUgdmlvbGF0aW9ucyBmb3IgdGhpcyB0YWJsZSAoYGRlcGVuZHNPbmAgcmVzb2x1dGlvbiBwbHVzXG4gICAgICogdGhlIGZ1bGwgZm9yZWlnbi1rZXkgc3VpdGUpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdvcmxkIFRoZSBsb2FkZWQgZGF0YXNldCByb290LlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNyb3NzLWZpbGUgdmlvbGF0aW9uIHRoaXMgdGFibGUgcHJvZHVjZXMuXG4gICAgICovXG4gICAgcHVibGljIGNyb3NzRmlsZVZpb2xhdGlvbnMod29ybGQ6IFdvcmxkKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuZGVwZW5kc09uVmlvbGF0aW9ucyh3b3JsZCksXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5mb3JlaWduS2V5cy5mb3JFYWNoKChmaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLmZvcmVpZ25LZXlWaW9sYXRpb25zKHdvcmxkLCBmaywgaW5kZXgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
@@ -28,6 +28,27 @@ export declare class IcebergParquetTable extends TableTypeBase {
28
28
  * @returns Every partition-related violation.
29
29
  */
30
30
  partitionViolations(): Violation[];
31
+ private static readonly FORMAT_VERSIONS;
32
+ private static readonly ENUM_PROPERTIES;
33
+ private static readonly POSITIVE_INT_PROPERTIES;
34
+ private static readonly INT_RANGE_PROPERTIES;
35
+ /**
36
+ * Iceberg engine-specific rules: format version and table properties.
37
+ *
38
+ * @returns Every engine-specific violation.
39
+ */
40
+ engineSpecificViolations(): Violation[];
41
+ private formatVersionViolations;
42
+ /**
43
+ * Validate the closed-domain Iceberg table properties. Keys outside the
44
+ * known set pass through unvalidated.
45
+ *
46
+ * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`, and
47
+ * `ICEBERG_PROPERTY_INT_RANGE`.
48
+ *
49
+ * @returns Every table-property violation.
50
+ */
51
+ private tablePropertyViolations;
31
52
  /**
32
53
  * Normalize a partition into its identity key. When the transform parses,
33
54
  * collapse on `${kind}:${param}` so `day` and `DAY`, `bucket[16]` and
@@ -10,6 +10,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.IcebergParquetTable = void 0;
11
11
  const table_type_1 = require("../table-type");
12
12
  const iceberg_1 = require("../iceberg");
13
+ /**
14
+ * Whether a string is a positive integer (digits only, value > 0). Iceberg
15
+ * table-property values are strings, so numeric checks parse the string.
16
+ *
17
+ * @param value Property value string.
18
+ * @returns True when `value` is a positive integer.
19
+ */
20
+ function isPositiveInteger(value) {
21
+ return /^\d+$/.test(value) && Number(value) > 0;
22
+ }
23
+ /**
24
+ * Whether a string is an integer within an inclusive range.
25
+ *
26
+ * @param value Property value string.
27
+ * @param min Inclusive lower bound.
28
+ * @param max Inclusive upper bound.
29
+ * @returns True when `value` is an integer in `[min, max]`.
30
+ */
31
+ function isIntegerInRange(value, min, max) {
32
+ if (!/^\d+$/.test(value)) {
33
+ return false;
34
+ }
35
+ const parsed = Number(value);
36
+ return parsed >= min && parsed <= max;
37
+ }
13
38
  /** Iceberg (parquet) table. */
14
39
  class IcebergParquetTable extends table_type_1.TableTypeBase {
15
40
  /**
@@ -82,6 +107,133 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
82
107
  });
83
108
  return violations;
84
109
  }
110
+ /// The Iceberg format versions this validator understands.
111
+ static FORMAT_VERSIONS = new Set([
112
+ 1,
113
+ 2,
114
+ 3,
115
+ ]);
116
+ /// Table-property keys whose value must come from a closed set.
117
+ static ENUM_PROPERTIES = {
118
+ 'write.format.default': [
119
+ 'parquet',
120
+ 'avro',
121
+ 'orc',
122
+ ],
123
+ 'write.parquet.compression-codec': [
124
+ 'zstd',
125
+ 'gzip',
126
+ 'snappy',
127
+ 'lz4',
128
+ 'none',
129
+ ],
130
+ 'write.avro.compression-codec': [
131
+ 'gzip',
132
+ 'zstd',
133
+ 'snappy',
134
+ 'uncompressed',
135
+ ],
136
+ 'write.orc.compression-codec': [
137
+ 'zstd',
138
+ 'lz4',
139
+ 'lzo',
140
+ 'zlib',
141
+ 'snappy',
142
+ 'none',
143
+ ],
144
+ 'write.distribution-mode': [
145
+ 'none',
146
+ 'hash',
147
+ 'range',
148
+ ],
149
+ 'write.metadata.compression-codec': [
150
+ 'none',
151
+ 'gzip',
152
+ ],
153
+ };
154
+ /// Table-property keys whose value must be a positive integer.
155
+ static POSITIVE_INT_PROPERTIES = [
156
+ 'write.target-file-size-bytes',
157
+ 'history.expire.max-snapshot-age-ms',
158
+ 'history.expire.min-snapshots-to-keep',
159
+ 'history.expire.max-ref-age-ms',
160
+ 'write.metadata.previous-versions-max',
161
+ ];
162
+ /// Table-property keys whose value must be an integer within an inclusive range.
163
+ static INT_RANGE_PROPERTIES = {
164
+ 'write.parquet.compression-level': {
165
+ min: 1,
166
+ max: 22,
167
+ },
168
+ };
169
+ /**
170
+ * Iceberg engine-specific rules: format version and table properties.
171
+ *
172
+ * @returns Every engine-specific violation.
173
+ */
174
+ engineSpecificViolations() {
175
+ return [
176
+ ...this.formatVersionViolations(),
177
+ ...this.tablePropertyViolations(),
178
+ ];
179
+ }
180
+ /// ICEBERG_FORMAT_VERSION_VALID — `formatVersion`, when set, is 1, 2, or 3.
181
+ formatVersionViolations() {
182
+ const { formatVersion, } = this.definition;
183
+ if (formatVersion === undefined || IcebergParquetTable.FORMAT_VERSIONS.has(formatVersion)) {
184
+ return [];
185
+ }
186
+ return [
187
+ this.violation({
188
+ level: 'error',
189
+ code: 'ICEBERG_FORMAT_VERSION_VALID',
190
+ field: 'formatVersion',
191
+ message: `Iceberg formatVersion "${formatVersion}" must be 1, 2, or 3`,
192
+ }),
193
+ ];
194
+ }
195
+ /**
196
+ * Validate the closed-domain Iceberg table properties. Keys outside the
197
+ * known set pass through unvalidated.
198
+ *
199
+ * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`, and
200
+ * `ICEBERG_PROPERTY_INT_RANGE`.
201
+ *
202
+ * @returns Every table-property violation.
203
+ */
204
+ tablePropertyViolations() {
205
+ const violations = [];
206
+ for (const [key, value,] of Object.entries(this.definition.tableProperties)) {
207
+ const allowed = IcebergParquetTable.ENUM_PROPERTIES[key];
208
+ if (allowed !== undefined && !allowed.includes(value)) {
209
+ violations.push(this.violation({
210
+ level: 'error',
211
+ code: 'ICEBERG_PROPERTY_ENUM_VALID',
212
+ field: `tableProperties["${key}"]`,
213
+ message: `table property "${key}" value "${value}" must be one of: ${allowed.join(', ')}`,
214
+ }));
215
+ }
216
+ if (IcebergParquetTable.POSITIVE_INT_PROPERTIES.includes(key) && !isPositiveInteger(value)) {
217
+ violations.push(this.violation({
218
+ level: 'error',
219
+ code: 'ICEBERG_PROPERTY_POSITIVE_INT',
220
+ field: `tableProperties["${key}"]`,
221
+ message: `table property "${key}" value "${value}" must be a positive integer`,
222
+ }));
223
+ }
224
+ const range = IcebergParquetTable.INT_RANGE_PROPERTIES[key];
225
+ if (range !== undefined && !isIntegerInRange(value, range.min, range.max)) {
226
+ violations.push(this.violation({
227
+ level: 'error',
228
+ code: 'ICEBERG_PROPERTY_INT_RANGE',
229
+ field: `tableProperties["${key}"]`,
230
+ message: `table property "${key}" value "${value}" must be an integer between `
231
+ + `${range.min} and ${range.max}`,
232
+ }));
233
+ }
234
+ }
235
+ return violations;
236
+ }
85
237
  /**
86
238
  * Normalize a partition into its identity key. When the transform parses,
87
239
  * collapse on `${kind}:${param}` so `day` and `DAY`, `bucket[16]` and
@@ -100,4 +252,4 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
100
252
  }
101
253
  }
102
254
  exports.IcebergParquetTable = IcebergParquetTable;
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFNSCw4Q0FFdUI7QUFDdkIsd0NBS29CO0FBRXBCLCtCQUErQjtBQUMvQixNQUFhLG1CQUFvQixTQUFRLDBCQUFhO0lBQ2xEOzs7OztPQUtHO0lBQ0ksaUJBQWlCLENBQUMsSUFBWTtRQUNqQyxPQUFPLElBQUEsNEJBQWtCLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxtQkFBbUI7UUFDdEIsTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEVBQ0YsVUFBVSxHQUNiLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVwQixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUseUJBQXlCO29CQUMvQixLQUFLLEVBQUUsY0FBYyxLQUFLLEdBQUc7b0JBQzdCLE9BQU8sRUFBRSx5QkFBeUIsU0FBUyxDQUFDLElBQUkscUJBQXFCLFNBQVMsQ0FBQyxJQUFJLEdBQUc7aUJBQ3pGLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUYsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLGlDQUFpQztvQkFDdkMsS0FBSyxFQUFFLGNBQWMsS0FBSyxRQUFRO29CQUNsQyxPQUFPLEVBQUUsb0NBQW9DLFNBQVMsQ0FBQyxJQUFJLDZCQUE2QjtpQkFDM0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUseUJBQXlCO29CQUMvQixLQUFLLEVBQUUsY0FBYyxLQUFLLFFBQVE7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLDhDQUE4QztpQkFDNUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDBCQUFnQixFQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFBLDhCQUFvQixFQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxxQ0FBcUM7b0JBQzNDLEtBQUssRUFBRSxjQUFjLEtBQUssUUFBUTtvQkFDbEMsT0FBTyxFQUFFLGNBQWMsU0FBUyxDQUFDLElBQUksb0JBQW9COzBCQUNuRCxXQUFXLFNBQVMsQ0FBQyxJQUFJLGNBQWMsWUFBWSxDQUFDLElBQUksR0FBRztpQkFDcEUsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxZQUFZLENBQUMsU0FBb0I7UUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBQSwrQkFBcUIsRUFBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxTQUFTO1lBQ2pDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUU7WUFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0NBQ0o7QUE5RkQsa0RBOEZDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJY2ViZXJnIChwYXJxdWV0KSB0YWJsZSB0eXBlLlxuICpcbiAqIEljZWJlcmcgcGFydGl0aW9ucyBhcmUgdHJhbnNmb3JtcyBhcHBsaWVkIHRvIGEgZGF0YSBjb2x1bW4sIHNvIGR1cGxpY2F0ZVxuICogZGV0ZWN0aW9uIGtleXMgb24gdGhlIChzb3VyY2UgY29sdW1uLCBub3JtYWxpemVkIHRyYW5zZm9ybSkgcGFpciDigJQgYHllYXIodHMpYFxuICogYW5kIGBtb250aCh0cylgIGFyZSBkaXN0aW5jdCwgd2hpbGUgYGRheWAgYW5kIGBEQVlgIGNvbGxhcHNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgUGFydGl0aW9uLFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgaXNWYWxpZEljZWJlcmdUeXBlLFxuICAgIHBhcnNlSWNlYmVyZ1RyYW5zZm9ybSxcbiAgICBwYXJzZUljZWJlcmdUeXBlLFxuICAgIHRyYW5zZm9ybUxlZ2FsT25UeXBlLFxufSBmcm9tICcuLi9pY2ViZXJnJztcblxuLyoqIEljZWJlcmcgKHBhcnF1ZXQpIHRhYmxlLiAqL1xuZXhwb3J0IGNsYXNzIEljZWJlcmdQYXJxdWV0VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIEljZWJlcmcgdjAgdHlwZSByZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgc3RyaW5nIGZyb20gYSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHR5cGUgaXMgYSB2YWxpZCBJY2ViZXJnIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGlzVmFsaWRDb2x1bW5UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNWYWxpZEljZWJlcmdUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgcGFydGl0aW9uIHJ1bGVzLlxuICAgICAqXG4gICAgICogRW1pdHM6IGBOT19EVVBMSUNBVEVfUEFSVElUSU9OU2AgKGtleWVkIGJ5IGAke25hbWV9ICR7dHJhbnNmb3JtS2luZH06JHtwYXJhbX1gLFxuICAgICAqIGZhbGxpbmcgYmFjayB0byBhIGxvd2VyY2FzZWQgdHJpbSBvZiB0aGUgcmF3IHRyYW5zZm9ybSB3aGVuIGl0IGRvZXNuJ3RcbiAgICAgKiBwYXJzZSwgc28gd2hpdGVzcGFjZSAvIGNhc2UgdmFyaWFudHMgb2YgdGhlIHNhbWUgdHJhbnNmb3JtIGNvbGxhcHNlKSxcbiAgICAgKiBgSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUU2AsIGBJQ0VCRVJHX1RSQU5TRk9STV9WQUxJRGAsIGFuZFxuICAgICAqIGBJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfVFlQRV9MRUdBTGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnBhcnRpdGlvbktleShwYXJ0aXRpb24pO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ05PX0RVUExJQ0FURV9QQVJUSVRJT05TJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgcGFydGl0aW9uOiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgd2l0aCB0cmFuc2Zvcm0gXCIke3BhcnRpdGlvbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJ0aXRpb25zLmZvckVhY2goKHBhcnRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IHBhcnRpdGlvbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJY2ViZXJnIHBhcnRpdGlvbiBzb3VyY2UgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfVFJBTlNGT1JNX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgYSB2YWxpZCBJY2ViZXJnIHBhcnRpdGlvbiB0cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gcGFyc2VJY2ViZXJnVHlwZShzb3VyY2VDb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlVHlwZSAhPT0gbnVsbCAmJiAhdHJhbnNmb3JtTGVnYWxPblR5cGUodHJhbnNmb3JtLCBzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX1RZUEVfTEVHQUwnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdHJhbnNmb3JtIFwiJHtwYXJ0aXRpb24udHlwZX1cIiBpcyBub3QgbGVnYWwgb24gYFxuICAgICAgICAgICAgICAgICAgICAgICAgKyBgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBvZiB0eXBlIFwiJHtzb3VyY2VDb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBwYXJ0aXRpb24gaW50byBpdHMgaWRlbnRpdHkga2V5LiBXaGVuIHRoZSB0cmFuc2Zvcm0gcGFyc2VzLFxuICAgICAqIGNvbGxhcHNlIG9uIGAke2tpbmR9OiR7cGFyYW19YCBzbyBgZGF5YCBhbmQgYERBWWAsIGBidWNrZXRbMTZdYCBhbmRcbiAgICAgKiBgYnVja2V0WyAxNiBdYCBhcmUgdGhlIHNhbWUuIFdoZW4gdGhlIHRyYW5zZm9ybSBkb2Vzbid0IHBhcnNlLCB0aGVcbiAgICAgKiBsb3dlcmNhc2VkIHRyaW0gb2YgdGhlIHJhdyBzdHJpbmcgaXMgdGhlIGJlc3QgaWRlbnRpdHkgd2UgaGF2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb24gUGFydGl0aW9uIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFydGl0aW9uS2V5KHBhcnRpdGlvbjogUGFydGl0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBwYXJ0aXRpb24udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGAke3BhcnRpdGlvbi5uYW1lfSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG59XG4iXX0=
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFNSCw4Q0FFdUI7QUFDdkIsd0NBS29CO0FBRXBCOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUNwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQsK0JBQStCO0FBQy9CLE1BQWEsbUJBQW9CLFNBQVEsMEJBQWE7SUFDbEQ7Ozs7O09BS0c7SUFDSSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2pDLE9BQU8sSUFBQSw0QkFBa0IsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLG1CQUFtQjtRQUN0QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFDRixVQUFVLEdBQ2IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXBCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLEtBQUssRUFBRSxjQUFjLEtBQUssR0FBRztvQkFDN0IsT0FBTyxFQUFFLHlCQUF5QixTQUFTLENBQUMsSUFBSSxxQkFBcUIsU0FBUyxDQUFDLElBQUksR0FBRztpQkFDekYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsaUNBQWlDO29CQUN2QyxLQUFLLEVBQUUsY0FBYyxLQUFLLFFBQVE7b0JBQ2xDLE9BQU8sRUFBRSxvQ0FBb0MsU0FBUyxDQUFDLElBQUksNkJBQTZCO2lCQUMzRixDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLEtBQUssRUFBRSxjQUFjLEtBQUssUUFBUTtvQkFDbEMsT0FBTyxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksOENBQThDO2lCQUM1RSxDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUEsOEJBQW9CLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsS0FBSyxFQUFFLGNBQWMsS0FBSyxRQUFRO29CQUNsQyxPQUFPLEVBQUUsY0FBYyxTQUFTLENBQUMsSUFBSSxvQkFBb0I7MEJBQ25ELFdBQVcsU0FBUyxDQUFDLElBQUksY0FBYyxZQUFZLENBQUMsSUFBSSxHQUFHO2lCQUNwRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRCwyREFBMkQ7SUFDbkQsTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsQ0FBQztRQUNELENBQUM7S0FDSixDQUFDLENBQUM7SUFFSCxnRUFBZ0U7SUFDeEQsTUFBTSxDQUFVLGVBQWUsR0FBc0M7UUFDekUsc0JBQXNCLEVBQUU7WUFDcEIsU0FBUztZQUNULE1BQU07WUFDTixLQUFLO1NBQ1I7UUFDRCxpQ0FBaUMsRUFBRTtZQUMvQixNQUFNO1lBQ04sTUFBTTtZQUNOLFFBQVE7WUFDUixLQUFLO1lBQ0wsTUFBTTtTQUNUO1FBQ0QsOEJBQThCLEVBQUU7WUFDNUIsTUFBTTtZQUNOLE1BQU07WUFDTixRQUFRO1lBQ1IsY0FBYztTQUNqQjtRQUNELDZCQUE2QixFQUFFO1lBQzNCLE1BQU07WUFDTixLQUFLO1lBQ0wsS0FBSztZQUNMLE1BQU07WUFDTixRQUFRO1lBQ1IsTUFBTTtTQUNUO1FBQ0QseUJBQXlCLEVBQUU7WUFDdkIsTUFBTTtZQUNOLE1BQU07WUFDTixPQUFPO1NBQ1Y7UUFDRCxrQ0FBa0MsRUFBRTtZQUNoQyxNQUFNO1lBQ04sTUFBTTtTQUNUO0tBQ0osQ0FBQztJQUVGLCtEQUErRDtJQUN2RCxNQUFNLENBQVUsdUJBQXVCLEdBQXNCO1FBQ2pFLDhCQUE4QjtRQUM5QixvQ0FBb0M7UUFDcEMsc0NBQXNDO1FBQ3RDLCtCQUErQjtRQUMvQixzQ0FBc0M7S0FDekMsQ0FBQztJQUVGLGlGQUFpRjtJQUN6RSxNQUFNLENBQVUsb0JBQW9CLEdBQWlEO1FBQ3pGLGlDQUFpQyxFQUFFO1lBQy9CLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLEVBQUU7U0FDVjtLQUNKLENBQUM7SUFFRjs7OztPQUlHO0lBQ0ksd0JBQXdCO1FBQzNCLE9BQU87WUFDSCxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNqQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtTQUNwQyxDQUFDO0lBQ04sQ0FBQztJQUVELDRFQUE0RTtJQUNwRSx1QkFBdUI7UUFDM0IsTUFBTSxFQUNGLGFBQWEsR0FDaEIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BCLElBQUksYUFBYSxLQUFLLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEYsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ1gsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSSxFQUFFLDhCQUE4QjtnQkFDcEMsS0FBSyxFQUFFLGVBQWU7Z0JBQ3RCLE9BQU8sRUFBRSwwQkFBMEIsYUFBYSxzQkFBc0I7YUFDekUsQ0FBQztTQUNMLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyx1QkFBdUI7UUFDM0IsTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUVuQyxLQUFLLE1BQU0sQ0FDUCxHQUFHLEVBQ0gsS0FBSyxFQUNSLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsNkJBQTZCO29CQUNuQyxLQUFLLEVBQUUsb0JBQW9CLEdBQUcsSUFBSTtvQkFDbEMsT0FBTyxFQUFFLG1CQUFtQixHQUFHLFlBQVksS0FBSyxxQkFBcUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtpQkFDNUYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBRUQsSUFBSSxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6RixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSwrQkFBK0I7b0JBQ3JDLEtBQUssRUFBRSxvQkFBb0IsR0FBRyxJQUFJO29CQUNsQyxPQUFPLEVBQUUsbUJBQW1CLEdBQUcsWUFBWSxLQUFLLDhCQUE4QjtpQkFDakYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsS0FBSyxFQUFFLG9CQUFvQixHQUFHLElBQUk7b0JBQ2xDLE9BQU8sRUFBRSxtQkFBbUIsR0FBRyxZQUFZLEtBQUssK0JBQStCOzBCQUN6RSxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtpQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFlBQVksQ0FBQyxTQUFvQjtRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLG1CQUFtQixHQUFHLFNBQVM7WUFDakMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3RELENBQUM7O0FBNU9MLGtEQTZPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSWNlYmVyZyAocGFycXVldCkgdGFibGUgdHlwZS5cbiAqXG4gKiBJY2ViZXJnIHBhcnRpdGlvbnMgYXJlIHRyYW5zZm9ybXMgYXBwbGllZCB0byBhIGRhdGEgY29sdW1uLCBzbyBkdXBsaWNhdGVcbiAqIGRldGVjdGlvbiBrZXlzIG9uIHRoZSAoc291cmNlIGNvbHVtbiwgbm9ybWFsaXplZCB0cmFuc2Zvcm0pIHBhaXIg4oCUIGB5ZWFyKHRzKWBcbiAqIGFuZCBgbW9udGgodHMpYCBhcmUgZGlzdGluY3QsIHdoaWxlIGBkYXlgIGFuZCBgREFZYCBjb2xsYXBzZS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIFBhcnRpdGlvbixcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7XG4gICAgVGFibGVUeXBlQmFzZSxcbn0gZnJvbSAnLi4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIGlzVmFsaWRJY2ViZXJnVHlwZSxcbiAgICBwYXJzZUljZWJlcmdUcmFuc2Zvcm0sXG4gICAgcGFyc2VJY2ViZXJnVHlwZSxcbiAgICB0cmFuc2Zvcm1MZWdhbE9uVHlwZSxcbn0gZnJvbSAnLi4vaWNlYmVyZyc7XG5cbi8qKlxuICogV2hldGhlciBhIHN0cmluZyBpcyBhIHBvc2l0aXZlIGludGVnZXIgKGRpZ2l0cyBvbmx5LCB2YWx1ZSA+IDApLiBJY2ViZXJnXG4gKiB0YWJsZS1wcm9wZXJ0eSB2YWx1ZXMgYXJlIHN0cmluZ3MsIHNvIG51bWVyaWMgY2hlY2tzIHBhcnNlIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlIHN0cmluZy5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBgdmFsdWVgIGlzIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gaXNQb3NpdGl2ZUludGVnZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlxcZCskLy50ZXN0KHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID4gMDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgc3RyaW5nIGlzIGFuIGludGVnZXIgd2l0aGluIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgUHJvcGVydHkgdmFsdWUgc3RyaW5nLlxuICogQHBhcmFtIG1pbiBJbmNsdXNpdmUgbG93ZXIgYm91bmQuXG4gKiBAcGFyYW0gbWF4IEluY2x1c2l2ZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBgdmFsdWVgIGlzIGFuIGludGVnZXIgaW4gYFttaW4sIG1heF1gLlxuICovXG5mdW5jdGlvbiBpc0ludGVnZXJJblJhbmdlKHZhbHVlOiBzdHJpbmcsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiBwYXJzZWQgPj0gbWluICYmIHBhcnNlZCA8PSBtYXg7XG59XG5cbi8qKiBJY2ViZXJnIChwYXJxdWV0KSB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBJY2ViZXJnUGFycXVldFRhYmxlIGV4dGVuZHMgVGFibGVUeXBlQmFzZSB7XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgYSBjb2x1bW4gdHlwZSBhZ2FpbnN0IHRoZSBJY2ViZXJnIHYwIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgSWNlYmVyZyB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkQ29sdW1uVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRJY2ViZXJnVHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJY2ViZXJnIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChrZXllZCBieSBgJHtuYW1lfSAke3RyYW5zZm9ybUtpbmR9OiR7cGFyYW19YCxcbiAgICAgKiBmYWxsaW5nIGJhY2sgdG8gYSBsb3dlcmNhc2VkIHRyaW0gb2YgdGhlIHJhdyB0cmFuc2Zvcm0gd2hlbiBpdCBkb2Vzbid0XG4gICAgICogcGFyc2UsIHNvIHdoaXRlc3BhY2UgLyBjYXNlIHZhcmlhbnRzIG9mIHRoZSBzYW1lIHRyYW5zZm9ybSBjb2xsYXBzZSksXG4gICAgICogYElDRUJFUkdfVFJBTlNGT1JNX1NPVVJDRV9FWElTVFNgLCBgSUNFQkVSR19UUkFOU0ZPUk1fVkFMSURgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19UUkFOU0ZPUk1fU09VUkNFX1RZUEVfTEVHQUxgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgcGFydGl0aW9uLXJlbGF0ZWQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0aXRpb25WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGFydGl0aW9ucyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHBhcnRpdGlvbnMuZm9yRWFjaCgocGFydGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5wYXJ0aXRpb25LZXkocGFydGl0aW9uKTtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfUEFSVElUSU9OUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHBhcnRpdGlvbjogXCIke3BhcnRpdGlvbi5uYW1lfVwiIHdpdGggdHJhbnNmb3JtIFwiJHtwYXJ0aXRpb24udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5maW5kKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBwYXJ0aXRpb24ubmFtZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfVFJBTlNGT1JNX1NPVVJDRV9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLm5hbWVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgSWNlYmVyZyBwYXJ0aXRpb24gc291cmNlIGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhcnNlSWNlYmVyZ1RyYW5zZm9ybShwYXJ0aXRpb24udHlwZSk7XG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1RSQU5TRk9STV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7cGFydGl0aW9uLnR5cGV9XCIgaXMgbm90IGEgdmFsaWQgSWNlYmVyZyBwYXJ0aXRpb24gdHJhbnNmb3JtYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHBhcnNlSWNlYmVyZ1R5cGUoc291cmNlQ29sdW1uLnR5cGUpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZVR5cGUgIT09IG51bGwgJiYgIXRyYW5zZm9ybUxlZ2FsT25UeXBlKHRyYW5zZm9ybSwgc291cmNlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfVFJBTlNGT1JNX1NPVVJDRV9UWVBFX0xFR0FMJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRyYW5zZm9ybSBcIiR7cGFydGl0aW9uLnR5cGV9XCIgaXMgbm90IGxlZ2FsIG9uIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgb2YgdHlwZSBcIiR7c291cmNlQ29sdW1uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFRoZSBJY2ViZXJnIGZvcm1hdCB2ZXJzaW9ucyB0aGlzIHZhbGlkYXRvciB1bmRlcnN0YW5kcy5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGT1JNQVRfVkVSU0lPTlMgPSBuZXcgU2V0KFtcbiAgICAgICAgMSxcbiAgICAgICAgMixcbiAgICAgICAgMyxcbiAgICBdKTtcblxuICAgIC8vLyBUYWJsZS1wcm9wZXJ0eSBrZXlzIHdob3NlIHZhbHVlIG11c3QgY29tZSBmcm9tIGEgY2xvc2VkIHNldC5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTlVNX1BST1BFUlRJRVM6IFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiA9IHtcbiAgICAgICAgJ3dyaXRlLmZvcm1hdC5kZWZhdWx0JzogW1xuICAgICAgICAgICAgJ3BhcnF1ZXQnLFxuICAgICAgICAgICAgJ2F2cm8nLFxuICAgICAgICAgICAgJ29yYycsXG4gICAgICAgIF0sXG4gICAgICAgICd3cml0ZS5wYXJxdWV0LmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICAgICAgJ3NuYXBweScsXG4gICAgICAgICAgICAnbHo0JyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLmF2cm8uY29tcHJlc3Npb24tY29kZWMnOiBbXG4gICAgICAgICAgICAnZ3ppcCcsXG4gICAgICAgICAgICAnenN0ZCcsXG4gICAgICAgICAgICAnc25hcHB5JyxcbiAgICAgICAgICAgICd1bmNvbXByZXNzZWQnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUub3JjLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ2x6NCcsXG4gICAgICAgICAgICAnbHpvJyxcbiAgICAgICAgICAgICd6bGliJyxcbiAgICAgICAgICAgICdzbmFwcHknLFxuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUuZGlzdHJpYnV0aW9uLW1vZGUnOiBbXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgICAgICAnaGFzaCcsXG4gICAgICAgICAgICAncmFuZ2UnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUubWV0YWRhdGEuY29tcHJlc3Npb24tY29kZWMnOiBbXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgICAgICAnZ3ppcCcsXG4gICAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vLyBUYWJsZS1wcm9wZXJ0eSBrZXlzIHdob3NlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBPU0lUSVZFX0lOVF9QUk9QRVJUSUVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ3dyaXRlLnRhcmdldC1maWxlLXNpemUtYnl0ZXMnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWF4LXNuYXBzaG90LWFnZS1tcycsXG4gICAgICAgICdoaXN0b3J5LmV4cGlyZS5taW4tc25hcHNob3RzLXRvLWtlZXAnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWF4LXJlZi1hZ2UtbXMnLFxuICAgICAgICAnd3JpdGUubWV0YWRhdGEucHJldmlvdXMtdmVyc2lvbnMtbWF4JyxcbiAgICBdO1xuXG4gICAgLy8vIFRhYmxlLXByb3BlcnR5IGtleXMgd2hvc2UgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGhpbiBhbiBpbmNsdXNpdmUgcmFuZ2UuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSU5UX1JBTkdFX1BST1BFUlRJRVM6IFJlY29yZDxzdHJpbmcsIHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0+ID0ge1xuICAgICAgICAnd3JpdGUucGFycXVldC5jb21wcmVzc2lvbi1sZXZlbCc6IHtcbiAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgIG1heDogMjIsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgZW5naW5lLXNwZWNpZmljIHJ1bGVzOiBmb3JtYXQgdmVyc2lvbiBhbmQgdGFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGVuZ2luZS1zcGVjaWZpYyB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGVuZ2luZVNwZWNpZmljVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLmZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8vIElDRUJFUkdfRk9STUFUX1ZFUlNJT05fVkFMSUQg4oCUIGBmb3JtYXRWZXJzaW9uYCwgd2hlbiBzZXQsIGlzIDEsIDIsIG9yIDMuXG4gICAgcHJpdmF0ZSBmb3JtYXRWZXJzaW9uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZvcm1hdFZlcnNpb24sXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG4gICAgICAgIGlmIChmb3JtYXRWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgSWNlYmVyZ1BhcnF1ZXRUYWJsZS5GT1JNQVRfVkVSU0lPTlMuaGFzKGZvcm1hdFZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19GT1JNQVRfVkVSU0lPTl9WQUxJRCcsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdmb3JtYXRWZXJzaW9uJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgSWNlYmVyZyBmb3JtYXRWZXJzaW9uIFwiJHtmb3JtYXRWZXJzaW9ufVwiIG11c3QgYmUgMSwgMiwgb3IgM2AsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSB0aGUgY2xvc2VkLWRvbWFpbiBJY2ViZXJnIHRhYmxlIHByb3BlcnRpZXMuIEtleXMgb3V0c2lkZSB0aGVcbiAgICAgKiBrbm93biBzZXQgcGFzcyB0aHJvdWdoIHVudmFsaWRhdGVkLlxuICAgICAqXG4gICAgICogRW1pdHMgYElDRUJFUkdfUFJPUEVSVFlfRU5VTV9WQUxJRGAsIGBJQ0VCRVJHX1BST1BFUlRZX1BPU0lUSVZFX0lOVGAsIGFuZFxuICAgICAqIGBJQ0VCRVJHX1BST1BFUlRZX0lOVF9SQU5HRWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSB0YWJsZS1wcm9wZXJ0eSB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSB0YWJsZVByb3BlcnR5VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmRlZmluaXRpb24udGFibGVQcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IEljZWJlcmdQYXJxdWV0VGFibGUuRU5VTV9QUk9QRVJUSUVTW2tleV07XG4gICAgICAgICAgICBpZiAoYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmICFhbGxvd2VkLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19QUk9QRVJUWV9FTlVNX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGB0YWJsZVByb3BlcnRpZXNbXCIke2tleX1cIl1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgcHJvcGVydHkgXCIke2tleX1cIiB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoSWNlYmVyZ1BhcnF1ZXRUYWJsZS5QT1NJVElWRV9JTlRfUFJPUEVSVElFUy5pbmNsdWRlcyhrZXkpICYmICFpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfUFJPUEVSVFlfUE9TSVRJVkVfSU5UJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGB0YWJsZVByb3BlcnRpZXNbXCIke2tleX1cIl1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgcHJvcGVydHkgXCIke2tleX1cIiB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBJY2ViZXJnUGFycXVldFRhYmxlLklOVF9SQU5HRV9QUk9QRVJUSUVTW2tleV07XG4gICAgICAgICAgICBpZiAocmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZSwgcmFuZ2UubWluLCByYW5nZS5tYXgpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0lOVF9SQU5HRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7cmFuZ2UubWlufSBhbmQgJHtyYW5nZS5tYXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBwYXJ0aXRpb24gaW50byBpdHMgaWRlbnRpdHkga2V5LiBXaGVuIHRoZSB0cmFuc2Zvcm0gcGFyc2VzLFxuICAgICAqIGNvbGxhcHNlIG9uIGAke2tpbmR9OiR7cGFyYW19YCBzbyBgZGF5YCBhbmQgYERBWWAsIGBidWNrZXRbMTZdYCBhbmRcbiAgICAgKiBgYnVja2V0WyAxNiBdYCBhcmUgdGhlIHNhbWUuIFdoZW4gdGhlIHRyYW5zZm9ybSBkb2Vzbid0IHBhcnNlLCB0aGVcbiAgICAgKiBsb3dlcmNhc2VkIHRyaW0gb2YgdGhlIHJhdyBzdHJpbmcgaXMgdGhlIGJlc3QgaWRlbnRpdHkgd2UgaGF2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJ0aXRpb24gUGFydGl0aW9uIHRvIGtleS5cbiAgICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpdHkgc3RyaW5nIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFydGl0aW9uS2V5KHBhcnRpdGlvbjogUGFydGl0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcGFyc2VJY2ViZXJnVHJhbnNmb3JtKHBhcnRpdGlvbi50eXBlKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBwYXJ0aXRpb24udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGAke3BhcnRpdGlvbi5uYW1lfSAke25vcm1hbGl6ZWRUcmFuc2Zvcm19YDtcbiAgICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flexdataset",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Flexible Dataset Definition (FDD) — validator and tooling for the FDD dataset standard.",
6
6
  "author": "Rodrigo Carvajal",