@ultipa-graph/ultipa-driver 6.0.18 → 6.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/response.js CHANGED
@@ -5,10 +5,26 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Response = exports.AliasResult = exports.Row = void 0;
7
7
  const types_1 = require("./types");
8
- /** Represents a single row in the query result */
8
+ /**
9
+ * Represents a single row in the query result.
10
+ *
11
+ * Positional access via `row.get(i)` is always available. Name-based
12
+ * access via `row.getByName(name)` / `row.has(name)` requires the parent
13
+ * Response to have populated {@link Row.columnNames} (Response's
14
+ * constructor does this automatically).
15
+ *
16
+ * The row is iterable — `for (const v of row) ...` yields decoded
17
+ * column values (same as repeated `row.get(i)`).
18
+ */
9
19
  class Row {
10
20
  values;
11
21
  types;
22
+ /**
23
+ * Column names for name-based access. Injected by the parent Response
24
+ * constructor so that `row.getByName('col')` works without going
25
+ * through Response.getByName(row, 'col').
26
+ */
27
+ columnNames = [];
12
28
  constructor(values, types = []) {
13
29
  this.values = values;
14
30
  this.types = types;
@@ -25,6 +41,93 @@ class Row {
25
41
  }
26
42
  return value;
27
43
  }
44
+ /**
45
+ * Get the value for the given column name. Requires `columnNames` to
46
+ * have been populated by the parent Response.
47
+ */
48
+ getByName(name) {
49
+ if (this.columnNames.length === 0) {
50
+ throw new Error(`Row columnNames not populated; cannot look up '${name}' by name`);
51
+ }
52
+ const idx = this.columnNames.indexOf(name);
53
+ if (idx < 0) {
54
+ throw new Error(`Column not found: ${name}; available: ${this.columnNames.join(', ')}`);
55
+ }
56
+ return this.get(idx);
57
+ }
58
+ /** Returns true if this row knows the given column name. */
59
+ has(name) {
60
+ return this.columnNames.indexOf(name) >= 0;
61
+ }
62
+ /** Number of columns in this row. */
63
+ get length() {
64
+ return this.values.length;
65
+ }
66
+ /** Iterate over decoded column values. */
67
+ *[Symbol.iterator]() {
68
+ for (let i = 0; i < this.values.length; i++) {
69
+ yield this.get(i);
70
+ }
71
+ }
72
+ /**
73
+ * Formatted representation. When `columnNames` is populated:
74
+ * `Row(name1=value1, name2=value2)`
75
+ * Otherwise:
76
+ * `Row(value0, value1)`
77
+ * Mirrors the Python driver's `repr(row)` layout.
78
+ */
79
+ toString() {
80
+ const parts = [];
81
+ for (let i = 0; i < this.values.length; i++) {
82
+ const v = this.get(i);
83
+ const formatted = typeof v === 'string' ? `'${v}'` : String(v);
84
+ if (i < this.columnNames.length) {
85
+ parts.push(`${this.columnNames[i]}=${formatted}`);
86
+ }
87
+ else {
88
+ parts.push(formatted);
89
+ }
90
+ }
91
+ return `Row(${parts.join(', ')})`;
92
+ }
93
+ /**
94
+ * Structural equality: same column names (or both empty) AND decoded
95
+ * column values compare equal pairwise. Mirrors Python `Row.__eq__`.
96
+ * Uses JSON.stringify for nested value comparison — adequate for the
97
+ * primitive/object types decoded from the wire.
98
+ */
99
+ equals(other) {
100
+ if (this === other)
101
+ return true;
102
+ if (!(other instanceof Row))
103
+ return false;
104
+ if (this.columnNames.length !== other.columnNames.length)
105
+ return false;
106
+ for (let i = 0; i < this.columnNames.length; i++) {
107
+ if (this.columnNames[i] !== other.columnNames[i])
108
+ return false;
109
+ }
110
+ if (this.values.length !== other.values.length)
111
+ return false;
112
+ for (let i = 0; i < this.values.length; i++) {
113
+ const a = this.get(i);
114
+ const b = other.get(i);
115
+ if (a === b)
116
+ continue;
117
+ if (a !== a && b !== b)
118
+ continue; // NaN === NaN
119
+ if (typeof a !== typeof b)
120
+ return false;
121
+ if (typeof a === 'object' && a !== null && b !== null) {
122
+ if (JSON.stringify(a) !== JSON.stringify(b))
123
+ return false;
124
+ }
125
+ else {
126
+ return false;
127
+ }
128
+ }
129
+ return true;
130
+ }
28
131
  /** Get the PropertyType at the given column index */
29
132
  getType(index) {
30
133
  if (index < 0 || index >= this.types.length) {
@@ -388,6 +491,16 @@ class Response {
388
491
  this.warnings = warnings;
389
492
  this.rowsAffected = rowsAffected;
390
493
  this.currentGraph = currentGraph;
494
+ // Push column names into each Row so name-based access (row.getByName)
495
+ // works without going through Response.getByName(row, ...). Matches
496
+ // Python's Response.__post_init__ behavior.
497
+ if (this.columns.length > 0) {
498
+ for (const row of this.rows) {
499
+ if (row && row.columnNames.length === 0) {
500
+ row.columnNames = this.columns;
501
+ }
502
+ }
503
+ }
391
504
  }
392
505
  /** Check if the response has no rows */
393
506
  isEmpty() {
@@ -731,4 +844,4 @@ class Response {
731
844
  }
732
845
  }
733
846
  exports.Response = Response;
734
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxtQ0FBOEk7QUFFOUksa0RBQWtEO0FBQ2xELE1BQWEsR0FBRztJQUVJO0lBQ0E7SUFGbEIsWUFDa0IsTUFBYSxFQUNiLFFBQXdCLEVBQUU7UUFEMUIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLFVBQUssR0FBTCxLQUFLLENBQXFCO0lBQ3pDLENBQUM7SUFFSiw4Q0FBOEM7SUFDOUMsR0FBRyxDQUFDLEtBQWE7UUFDZixJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyw4Q0FBOEM7UUFDOUMsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbEcsT0FBTyxJQUFBLHNCQUFjLEVBQUMsS0FBbUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVDLE9BQU8sb0JBQVksQ0FBQyxLQUFLLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJ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cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBoYW5kbGluZyBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0IHsgVHlwZWRWYWx1ZSwgdHlwZWRWYWx1ZVRvSlMsIFByb3BlcnR5VHlwZSwgU2NoZW1hLCBQcm9wZXJ0eURlZiwgVGFibGUsIEhlYWRlciwgQXR0ciwgR3FsZGJOb2RlLCBHcWxkYkVkZ2UsIEdxbGRiUGF0aCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogUmVwcmVzZW50cyBhIHNpbmdsZSByb3cgaW4gdGhlIHF1ZXJ5IHJlc3VsdCAqL1xuZXhwb3J0IGNsYXNzIFJvdyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZXM6IGFueVtdLFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlczogUHJvcGVydHlUeXBlW10gPSBbXVxuICApIHt9XG5cbiAgLyoqIEdldCB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuICBnZXQoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHtpbmRleH1gKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlc1tpbmRleF07XG4gICAgLy8gSWYgdmFsdWUgaXMgYSBUeXBlZFZhbHVlIG9iamVjdCwgY29udmVydCBpdFxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZSAmJiAnZGF0YScgaW4gdmFsdWUgJiYgJ2lzTnVsbCcgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlZFZhbHVlVG9KUyh2YWx1ZSBhcyBUeXBlZFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgUHJvcGVydHlUeXBlIGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbiAgZ2V0VHlwZShpbmRleDogbnVtYmVyKTogUHJvcGVydHlUeXBlIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudHlwZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gUHJvcGVydHlUeXBlLlVOU0VUO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50eXBlc1tpbmRleF07XG4gIH1cblxuICAvKiogR2V0IHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4IGFzIGEgc3RyaW5nICovXG4gIGdldFN0cmluZyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldChpbmRleCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4IGFzIGEgbnVtYmVyICovXG4gIGdldE51bWJlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldChpbmRleCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSByZXR1cm4gdmFsO1xuICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgIGlmIChpc05hTihudW0pKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dHlwZW9mIHZhbH0gdG8gbnVtYmVyYCk7XG4gICAgcmV0dXJuIG51bTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggYXMgYSBib29sZWFuICovXG4gIGdldEJvb2xlYW4oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0KGluZGV4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dHlwZW9mIHZhbH0gdG8gYm9vbGVhbmApO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBjb2x1bW4ncyBkYXRhIGZyb20gdGhlIHJlc3BvbnNlLlxuICogQWxsb3dzIGNoYWluaW5nIG9wZXJhdGlvbnMgbGlrZSByZXNwLmFsaWFzKFwiblwiKS5hc05vZGVzKCkgb3IgcmVzcC5nZXQoMCkuYXNOb2RlcygpLlxuICovXG5leHBvcnQgY2xhc3MgQWxpYXNSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsaWFzTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29sdW1uSWR4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZTogUmVzcG9uc2VcbiAgKSB7fVxuXG4gIC8qKiBHZXQgdGhlIGFsaWFzIG5hbWUgKi9cbiAgZ2V0IGFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWxpYXNOYW1lO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY29sdW1uIGluZGV4ICovXG4gIGdldCBjb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbklkeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IG5vZGVzIGZyb20gdGhlIGFsaWFzZWQgY29sdW1uIHdpdGggc2NoZW1hIGluZm8uXG4gICAqIFRocm93cyBUeXBlRXJyb3IgaWYgdGhlIGNvbHVtbiBjb250YWlucyBub24tTk9ERSB0eXBlcy5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE5vZGUodmFsOiBhbnksIG5vZGVzOiBOb2RlW10sIHNjaGVtYXM6IE1hcDxzdHJpbmcsIFNjaGVtYT4pOiB2b2lkIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwuaWQgPT09ICdzdHJpbmcnICYmICdsYWJlbHMnIGluIHZhbCkge1xuICAgICAgY29uc3Qgbm9kZTogTm9kZSA9IHtcbiAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgbGFiZWxzOiB2YWwubGFiZWxzIHx8IFtdLFxuICAgICAgICBwcm9wZXJ0aWVzOiB2YWwucHJvcGVydGllcyB8fCB7fSxcbiAgICAgIH07XG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBub2RlLmxhYmVscykge1xuICAgICAgICBpZiAoIXNjaGVtYXMuaGFzKGxhYmVsKSkge1xuICAgICAgICAgIHNjaGVtYXMuc2V0KGxhYmVsLCB0aGlzLmJ1aWxkU2NoZW1hRnJvbU5vZGUobGFiZWwsIG5vZGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdEVkZ2UodmFsOiBhbnksIGVkZ2VzOiBFZGdlW10sIHNjaGVtYXM6IE1hcDxzdHJpbmcsIFNjaGVtYT4pOiB2b2lkIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwuaWQgPT09ICdzdHJpbmcnICYmICdsYWJlbCcgaW4gdmFsKSB7XG4gICAgICBjb25zdCBlZGdlOiBFZGdlID0ge1xuICAgICAgICBpZDogdmFsLmlkLFxuICAgICAgICBsYWJlbDogdmFsLmxhYmVsIHx8ICcnLFxuICAgICAgICBmcm9tTm9kZUlkOiB2YWwuZnJvbU5vZGVJZCB8fCAnJyxcbiAgICAgICAgdG9Ob2RlSWQ6IHZhbC50b05vZGVJZCB8fCAnJyxcbiAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICB9O1xuICAgICAgZWRnZXMucHVzaChlZGdlKTtcbiAgICAgIGlmIChlZGdlLmxhYmVsICYmICFzY2hlbWFzLmhhcyhlZGdlLmxhYmVsKSkge1xuICAgICAgICBzY2hlbWFzLnNldChlZGdlLmxhYmVsLCB0aGlzLmJ1aWxkU2NoZW1hRnJvbUVkZ2UoZWRnZS5sYWJlbCwgZWRnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IG5vZGVzIGZyb20gdGhlIGFsaWFzZWQgY29sdW1uIHdpdGggc2NoZW1hIGluZm8uXG4gICAqIFN1cHBvcnRzIGJvdGggZGlyZWN0IE5PREUgY29sdW1ucyBhbmQgTElTVCBvZiBOT0RFIGNvbHVtbnNcbiAgICogKGUuZy4sIGdyb3VwIHZhcmlhYmxlcyBmcm9tIHF1YW50aWZpZWQgcGF0dGVybnMpLlxuICAgKi9cbiAgYXNOb2RlcygpOiBOb2RlUmVzdWx0IHtcbiAgICBjb25zdCBub2RlczogTm9kZVtdID0gW107XG4gICAgY29uc3Qgc2NoZW1hcyA9IG5ldyBNYXA8c3RyaW5nLCBTY2hlbWE+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJlc3BvbnNlLnJvd3MpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbklkeCA+PSByb3cudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGl0ZW1UeXBlID0gcm93LmdldFR5cGUodGhpcy5jb2x1bW5JZHgpO1xuICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW3RoaXMuY29sdW1uSWR4XTtcbiAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLlVOU0VUICYmIHJhd1ZhbHVlICYmIHR5cGVvZiByYXdWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIHJhd1ZhbHVlKSB7XG4gICAgICAgIGl0ZW1UeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyYXdWYWx1ZSB8fCAodHlwZW9mIHJhd1ZhbHVlID09PSAnb2JqZWN0JyAmJiAnaXNOdWxsJyBpbiByYXdWYWx1ZSAmJiByYXdWYWx1ZS5pc051bGwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5OT0RFKSB7XG4gICAgICAgIHRoaXMuY29sbGVjdE5vZGUocm93LmdldCh0aGlzLmNvbHVtbklkeCksIG5vZGVzLCBzY2hlbWFzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5MSVNUKSB7XG4gICAgICAgIC8vIExJU1Qgb2YgTk9ERSAoZ3JvdXAgdmFyaWFibGUgZnJvbSBxdWFudGlmaWVkIHBhdHRlcm4pXG4gICAgICAgIGNvbnN0IGxpc3QgPSByb3cuZ2V0KHRoaXMuY29sdW1uSWR4KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdCkge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0Tm9kZShpdGVtLCBub2Rlcywgc2NoZW1hcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBUeXBlIG1pc21hdGNoOiBjb2x1bW4gJyR7dGhpcy5hbGlhc05hbWV9JyAoaW5kZXggJHt0aGlzLmNvbHVtbklkeH0pIGNvbnRhaW5zICR7UHJvcGVydHlUeXBlW2l0ZW1UeXBlXX0sIGV4cGVjdGVkIE5PREUgb3IgTElTVCBvZiBOT0RFYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vZGVzLCBzY2hlbWFzIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBlZGdlcyBmcm9tIHRoZSBhbGlhc2VkIGNvbHVtbiB3aXRoIHNjaGVtYSBpbmZvLlxuICAgKiBTdXBwb3J0cyBib3RoIGRpcmVjdCBFREdFIGNvbHVtbnMgYW5kIExJU1Qgb2YgRURHRSBjb2x1bW5zXG4gICAqIChlLmcuLCBncm91cCB2YXJpYWJsZXMgZnJvbSBxdWFudGlmaWVkIHBhdHRlcm5zKS5cbiAgICovXG4gIGFzRWRnZXMoKTogRWRnZVJlc3VsdCB7XG4gICAgY29uc3QgZWRnZXM6IEVkZ2VbXSA9IFtdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5JZHggPj0gcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBpdGVtVHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93LnZhbHVlc1t0aGlzLmNvbHVtbklkeF07XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICBpdGVtVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmF3VmFsdWUgfHwgKHR5cGVvZiByYXdWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2lzTnVsbCcgaW4gcmF3VmFsdWUgJiYgcmF3VmFsdWUuaXNOdWxsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuRURHRSkge1xuICAgICAgICB0aGlzLmNvbGxlY3RFZGdlKHJvdy5nZXQodGhpcy5jb2x1bW5JZHgpLCBlZGdlcywgc2NoZW1hcyk7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuTElTVCkge1xuICAgICAgICAvLyBMSVNUIG9mIEVER0UgKGdyb3VwIHZhcmlhYmxlIGZyb20gcXVhbnRpZmllZCBwYXR0ZXJuKVxuICAgICAgICBjb25zdCBsaXN0ID0gcm93LmdldCh0aGlzLmNvbHVtbklkeCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdEVkZ2UoaXRlbSwgZWRnZXMsIHNjaGVtYXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgVHlwZSBtaXNtYXRjaDogY29sdW1uICcke3RoaXMuYWxpYXNOYW1lfScgKGluZGV4ICR7dGhpcy5jb2x1bW5JZHh9KSBjb250YWlucyAke1Byb3BlcnR5VHlwZVtpdGVtVHlwZV19LCBleHBlY3RlZCBFREdFIG9yIExJU1Qgb2YgRURHRWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBlZGdlcywgc2NoZW1hcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgcGF0aHMgZnJvbSB0aGUgYWxpYXNlZCBjb2x1bW4uXG4gICAqIFRocm93cyBUeXBlRXJyb3IgaWYgdGhlIGNvbHVtbiBjb250YWlucyBub24tUEFUSCB0eXBlcy5cbiAgICovXG4gIGFzUGF0aHMoKTogUGF0aFtdIHtcbiAgICBjb25zdCBwYXRoczogUGF0aFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJlc3BvbnNlLnJvd3MpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbklkeCA+PSByb3cudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdHlwZSBmcm9tIHR5cGVzIGFycmF5IG9yIGZyb20gVHlwZWRWYWx1ZSBvYmplY3RcbiAgICAgIGxldCBpdGVtVHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93LnZhbHVlc1t0aGlzLmNvbHVtbklkeF07XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICBpdGVtVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgbnVsbCB2YWx1ZXNcbiAgICAgIGlmICghcmF3VmFsdWUgfHwgKHR5cGVvZiByYXdWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2lzTnVsbCcgaW4gcmF3VmFsdWUgJiYgcmF3VmFsdWUuaXNOdWxsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSBjaGVja2luZzogbXVzdCBiZSBQQVRIIHR5cGVcbiAgICAgIGlmIChpdGVtVHlwZSAhPT0gUHJvcGVydHlUeXBlLlBBVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgVHlwZSBtaXNtYXRjaDogY29sdW1uICcke3RoaXMuYWxpYXNOYW1lfScgKGluZGV4ICR7dGhpcy5jb2x1bW5JZHh9KSBjb250YWlucyAke1Byb3BlcnR5VHlwZVtpdGVtVHlwZV19LCBleHBlY3RlZCBQQVRIYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IFR5cGVkVmFsdWUgdG8gR3FsZGJQYXRoXG4gICAgICBjb25zdCB2YWwgPSByb3cuZ2V0KHRoaXMuY29sdW1uSWR4KSBhcyBHcWxkYlBhdGg7XG4gICAgICBpZiAodmFsICYmIEFycmF5LmlzQXJyYXkodmFsLm5vZGVzKSkge1xuICAgICAgICAvLyBDb252ZXJ0IEdxbGRiTm9kZS9HcWxkYkVkZ2UgdG8gTm9kZS9FZGdlXG4gICAgICAgIGNvbnN0IG5vZGVzOiBOb2RlW10gPSAodmFsLm5vZGVzIHx8IFtdKS5tYXAoKG46IEdxbGRiTm9kZSkgPT4gKHtcbiAgICAgICAgICBpZDogbi5pZCB8fCAnJyxcbiAgICAgICAgICBsYWJlbHM6IG4ubGFiZWxzIHx8IFtdLFxuICAgICAgICAgIHByb3BlcnRpZXM6IG4ucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBlZGdlczogRWRnZVtdID0gKHZhbC5lZGdlcyB8fCBbXSkubWFwKChlOiBHcWxkYkVkZ2UpID0+ICh7XG4gICAgICAgICAgaWQ6IGUuaWQgfHwgJycsXG4gICAgICAgICAgbGFiZWw6IGUubGFiZWwgfHwgJycsXG4gICAgICAgICAgZnJvbU5vZGVJZDogZS5mcm9tTm9kZUlkIHx8ICcnLFxuICAgICAgICAgIHRvTm9kZUlkOiBlLnRvTm9kZUlkIHx8ICcnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IGUucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgfSkpO1xuICAgICAgICBwYXRocy5wdXNoKHsgbm9kZXMsIGVkZ2VzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSBhbGlhc2VkIGNvbHVtbiB0byBhIHNpbmdsZS1jb2x1bW4gdGFibGUgKi9cbiAgYXNUYWJsZSgpOiBUYWJsZSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlyc3Qgbm9uLW51bGwgdmFsdWUgaXMgYSBHcWxkYlRhYmxlIOKAlCBpZiBzbywgdW53cmFwIGl0XG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5JZHggPCByb3cudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuVEFCTEUpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSByb3cuZ2V0KHRoaXMuY29sdW1uSWR4KSBhcyBhbnk7XG4gICAgICAgICAgaWYgKHZhbCAmJiAnY29sdW1ucycgaW4gdmFsICYmICdyb3dzJyBpbiB2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVud3JhcEdxbGRiVGFibGUodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrOyAvLyBvbmx5IGNoZWNrIGZpcnN0IHJvd1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBnZW5lcmljIHNpbmdsZS1jb2x1bW4gdGFibGVcbiAgICBjb25zdCBoZWFkZXJzOiBIZWFkZXJbXSA9IFt7XG4gICAgICBuYW1lOiB0aGlzLmFsaWFzTmFtZSxcbiAgICAgIHR5cGU6IFByb3BlcnR5VHlwZS5VTlNFVCxcbiAgICB9XTtcblxuICAgIGlmICh0aGlzLnJlc3BvbnNlLnJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbklkeCA8IHJvdy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgICAgICBpZiAodHlwZSAhPT0gUHJvcGVydHlUeXBlLlVOU0VUKSB7XG4gICAgICAgICAgICBoZWFkZXJzWzBdLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVSb3dzOiBhbnlbXVtdID0gdGhpcy5yZXNwb25zZS5yb3dzLm1hcChyb3cgPT4ge1xuICAgICAgaWYgKHRoaXMuY29sdW1uSWR4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3cuZ2V0KHRoaXMuY29sdW1uSWR4KV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW251bGxdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgbmFtZTogJycsIGhlYWRlcnMsIHJvd3M6IHRhYmxlUm93cyB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1bndyYXBHcWxkYlRhYmxlKGd0OiB7IGNvbHVtbnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH0pOiBUYWJsZSB7XG4gICAgY29uc3QgaGVhZGVyczogSGVhZGVyW10gPSBndC5jb2x1bW5zLm1hcCgoY29sLCBpKSA9PiB7XG4gICAgICBsZXQgY29sVHlwZSA9IFByb3BlcnR5VHlwZS5VTlNFVDtcbiAgICAgIGlmIChndC5yb3dzLmxlbmd0aCA+IDAgJiYgaSA8IGd0LnJvd3NbMF0ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHYgPSBndC5yb3dzWzBdW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInKSBjb2xUeXBlID0gTnVtYmVyLmlzSW50ZWdlcih2KSA/IFByb3BlcnR5VHlwZS5JTlQ2NCA6IFByb3BlcnR5VHlwZS5ET1VCTEU7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgY29sVHlwZSA9IFByb3BlcnR5VHlwZS5TVFJJTkc7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuQk9PTDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG5hbWU6IGNvbCwgdHlwZTogY29sVHlwZSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7IG5hbWU6IHRoaXMuYWxpYXNOYW1lLCBoZWFkZXJzLCByb3dzOiBndC5yb3dzIH07XG4gIH1cblxuICAvKiogRXh0cmFjdCBzY2FsYXIgb3IgbGlzdCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIGFsaWFzZWQgY29sdW1uICovXG4gIGFzQXR0cigpOiBBdHRyIHtcbiAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gW107XG4gICAgbGV0IGF0dHJUeXBlID0gUHJvcGVydHlUeXBlLlVOU0VUO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5JZHggPCByb3cudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAvLyBUcnkgdG8gZ2V0IHR5cGUgZnJvbSByb3cudHlwZXMgZmlyc3QsIHRoZW4gZnJvbSBUeXBlZFZhbHVlIG9iamVjdFxuICAgICAgICBpZiAoYXR0clR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCkge1xuICAgICAgICAgIGF0dHJUeXBlID0gcm93LmdldFR5cGUodGhpcy5jb2x1bW5JZHgpO1xuICAgICAgICAgIGlmIChhdHRyVHlwZSA9PT0gUHJvcGVydHlUeXBlLlVOU0VUKSB7XG4gICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJvdy52YWx1ZXNbdGhpcy5jb2x1bW5JZHhdO1xuICAgICAgICAgICAgaWYgKHJhd1ZhbHVlICYmIHR5cGVvZiByYXdWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIHJhd1ZhbHVlKSB7XG4gICAgICAgICAgICAgIGF0dHJUeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3cuZ2V0KHRoaXMuY29sdW1uSWR4KTsgIC8vIFVzZSBnZXQoKSB0byBjb252ZXJ0IFR5cGVkVmFsdWVcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5hbWU6IHRoaXMuYWxpYXNOYW1lLCB0eXBlOiBhdHRyVHlwZSwgdmFsdWVzIH07XG4gIH1cblxuICAvKiogRXh0cmFjdCByYXcgSmF2YVNjcmlwdCB2YWx1ZXMgZnJvbSB0aGUgYWxpYXNlZCBjb2x1bW4gKi9cbiAgYXNWYWx1ZXMoKTogYW55W10ge1xuICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucmVzcG9uc2Uucm93cykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uSWR4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVzLnB1c2gocm93LmdldCh0aGlzLmNvbHVtbklkeCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kc1xuXG4gIHByaXZhdGUgYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbDogc3RyaW5nLCBub2RlOiBOb2RlKTogU2NoZW1hIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlZltdID0gT2JqZWN0LmVudHJpZXMobm9kZS5wcm9wZXJ0aWVzKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdGhpcy5pbmZlclByb3BlcnR5VHlwZSh2YWx1ZSksXG4gICAgfSkpO1xuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsLCBwcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2NoZW1hRnJvbUVkZ2UobGFiZWw6IHN0cmluZywgZWRnZTogRWRnZSk6IFNjaGVtYSB7XG4gICAgY29uc3QgcHJvcGVydGllczogUHJvcGVydHlEZWZbXSA9IE9iamVjdC5lbnRyaWVzKGVkZ2UucHJvcGVydGllcykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHRoaXMuaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWUpLFxuICAgIH0pKTtcbiAgICByZXR1cm4geyBuYW1lOiBsYWJlbCwgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbmZlclByb3BlcnR5VHlwZSh2YWx1ZTogYW55KTogUHJvcGVydHlUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFByb3BlcnR5VHlwZS5OVUxMO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIFByb3BlcnR5VHlwZS5CT09MO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFByb3BlcnR5VHlwZS5TVFJJTkc7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuQkxPQjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuTElTVDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIFByb3BlcnR5VHlwZS5NQVA7XG4gICAgcmV0dXJuIFByb3BlcnR5VHlwZS5VTlNFVDtcbiAgfVxufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGEgR1FMIHF1ZXJ5ICovXG5leHBvcnQgY2xhc3MgUmVzcG9uc2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uczogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IHJvd3M6IFJvd1tdLFxuICAgIHB1YmxpYyByZWFkb25seSByb3dDb3VudDogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSBoYXNNb3JlOiBib29sZWFuLFxuICAgIHB1YmxpYyByZWFkb25seSB3YXJuaW5nczogc3RyaW5nW10sXG4gICAgcHVibGljIHJlYWRvbmx5IHJvd3NBZmZlY3RlZDogbnVtYmVyID0gMCxcbiAgICAvKipcbiAgICAgKiBTZXNzaW9uJ3MgY3VycmVudCBncmFwaCBhZnRlciB0aGlzIFJQQyBleGVjdXRlZCwgYXMgYXV0aG9yaXRhdGl2ZWx5XG4gICAgICogcmVwb3J0ZWQgYnkgdGhlIHNlcnZlci4gQWx3YXlzIHBvcHVsYXRlZCBvbiBzdWNjZXNzIGFnYWluc3QgbmV3XG4gICAgICogc2VydmVycyAoY292ZXJzIHNpbmdsZS9jb21wb3VuZCBVU0UgR1JBUEggYXQgYW55IHBvc2l0aW9uLFxuICAgICAqIGxhc3Qtd3JpdGUtd2lucykuIEVtcHR5IHdoZW4gcnVubmluZyBhZ2FpbnN0IGEgcHJlLWZpeCBzZXJ2ZXIsIGluXG4gICAgICogd2hpY2ggY2FzZSB0aGUgZHJpdmVyIGZhbGxzIGJhY2sgdG8gaXRzIFVTRSBHUkFQSCB0ZXh0LXBhcnNpbmcgcGF0aFxuICAgICAqIGludGVybmFsbHkgdG8ga2VlcCB0aGUgbG9jYWwgZGVmYXVsdC1ncmFwaCBjYWNoZSBpbiBzeW5jLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjdXJyZW50R3JhcGg6IHN0cmluZyA9ICcnXG4gICkge31cblxuICAvKiogQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBubyByb3dzICovXG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogR2V0IHRoZSBmaXJzdCByb3cgKi9cbiAgZmlyc3QoKTogUm93IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzWzBdO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbGFzdCByb3cgKi9cbiAgbGFzdCgpOiBSb3cgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgdmFsdWUgZm9yIGEgY29sdW1uIGJ5IG5hbWUgKi9cbiAgZ2V0QnlOYW1lKHJvdzogUm93LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiByb3cuZ2V0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBJdGVyYXRlIG92ZXIgYWxsIHJvd3Mgd2l0aCBhIGNhbGxiYWNrICovXG4gIGZvckVhY2goZm46IChyb3c6IFJvdywgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucm93cy5mb3JFYWNoKGZuKTtcbiAgfVxuXG4gIC8qKiBUcmFuc2Zvcm0gZWFjaCByb3cgdXNpbmcgYSBjYWxsYmFjayAqL1xuICBtYXA8VD4oZm46IChyb3c6IFJvdykgPT4gVCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5tYXAoZm4pO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGFuIGFycmF5IG9mIG9iamVjdHMgKi9cbiAgdG9PYmplY3RzKCk6IFJlY29yZDxzdHJpbmcsIGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5tYXAocm93ID0+IHtcbiAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbCwgaSkgPT4ge1xuICAgICAgICAvLyBBZGQgYm91bmRhcnkgY2hlY2sgdG8gaGFuZGxlIG1pc21hdGNoZWQgY29sdW1ucy92YWx1ZXNcbiAgICAgICAgb2JqW2NvbF0gPSBpIDwgcm93LnZhbHVlcy5sZW5ndGggPyByb3cuZ2V0KGkpIDogbnVsbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBKU09OICovXG4gIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0cygpKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNpbmdsZSB2YWx1ZSBmcm9tIGEgc2luZ2xlLXJvdywgc2luZ2xlLWNvbHVtbiByZXNwb25zZSAqL1xuICBzaW5nbGVWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc2luZ2xlIHJvdywgZ290ICR7dGhpcy5yb3dzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93c1swXS52YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHNpbmdsZSBjb2x1bW4sIGdvdCAke3RoaXMucm93c1swXS52YWx1ZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb3dzWzBdLmdldCgwKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNpbmdsZSBudW1iZXIgdmFsdWUgKi9cbiAgc2luZ2xlTnVtYmVyKCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5zaW5nbGVWYWx1ZSgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICBpZiAoaXNOYU4obnVtKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAke3R5cGVvZiB2YWx9IHRvIG51bWJlcmApO1xuICAgIHJldHVybiBudW07XG4gIH1cblxuICAvKiogR2V0IHRoZSBzaW5nbGUgc3RyaW5nIHZhbHVlICovXG4gIHNpbmdsZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuc2luZ2xlVmFsdWUoKTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgfVxuXG4gIC8qKiBJdGVyYXRvciBzdXBwb3J0ICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFJvdz4ge1xuICAgIHJldHVybiB0aGlzLnJvd3NbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIHJvd3MgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBBbGlhc1Jlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gbmFtZS5cbiAgICogVXNlIHRoaXMgdG8gZXh0cmFjdCBkYXRhIGZyb20gYSBzcGVjaWZpYyBjb2x1bW4gYnkgbmFtZS5cbiAgICogRXhhbXBsZTogcmVzcC5hbGlhcyhcIm5cIikuYXNOb2RlcygpXG4gICAqL1xuICBhbGlhcyhjb2x1bW5OYW1lOiBzdHJpbmcpOiBBbGlhc1Jlc3VsdCB7XG4gICAgY29uc3QgY29sSWR4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGNvbElkeCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uIGFsaWFzIG5vdCBmb3VuZDogJHtjb2x1bW5OYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFsaWFzUmVzdWx0KGNvbHVtbk5hbWUsIGNvbElkeCwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIEFsaWFzUmVzdWx0IGZvciB0aGUgY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAqIFVzZSB0aGlzIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGEgc3BlY2lmaWMgY29sdW1uIGJ5IGluZGV4LlxuICAgKiBFeGFtcGxlOiByZXNwLmdldCgwKS5hc05vZGVzKClcbiAgICovXG4gIGdldChpbmRleDogbnVtYmVyKTogQWxpYXNSZXN1bHQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke2luZGV4fSAodG90YWw6ICR7dGhpcy5jb2x1bW5zLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWxpYXNSZXN1bHQodGhpcy5jb2x1bW5zW2luZGV4XSwgaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhbGlhcygpIG9yIGdldCgpIGluc3RlYWQuIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKiBFeHRyYWN0IG5vZGVzIGZyb20gcmVzcG9uc2Ugd2l0aCBzY2hlbWEgaW5mby5cbiAgICogU3VwcG9ydHMgYm90aCBOT0RFIGFuZCBMSVNUIG9mIE5PREUgY29sdW1ucy5cbiAgICovXG4gIGFzTm9kZXMoKTogTm9kZVJlc3VsdCB7XG4gICAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hPigpO1xuXG4gICAgY29uc3QgY29sbGVjdE5vZGUgPSAodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbC5pZCA9PT0gJ3N0cmluZycgJiYgJ2xhYmVscycgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgICBsYWJlbHM6IHZhbC5sYWJlbHMgfHwgW10sXG4gICAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH07XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2Ygbm9kZS5sYWJlbHMpIHtcbiAgICAgICAgICBpZiAoIXNjaGVtYXMuaGFzKGxhYmVsKSkge1xuICAgICAgICAgICAgc2NoZW1hcy5zZXQobGFiZWwsIHRoaXMuYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbCwgbm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZShpKTtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2ldO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgIGl0ZW1UeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLk5PREUpIHtcbiAgICAgICAgICBjb2xsZWN0Tm9kZShyb3cuZ2V0KGkpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLkxJU1QpIHtcbiAgICAgICAgICBjb25zdCBsaXN0ID0gcm93LmdldChpKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgY29sbGVjdE5vZGUoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbm9kZXMsIHNjaGVtYXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYWxpYXMoKSBvciBnZXQoKSBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogRXh0cmFjdCBlZGdlcyBmcm9tIHJlc3BvbnNlIHdpdGggc2NoZW1hIGluZm8uXG4gICAqIFN1cHBvcnRzIGJvdGggRURHRSBhbmQgTElTVCBvZiBFREdFIGNvbHVtbnMuXG4gICAqL1xuICBhc0VkZ2VzKCk6IEVkZ2VSZXN1bHQge1xuICAgIGNvbnN0IGVkZ2VzOiBFZGdlW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIFNjaGVtYT4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3RFZGdlID0gKHZhbDogYW55KSA9PiB7XG4gICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwuaWQgPT09ICdzdHJpbmcnICYmICdsYWJlbCcgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XG4gICAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgICBsYWJlbDogdmFsLmxhYmVsIHx8ICcnLFxuICAgICAgICAgIGZyb21Ob2RlSWQ6IHZhbC5mcm9tTm9kZUlkIHx8ICcnLFxuICAgICAgICAgIHRvTm9kZUlkOiB2YWwudG9Ob2RlSWQgfHwgJycsXG4gICAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH07XG4gICAgICAgIGVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgIGlmIChlZGdlLmxhYmVsICYmICFzY2hlbWFzLmhhcyhlZGdlLmxhYmVsKSkge1xuICAgICAgICAgIHNjaGVtYXMuc2V0KGVkZ2UubGFiZWwsIHRoaXMuYnVpbGRTY2hlbWFGcm9tRWRnZShlZGdlLmxhYmVsLCBlZGdlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGl0ZW1UeXBlID0gcm93LmdldFR5cGUoaSk7XG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93LnZhbHVlc1tpXTtcbiAgICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQgJiYgcmF3VmFsdWUgJiYgdHlwZW9mIHJhd1ZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gcmF3VmFsdWUpIHtcbiAgICAgICAgICBpdGVtVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5FREdFKSB7XG4gICAgICAgICAgY29sbGVjdEVkZ2Uocm93LmdldChpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5MSVNUKSB7XG4gICAgICAgICAgY29uc3QgbGlzdCA9IHJvdy5nZXQoaSk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgIGNvbGxlY3RFZGdlKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGVkZ2VzLCBzY2hlbWFzIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGFsaWFzKCkgb3IgZ2V0KCkgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIEV4dHJhY3QgcGF0aHMgZnJvbSByZXNwb25zZS5cbiAgICogUGF0aHMgYXJlIGlkZW50aWZpZWQgYnkgUHJvcGVydHlUeXBlLlBBVEggdHlwZSBpbiB0aGUgVHlwZWRWYWx1ZS5cbiAgICovXG4gIGFzUGF0aHMoKTogUGF0aFtdIHtcbiAgICBjb25zdCBwYXRoczogUGF0aFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDaGVjayB0eXBlIGZyb20gdHlwZXMgYXJyYXkgb3IgZnJvbSBUeXBlZFZhbHVlIG9iamVjdFxuICAgICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZShpKTtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2ldO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgIGl0ZW1UeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLlBBVEgpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IFR5cGVkVmFsdWUgdG8gR3FsZGJQYXRoXG4gICAgICAgICAgY29uc3QgdmFsID0gcm93LmdldChpKSBhcyBHcWxkYlBhdGg7XG4gICAgICAgICAgaWYgKHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbC5ub2RlcykpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgR3FsZGJOb2RlL0dxbGRiRWRnZSB0byBOb2RlL0VkZ2VcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzOiBOb2RlW10gPSAodmFsLm5vZGVzIHx8IFtdKS5tYXAoKG46IEdxbGRiTm9kZSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IG4uaWQgfHwgJycsXG4gICAgICAgICAgICAgIGxhYmVsczogbi5sYWJlbHMgfHwgW10sXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IG4ucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VzOiBFZGdlW10gPSAodmFsLmVkZ2VzIHx8IFtdKS5tYXAoKGU6IEdxbGRiRWRnZSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IGUuaWQgfHwgJycsXG4gICAgICAgICAgICAgIGxhYmVsOiBlLmxhYmVsIHx8ICcnLFxuICAgICAgICAgICAgICBmcm9tTm9kZUlkOiBlLmZyb21Ob2RlSWQgfHwgJycsXG4gICAgICAgICAgICAgIHRvTm9kZUlkOiBlLnRvTm9kZUlkIHx8ICcnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBlLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKHsgbm9kZXMsIGVkZ2VzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYWxpYXMoKSBvciBnZXQoKSBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogUmV0dXJuIHJlc3BvbnNlIGFzIGdlbmVyaWMgdGFibGUuXG4gICAqIElmIHJlc3BvbnNlIGlzIGEgc2luZ2xlIFRBQkxFIGNvbHVtbiwgdW53cmFwcyB0aGUgR3FsZGJUYWJsZSBpbnRvIHByb3BlciBoZWFkZXJzL3Jvd3MuXG4gICAqL1xuICBhc1RhYmxlKCk6IFRhYmxlIHtcbiAgICAvLyBJZiBzaW5nbGUgY29sdW1uIG9mIFRBQkxFIHR5cGUsIHVud3JhcCBHcWxkYlRhYmxlXG4gICAgaWYgKHRoaXMuY29sdW1ucy5sZW5ndGggPT09IDEgJiYgdGhpcy5yb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdGhpcy5yb3dzWzBdLmdldFR5cGUoMCk7XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5UQUJMRSkge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnJvd3NbMF0uZ2V0KDApIGFzIGFueTtcbiAgICAgICAgaWYgKHZhbCAmJiAnY29sdW1ucycgaW4gdmFsICYmICdyb3dzJyBpbiB2YWwpIHtcbiAgICAgICAgICBjb25zdCBndCA9IHZhbCBhcyB7IGNvbHVtbnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH07XG4gICAgICAgICAgY29uc3QgaGVhZGVyczogSGVhZGVyW10gPSBndC5jb2x1bW5zLm1hcCgoY29sOiBzdHJpbmcsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuVU5TRVQ7XG4gICAgICAgICAgICBpZiAoZ3Qucm93cy5sZW5ndGggPiAwICYmIGkgPCBndC5yb3dzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB2ID0gZ3Qucm93c1swXVtpXTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgY29sVHlwZSA9IE51bWJlci5pc0ludGVnZXIodikgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuU1RSSU5HO1xuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nKSBjb2xUeXBlID0gUHJvcGVydHlUeXBlLkJPT0w7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBjb2wsIHR5cGU6IGNvbFR5cGUgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiB0aGlzLmNvbHVtbnNbMF0sIGhlYWRlcnMsIHJvd3M6IGd0LnJvd3MgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBnZW5lcmljIG11bHRpLWNvbHVtbiB0YWJsZVxuICAgIGNvbnN0IGhlYWRlcnM6IEhlYWRlcltdID0gdGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gKHtcbiAgICAgIG5hbWU6IGNvbCxcbiAgICAgIHR5cGU6IFByb3BlcnR5VHlwZS5VTlNFVCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCB0YWJsZVJvd3M6IGFueVtdW10gPSB0aGlzLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoXywgaSkgPT4gKGkgPCByb3cudmFsdWVzLmxlbmd0aCA/IHJvdy5nZXQoaSkgOiBudWxsKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBuYW1lOiAnJywgaGVhZGVycywgcm93czogdGFibGVSb3dzIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGFsaWFzKCkgb3IgZ2V0KCkgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIEV4dHJhY3Qgc2NhbGFyIG9yIGxpc3QgYXR0cmlidXRlIHZhbHVlc1xuICAgKi9cbiAgYXNBdHRyKGNvbHVtbk5hbWU6IHN0cmluZyk6IEF0dHIge1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGNvbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGxldCBhdHRyVHlwZSA9IFByb3BlcnR5VHlwZS5VTlNFVDtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xuICAgICAgaWYgKGNvbEluZGV4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGdldCB0eXBlIGZyb20gcm93LnR5cGVzIGZpcnN0LCB0aGVuIGZyb20gVHlwZWRWYWx1ZSBvYmplY3RcbiAgICAgICAgaWYgKGF0dHJUeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQpIHtcbiAgICAgICAgICBhdHRyVHlwZSA9IHJvdy5nZXRUeXBlKGNvbEluZGV4KTtcbiAgICAgICAgICBpZiAoYXR0clR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCkge1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2NvbEluZGV4XTtcbiAgICAgICAgICAgIGlmIChyYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgICAgICBhdHRyVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LmdldChjb2xJbmRleCk7ICAvLyBVc2UgZ2V0KCkgdG8gY29udmVydCBUeXBlZFZhbHVlXG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1lOiBjb2x1bW5OYW1lLCB0eXBlOiBhdHRyVHlwZSwgdmFsdWVzIH07XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kc1xuXG4gIHByaXZhdGUgYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbDogc3RyaW5nLCBub2RlOiBOb2RlKTogU2NoZW1hIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlZltdID0gT2JqZWN0LmVudHJpZXMobm9kZS5wcm9wZXJ0aWVzKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdGhpcy5pbmZlclByb3BlcnR5VHlwZSh2YWx1ZSksXG4gICAgfSkpO1xuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsLCBwcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2NoZW1hRnJvbUVkZ2UobGFiZWw6IHN0cmluZywgZWRnZTogRWRnZSk6IFNjaGVtYSB7XG4gICAgY29uc3QgcHJvcGVydGllczogUHJvcGVydHlEZWZbXSA9IE9iamVjdC5lbnRyaWVzKGVkZ2UucHJvcGVydGllcykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHRoaXMuaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWUpLFxuICAgIH0pKTtcbiAgICByZXR1cm4geyBuYW1lOiBsYWJlbCwgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbmZlclByb3BlcnR5VHlwZSh2YWx1ZTogYW55KTogUHJvcGVydHlUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFByb3BlcnR5VHlwZS5OVUxMO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIFByb3BlcnR5VHlwZS5CT09MO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFByb3BlcnR5VHlwZS5TVFJJTkc7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuQkxPQjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuTElTVDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIFByb3BlcnR5VHlwZS5NQVA7XG4gICAgcmV0dXJuIFByb3BlcnR5VHlwZS5VTlNFVDtcbiAgfVxufVxuXG4vKiogUmVzdWx0IG9mIGFuIGluc2VydCBub2RlcyBvcGVyYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBub2RlSWRzOiBzdHJpbmdbXTtcbiAgbm9kZUNvdW50OiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFJlc3VsdCBvZiBhbiBpbnNlcnQgZWRnZXMgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydEVkZ2VzUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZWRnZUlkczogc3RyaW5nW107XG4gIGVkZ2VDb3VudDogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNraXBwZWRDb3VudDogbnVtYmVyO1xufVxuXG4vKiogUmVzdWx0IG9mIGEgZGVsZXRlIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxldGVSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkZWxldGVkQ291bnQ6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHVuaWZpZWQgRXhwb3J0IG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRDb25maWcge1xuICBncmFwaE5hbWU6IHN0cmluZztcbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICBleHBvcnROb2Rlcz86IGJvb2xlYW47XG4gIGV4cG9ydEVkZ2VzPzogYm9vbGVhbjtcbiAgbm9kZUxhYmVscz86IHN0cmluZ1tdO1xuICBlZGdlTGFiZWxzPzogc3RyaW5nW107XG4gIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKiBTdGF0aXN0aWNzIGZvciBhbiBleHBvcnQgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFN0YXRzIHtcbiAgbm9kZXNFeHBvcnRlZDogbnVtYmVyO1xuICBlZGdlc0V4cG9ydGVkOiBudW1iZXI7XG4gIGJ5dGVzV3JpdHRlbjogbnVtYmVyO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8qKiBBIGNodW5rIG9mIGV4cG9ydGVkIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0Q2h1bmsge1xuICBkYXRhOiBCdWZmZXI7XG4gIGlzRmluYWw6IGJvb2xlYW47XG4gIHN0YXRzPzogRXhwb3J0U3RhdHM7XG59XG5cbi8qKlxuICogQSBiYXRjaCBvZiBleHBvcnRlZCBub2Rlc1xuICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnROb2Rlc1Jlc3VsdCB7XG4gIG5vZGVzOiBFeHBvcnRlZE5vZGVbXTtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGJhdGNoIG9mIGV4cG9ydGVkIGVkZ2VzXG4gKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEVkZ2VzUmVzdWx0IHtcbiAgZWRnZXM6IEV4cG9ydGVkRWRnZVtdO1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgbm9kZSBleHBvcnRlZCBmcm9tIHRoZSBkYXRhYmFzZVxuICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRlZE5vZGUge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEFuIGVkZ2UgZXhwb3J0ZWQgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0ZWRFZGdlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZnJvbU5vZGVJZDogc3RyaW5nO1xuICB0b05vZGVJZDogc3RyaW5nO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIGdyYXBoIGRhdGFiYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGUge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBncmFwaCBkYXRhYmFzZSAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGdlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZnJvbU5vZGVJZDogc3RyaW5nO1xuICB0b05vZGVJZDogc3RyaW5nO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhIHBhdGggaW4gdGhlIGdyYXBoIGRhdGFiYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBub2RlczogTm9kZVtdO1xuICBlZGdlczogRWRnZVtdO1xufVxuXG4vKiogUmVzdWx0IHdyYXBwZXIgZm9yIG5vZGVzIHdpdGggc2NoZW1hIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVSZXN1bHQge1xuICBub2RlczogTm9kZVtdO1xuICBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+O1xufVxuXG4vKiogUmVzdWx0IHdyYXBwZXIgZm9yIGVkZ2VzIHdpdGggc2NoZW1hIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VSZXN1bHQge1xuICBlZGdlczogRWRnZVtdO1xuICBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+O1xufVxuIl19
847
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFFSCxtQ0FBOEk7QUFFOUk7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsR0FBRztJQVNJO0lBQ0E7SUFUbEI7Ozs7T0FJRztJQUNILFdBQVcsR0FBc0IsRUFBRSxDQUFDO0lBRXBDLFlBQ2tCLE1BQWEsRUFDYixRQUF3QixFQUFFO1FBRDFCLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFxQjtJQUN6QyxDQUFDO0lBRUosOENBQThDO0lBQzlDLEdBQUcsQ0FBQyxLQUFhO1FBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsOENBQThDO1FBQzlDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2xHLE9BQU8sSUFBQSxzQkFBYyxFQUFDLEtBQW1CLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLElBQVk7UUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxJQUFJLFdBQVcsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7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LG9CQUFZLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLG9CQUFZLENBQUMsSUFBSSxDQUFDO1FBQ25ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sb0JBQVksQ0FBQyxHQUFHLENBQUM7UUFDdkQsT0FBTyxvQkFBWSxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUF4WUQsNEJBd1lDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNwb25zZSBoYW5kbGluZyBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0IHsgVHlwZWRWYWx1ZSwgdHlwZWRWYWx1ZVRvSlMsIFByb3BlcnR5VHlwZSwgU2NoZW1hLCBQcm9wZXJ0eURlZiwgVGFibGUsIEhlYWRlciwgQXR0ciwgR3FsZGJOb2RlLCBHcWxkYkVkZ2UsIEdxbGRiUGF0aCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgcm93IGluIHRoZSBxdWVyeSByZXN1bHQuXG4gKlxuICogUG9zaXRpb25hbCBhY2Nlc3MgdmlhIGByb3cuZ2V0KGkpYCBpcyBhbHdheXMgYXZhaWxhYmxlLiBOYW1lLWJhc2VkXG4gKiBhY2Nlc3MgdmlhIGByb3cuZ2V0QnlOYW1lKG5hbWUpYCAvIGByb3cuaGFzKG5hbWUpYCByZXF1aXJlcyB0aGUgcGFyZW50XG4gKiBSZXNwb25zZSB0byBoYXZlIHBvcHVsYXRlZCB7QGxpbmsgUm93LmNvbHVtbk5hbWVzfSAoUmVzcG9uc2Unc1xuICogY29uc3RydWN0b3IgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkpLlxuICpcbiAqIFRoZSByb3cgaXMgaXRlcmFibGUg4oCUIGBmb3IgKGNvbnN0IHYgb2Ygcm93KSAuLi5gIHlpZWxkcyBkZWNvZGVkXG4gKiBjb2x1bW4gdmFsdWVzIChzYW1lIGFzIHJlcGVhdGVkIGByb3cuZ2V0KGkpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3cgaW1wbGVtZW50cyBJdGVyYWJsZTxhbnk+IHtcbiAgLyoqXG4gICAqIENvbHVtbiBuYW1lcyBmb3IgbmFtZS1iYXNlZCBhY2Nlc3MuIEluamVjdGVkIGJ5IHRoZSBwYXJlbnQgUmVzcG9uc2VcbiAgICogY29uc3RydWN0b3Igc28gdGhhdCBgcm93LmdldEJ5TmFtZSgnY29sJylgIHdvcmtzIHdpdGhvdXQgZ29pbmdcbiAgICogdGhyb3VnaCBSZXNwb25zZS5nZXRCeU5hbWUocm93LCAnY29sJykuXG4gICAqL1xuICBjb2x1bW5OYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzOiBhbnlbXSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IFByb3BlcnR5VHlwZVtdID0gW11cbiAgKSB7fVxuXG4gIC8qKiBHZXQgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbiAgZ2V0KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7aW5kZXh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZXNbaW5kZXhdO1xuICAgIC8vIElmIHZhbHVlIGlzIGEgVHlwZWRWYWx1ZSBvYmplY3QsIGNvbnZlcnQgaXRcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gdmFsdWUgJiYgJ2RhdGEnIGluIHZhbHVlICYmICdpc051bGwnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZWRWYWx1ZVRvSlModmFsdWUgYXMgVHlwZWRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIG5hbWUuIFJlcXVpcmVzIGBjb2x1bW5OYW1lc2AgdG9cbiAgICogaGF2ZSBiZWVuIHBvcHVsYXRlZCBieSB0aGUgcGFyZW50IFJlc3BvbnNlLlxuICAgKi9cbiAgZ2V0QnlOYW1lKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdyBjb2x1bW5OYW1lcyBub3QgcG9wdWxhdGVkOyBjYW5ub3QgbG9vayB1cCAnJHtuYW1lfScgYnkgbmFtZWApO1xuICAgIH1cbiAgICBjb25zdCBpZHggPSB0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uIG5vdCBmb3VuZDogJHtuYW1lfTsgYXZhaWxhYmxlOiAke3RoaXMuY29sdW1uTmFtZXMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGlkeCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm93IGtub3dzIHRoZSBnaXZlbiBjb2x1bW4gbmFtZS4gKi9cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGlzIHJvdy4gKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gIH1cblxuICAvKiogSXRlcmF0ZSBvdmVyIGRlY29kZWQgY29sdW1uIHZhbHVlcy4gKi9cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8YW55PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgeWllbGQgdGhpcy5nZXQoaSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCByZXByZXNlbnRhdGlvbi4gV2hlbiBgY29sdW1uTmFtZXNgIGlzIHBvcHVsYXRlZDpcbiAgICogICBgUm93KG5hbWUxPXZhbHVlMSwgbmFtZTI9dmFsdWUyKWBcbiAgICogT3RoZXJ3aXNlOlxuICAgKiAgIGBSb3codmFsdWUwLCB2YWx1ZTEpYFxuICAgKiBNaXJyb3JzIHRoZSBQeXRob24gZHJpdmVyJ3MgYHJlcHIocm93KWAgbGF5b3V0LlxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy5nZXQoaSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyBgJyR7dn0nYCA6IFN0cmluZyh2KTtcbiAgICAgIGlmIChpIDwgdGhpcy5jb2x1bW5OYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgcGFydHMucHVzaChgJHt0aGlzLmNvbHVtbk5hbWVzW2ldfT0ke2Zvcm1hdHRlZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2goZm9ybWF0dGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGBSb3coJHtwYXJ0cy5qb2luKCcsICcpfSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cnVjdHVyYWwgZXF1YWxpdHk6IHNhbWUgY29sdW1uIG5hbWVzIChvciBib3RoIGVtcHR5KSBBTkQgZGVjb2RlZFxuICAgKiBjb2x1bW4gdmFsdWVzIGNvbXBhcmUgZXF1YWwgcGFpcndpc2UuIE1pcnJvcnMgUHl0aG9uIGBSb3cuX19lcV9fYC5cbiAgICogVXNlcyBKU09OLnN0cmluZ2lmeSBmb3IgbmVzdGVkIHZhbHVlIGNvbXBhcmlzb24g4oCUIGFkZXF1YXRlIGZvciB0aGVcbiAgICogcHJpbWl0aXZlL29iamVjdCB0eXBlcyBkZWNvZGVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBlcXVhbHMob3RoZXI6IFJvdyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoICE9PSBvdGhlci5jb2x1bW5OYW1lcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbk5hbWVzW2ldICE9PSBvdGhlci5jb2x1bW5OYW1lc1tpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZXMubGVuZ3RoICE9PSBvdGhlci52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYSA9IHRoaXMuZ2V0KGkpO1xuICAgICAgY29uc3QgYiA9IG90aGVyLmdldChpKTtcbiAgICAgIGlmIChhID09PSBiKSBjb250aW51ZTtcbiAgICAgIGlmIChhICE9PSBhICYmIGIgIT09IGIpIGNvbnRpbnVlOyAvLyBOYU4gPT09IE5hTlxuICAgICAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhICE9PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGEpICE9PSBKU09OLnN0cmluZ2lmeShiKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIFByb3BlcnR5VHlwZSBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG4gIGdldFR5cGUoaW5kZXg6IG51bWJlcik6IFByb3BlcnR5VHlwZSB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnR5cGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFByb3BlcnR5VHlwZS5VTlNFVDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbaW5kZXhdO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCBhcyBhIHN0cmluZyAqL1xuICBnZXRTdHJpbmcoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXQoaW5kZXgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCBhcyBhIG51bWJlciAqL1xuICBnZXROdW1iZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXQoaW5kZXgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICBpZiAoaXNOYU4obnVtKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAke3R5cGVvZiB2YWx9IHRvIG51bWJlcmApO1xuICAgIHJldHVybiBudW07XG4gIH1cblxuICAvKiogR2V0IHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4IGFzIGEgYm9vbGVhbiAqL1xuICBnZXRCb29sZWFuKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldChpbmRleCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHJldHVybiB2YWw7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAke3R5cGVvZiB2YWx9IHRvIGJvb2xlYW5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgY29sdW1uJ3MgZGF0YSBmcm9tIHRoZSByZXNwb25zZS5cbiAqIEFsbG93cyBjaGFpbmluZyBvcGVyYXRpb25zIGxpa2UgcmVzcC5hbGlhcyhcIm5cIikuYXNOb2RlcygpIG9yIHJlc3AuZ2V0KDApLmFzTm9kZXMoKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzUmVzdWx0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGlhc05hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtbklkeDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICkge31cblxuICAvKiogR2V0IHRoZSBhbGlhcyBuYW1lICovXG4gIGdldCBhbGlhcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFsaWFzTmFtZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNvbHVtbiBpbmRleCAqL1xuICBnZXQgY29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5JZHg7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBub2RlcyBmcm9tIHRoZSBhbGlhc2VkIGNvbHVtbiB3aXRoIHNjaGVtYSBpbmZvLlxuICAgKiBUaHJvd3MgVHlwZUVycm9yIGlmIHRoZSBjb2x1bW4gY29udGFpbnMgbm9uLU5PREUgdHlwZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3ROb2RlKHZhbDogYW55LCBub2RlczogTm9kZVtdLCBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+KTogdm9pZCB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsLmlkID09PSAnc3RyaW5nJyAmJiAnbGFiZWxzJyBpbiB2YWwpIHtcbiAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgIGlkOiB2YWwuaWQsXG4gICAgICAgIGxhYmVsczogdmFsLmxhYmVscyB8fCBbXSxcbiAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICB9O1xuICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIGZvciAoY29uc3QgbGFiZWwgb2Ygbm9kZS5sYWJlbHMpIHtcbiAgICAgICAgaWYgKCFzY2hlbWFzLmhhcyhsYWJlbCkpIHtcbiAgICAgICAgICBzY2hlbWFzLnNldChsYWJlbCwgdGhpcy5idWlsZFNjaGVtYUZyb21Ob2RlKGxhYmVsLCBub2RlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RFZGdlKHZhbDogYW55LCBlZGdlczogRWRnZVtdLCBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+KTogdm9pZCB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsLmlkID09PSAnc3RyaW5nJyAmJiAnbGFiZWwnIGluIHZhbCkge1xuICAgICAgY29uc3QgZWRnZTogRWRnZSA9IHtcbiAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgbGFiZWw6IHZhbC5sYWJlbCB8fCAnJyxcbiAgICAgICAgZnJvbU5vZGVJZDogdmFsLmZyb21Ob2RlSWQgfHwgJycsXG4gICAgICAgIHRvTm9kZUlkOiB2YWwudG9Ob2RlSWQgfHwgJycsXG4gICAgICAgIHByb3BlcnRpZXM6IHZhbC5wcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgfTtcbiAgICAgIGVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICBpZiAoZWRnZS5sYWJlbCAmJiAhc2NoZW1hcy5oYXMoZWRnZS5sYWJlbCkpIHtcbiAgICAgICAgc2NoZW1hcy5zZXQoZWRnZS5sYWJlbCwgdGhpcy5idWlsZFNjaGVtYUZyb21FZGdlKGVkZ2UubGFiZWwsIGVkZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBub2RlcyBmcm9tIHRoZSBhbGlhc2VkIGNvbHVtbiB3aXRoIHNjaGVtYSBpbmZvLlxuICAgKiBTdXBwb3J0cyBib3RoIGRpcmVjdCBOT0RFIGNvbHVtbnMgYW5kIExJU1Qgb2YgTk9ERSBjb2x1bW5zXG4gICAqIChlLmcuLCBncm91cCB2YXJpYWJsZXMgZnJvbSBxdWFudGlmaWVkIHBhdHRlcm5zKS5cbiAgICovXG4gIGFzTm9kZXMoKTogTm9kZVJlc3VsdCB7XG4gICAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5JZHggPj0gcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBpdGVtVHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93LnZhbHVlc1t0aGlzLmNvbHVtbklkeF07XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICBpdGVtVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmF3VmFsdWUgfHwgKHR5cGVvZiByYXdWYWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2lzTnVsbCcgaW4gcmF3VmFsdWUgJiYgcmF3VmFsdWUuaXNOdWxsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuTk9ERSkge1xuICAgICAgICB0aGlzLmNvbGxlY3ROb2RlKHJvdy5nZXQodGhpcy5jb2x1bW5JZHgpLCBub2Rlcywgc2NoZW1hcyk7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuTElTVCkge1xuICAgICAgICAvLyBMSVNUIG9mIE5PREUgKGdyb3VwIHZhcmlhYmxlIGZyb20gcXVhbnRpZmllZCBwYXR0ZXJuKVxuICAgICAgICBjb25zdCBsaXN0ID0gcm93LmdldCh0aGlzLmNvbHVtbklkeCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdE5vZGUoaXRlbSwgbm9kZXMsIHNjaGVtYXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgVHlwZSBtaXNtYXRjaDogY29sdW1uICcke3RoaXMuYWxpYXNOYW1lfScgKGluZGV4ICR7dGhpcy5jb2x1bW5JZHh9KSBjb250YWlucyAke1Byb3BlcnR5VHlwZVtpdGVtVHlwZV19LCBleHBlY3RlZCBOT0RFIG9yIExJU1Qgb2YgTk9ERWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBub2Rlcywgc2NoZW1hcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZWRnZXMgZnJvbSB0aGUgYWxpYXNlZCBjb2x1bW4gd2l0aCBzY2hlbWEgaW5mby5cbiAgICogU3VwcG9ydHMgYm90aCBkaXJlY3QgRURHRSBjb2x1bW5zIGFuZCBMSVNUIG9mIEVER0UgY29sdW1uc1xuICAgKiAoZS5nLiwgZ3JvdXAgdmFyaWFibGVzIGZyb20gcXVhbnRpZmllZCBwYXR0ZXJucykuXG4gICAqL1xuICBhc0VkZ2VzKCk6IEVkZ2VSZXN1bHQge1xuICAgIGNvbnN0IGVkZ2VzOiBFZGdlW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIFNjaGVtYT4oKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucmVzcG9uc2Uucm93cykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uSWR4ID49IHJvdy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZSh0aGlzLmNvbHVtbklkeCk7XG4gICAgICBjb25zdCByYXdWYWx1ZSA9IHJvdy52YWx1ZXNbdGhpcy5jb2x1bW5JZHhdO1xuICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQgJiYgcmF3VmFsdWUgJiYgdHlwZW9mIHJhd1ZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gcmF3VmFsdWUpIHtcbiAgICAgICAgaXRlbVR5cGUgPSByYXdWYWx1ZS50eXBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJhd1ZhbHVlIHx8ICh0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICdpc051bGwnIGluIHJhd1ZhbHVlICYmIHJhd1ZhbHVlLmlzTnVsbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLkVER0UpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0RWRnZShyb3cuZ2V0KHRoaXMuY29sdW1uSWR4KSwgZWRnZXMsIHNjaGVtYXMpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLkxJU1QpIHtcbiAgICAgICAgLy8gTElTVCBvZiBFREdFIChncm91cCB2YXJpYWJsZSBmcm9tIHF1YW50aWZpZWQgcGF0dGVybilcbiAgICAgICAgY29uc3QgbGlzdCA9IHJvdy5nZXQodGhpcy5jb2x1bW5JZHgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3RFZGdlKGl0ZW0sIGVkZ2VzLCBzY2hlbWFzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYFR5cGUgbWlzbWF0Y2g6IGNvbHVtbiAnJHt0aGlzLmFsaWFzTmFtZX0nIChpbmRleCAke3RoaXMuY29sdW1uSWR4fSkgY29udGFpbnMgJHtQcm9wZXJ0eVR5cGVbaXRlbVR5cGVdfSwgZXhwZWN0ZWQgRURHRSBvciBMSVNUIG9mIEVER0VgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZWRnZXMsIHNjaGVtYXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHBhdGhzIGZyb20gdGhlIGFsaWFzZWQgY29sdW1uLlxuICAgKiBUaHJvd3MgVHlwZUVycm9yIGlmIHRoZSBjb2x1bW4gY29udGFpbnMgbm9uLVBBVEggdHlwZXMuXG4gICAqL1xuICBhc1BhdGhzKCk6IFBhdGhbXSB7XG4gICAgY29uc3QgcGF0aHM6IFBhdGhbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yZXNwb25zZS5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5JZHggPj0gcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHR5cGUgZnJvbSB0eXBlcyBhcnJheSBvciBmcm9tIFR5cGVkVmFsdWUgb2JqZWN0XG4gICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZSh0aGlzLmNvbHVtbklkeCk7XG4gICAgICBjb25zdCByYXdWYWx1ZSA9IHJvdy52YWx1ZXNbdGhpcy5jb2x1bW5JZHhdO1xuICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQgJiYgcmF3VmFsdWUgJiYgdHlwZW9mIHJhd1ZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gcmF3VmFsdWUpIHtcbiAgICAgICAgaXRlbVR5cGUgPSByYXdWYWx1ZS50eXBlO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIG51bGwgdmFsdWVzXG4gICAgICBpZiAoIXJhd1ZhbHVlIHx8ICh0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICdpc051bGwnIGluIHJhd1ZhbHVlICYmIHJhd1ZhbHVlLmlzTnVsbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgY2hlY2tpbmc6IG11c3QgYmUgUEFUSCB0eXBlXG4gICAgICBpZiAoaXRlbVR5cGUgIT09IFByb3BlcnR5VHlwZS5QQVRIKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYFR5cGUgbWlzbWF0Y2g6IGNvbHVtbiAnJHt0aGlzLmFsaWFzTmFtZX0nIChpbmRleCAke3RoaXMuY29sdW1uSWR4fSkgY29udGFpbnMgJHtQcm9wZXJ0eVR5cGVbaXRlbVR5cGVdfSwgZXhwZWN0ZWQgUEFUSGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBUeXBlZFZhbHVlIHRvIEdxbGRiUGF0aFxuICAgICAgY29uc3QgdmFsID0gcm93LmdldCh0aGlzLmNvbHVtbklkeCkgYXMgR3FsZGJQYXRoO1xuICAgICAgaWYgKHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbC5ub2RlcykpIHtcbiAgICAgICAgLy8gQ29udmVydCBHcWxkYk5vZGUvR3FsZGJFZGdlIHRvIE5vZGUvRWRnZVxuICAgICAgICBjb25zdCBub2RlczogTm9kZVtdID0gKHZhbC5ub2RlcyB8fCBbXSkubWFwKChuOiBHcWxkYk5vZGUpID0+ICh7XG4gICAgICAgICAgaWQ6IG4uaWQgfHwgJycsXG4gICAgICAgICAgbGFiZWxzOiBuLmxhYmVscyB8fCBbXSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiBuLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgZWRnZXM6IEVkZ2VbXSA9ICh2YWwuZWRnZXMgfHwgW10pLm1hcCgoZTogR3FsZGJFZGdlKSA9PiAoe1xuICAgICAgICAgIGlkOiBlLmlkIHx8ICcnLFxuICAgICAgICAgIGxhYmVsOiBlLmxhYmVsIHx8ICcnLFxuICAgICAgICAgIGZyb21Ob2RlSWQ6IGUuZnJvbU5vZGVJZCB8fCAnJyxcbiAgICAgICAgICB0b05vZGVJZDogZS50b05vZGVJZCB8fCAnJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiBlLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH0pKTtcbiAgICAgICAgcGF0aHMucHVzaCh7IG5vZGVzLCBlZGdlcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICAvKiogQ29udmVydCB0aGUgYWxpYXNlZCBjb2x1bW4gdG8gYSBzaW5nbGUtY29sdW1uIHRhYmxlICovXG4gIGFzVGFibGUoKTogVGFibGUge1xuICAgIC8vIENoZWNrIGlmIGZpcnN0IG5vbi1udWxsIHZhbHVlIGlzIGEgR3FsZGJUYWJsZSDigJQgaWYgc28sIHVud3JhcCBpdFxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucmVzcG9uc2Uucm93cykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uSWR4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZSh0aGlzLmNvbHVtbklkeCk7XG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLlRBQkxFKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93LmdldCh0aGlzLmNvbHVtbklkeCkgYXMgYW55O1xuICAgICAgICAgIGlmICh2YWwgJiYgJ2NvbHVtbnMnIGluIHZhbCAmJiAncm93cycgaW4gdmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bndyYXBHcWxkYlRhYmxlKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhazsgLy8gb25seSBjaGVjayBmaXJzdCByb3dcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZ2VuZXJpYyBzaW5nbGUtY29sdW1uIHRhYmxlXG4gICAgY29uc3QgaGVhZGVyczogSGVhZGVyW10gPSBbe1xuICAgICAgbmFtZTogdGhpcy5hbGlhc05hbWUsXG4gICAgICB0eXBlOiBQcm9wZXJ0eVR5cGUuVU5TRVQsXG4gICAgfV07XG5cbiAgICBpZiAodGhpcy5yZXNwb25zZS5yb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucmVzcG9uc2Uucm93cykge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5JZHggPCByb3cudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHR5cGUgPSByb3cuZ2V0VHlwZSh0aGlzLmNvbHVtbklkeCk7XG4gICAgICAgICAgaWYgKHR5cGUgIT09IFByb3BlcnR5VHlwZS5VTlNFVCkge1xuICAgICAgICAgICAgaGVhZGVyc1swXS50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlUm93czogYW55W11bXSA9IHRoaXMucmVzcG9uc2Uucm93cy5tYXAocm93ID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbklkeCA8IHJvdy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbcm93LmdldCh0aGlzLmNvbHVtbklkeCldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IG5hbWU6ICcnLCBoZWFkZXJzLCByb3dzOiB0YWJsZVJvd3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgdW53cmFwR3FsZGJUYWJsZShndDogeyBjb2x1bW5zOiBzdHJpbmdbXTsgcm93czogYW55W11bXSB9KTogVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnM6IEhlYWRlcltdID0gZ3QuY29sdW1ucy5tYXAoKGNvbCwgaSkgPT4ge1xuICAgICAgbGV0IGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuVU5TRVQ7XG4gICAgICBpZiAoZ3Qucm93cy5sZW5ndGggPiAwICYmIGkgPCBndC5yb3dzWzBdLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB2ID0gZ3Qucm93c1swXVtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgY29sVHlwZSA9IE51bWJlci5pc0ludGVnZXIodikgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuU1RSSU5HO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nKSBjb2xUeXBlID0gUHJvcGVydHlUeXBlLkJPT0w7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiBjb2wsIHR5cGU6IGNvbFR5cGUgfTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBuYW1lOiB0aGlzLmFsaWFzTmFtZSwgaGVhZGVycywgcm93czogZ3Qucm93cyB9O1xuICB9XG5cbiAgLyoqIEV4dHJhY3Qgc2NhbGFyIG9yIGxpc3QgYXR0cmlidXRlIHZhbHVlcyBmcm9tIHRoZSBhbGlhc2VkIGNvbHVtbiAqL1xuICBhc0F0dHIoKTogQXR0ciB7XG4gICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGxldCBhdHRyVHlwZSA9IFByb3BlcnR5VHlwZS5VTlNFVDtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucmVzcG9uc2Uucm93cykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uSWR4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGdldCB0eXBlIGZyb20gcm93LnR5cGVzIGZpcnN0LCB0aGVuIGZyb20gVHlwZWRWYWx1ZSBvYmplY3RcbiAgICAgICAgaWYgKGF0dHJUeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQpIHtcbiAgICAgICAgICBhdHRyVHlwZSA9IHJvdy5nZXRUeXBlKHRoaXMuY29sdW1uSWR4KTtcbiAgICAgICAgICBpZiAoYXR0clR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCkge1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW3RoaXMuY29sdW1uSWR4XTtcbiAgICAgICAgICAgIGlmIChyYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgICAgICBhdHRyVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LmdldCh0aGlzLmNvbHVtbklkeCk7ICAvLyBVc2UgZ2V0KCkgdG8gY29udmVydCBUeXBlZFZhbHVlXG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1lOiB0aGlzLmFsaWFzTmFtZSwgdHlwZTogYXR0clR5cGUsIHZhbHVlcyB9O1xuICB9XG5cbiAgLyoqIEV4dHJhY3QgcmF3IEphdmFTY3JpcHQgdmFsdWVzIGZyb20gdGhlIGFsaWFzZWQgY29sdW1uICovXG4gIGFzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJlc3BvbnNlLnJvd3MpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbklkeCA8IHJvdy52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHJvdy5nZXQodGhpcy5jb2x1bW5JZHgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHNcblxuICBwcml2YXRlIGJ1aWxkU2NoZW1hRnJvbU5vZGUobGFiZWw6IHN0cmluZywgbm9kZTogTm9kZSk6IFNjaGVtYSB7XG4gICAgY29uc3QgcHJvcGVydGllczogUHJvcGVydHlEZWZbXSA9IE9iamVjdC5lbnRyaWVzKG5vZGUucHJvcGVydGllcykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHRoaXMuaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWUpLFxuICAgIH0pKTtcbiAgICByZXR1cm4geyBuYW1lOiBsYWJlbCwgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNjaGVtYUZyb21FZGdlKGxhYmVsOiBzdHJpbmcsIGVkZ2U6IEVkZ2UpOiBTY2hlbWEge1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnR5RGVmW10gPSBPYmplY3QuZW50cmllcyhlZGdlLnByb3BlcnRpZXMpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlOiB0aGlzLmluZmVyUHJvcGVydHlUeXBlKHZhbHVlKSxcbiAgICB9KSk7XG4gICAgcmV0dXJuIHsgbmFtZTogbGFiZWwsIHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWU6IGFueSk6IFByb3BlcnR5VHlwZSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBQcm9wZXJ0eVR5cGUuTlVMTDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBQcm9wZXJ0eVR5cGUuQk9PTDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpID8gUHJvcGVydHlUeXBlLklOVDY0IDogUHJvcGVydHlUeXBlLkRPVUJMRTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBQcm9wZXJ0eVR5cGUuU1RSSU5HO1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSByZXR1cm4gUHJvcGVydHlUeXBlLkJMT0I7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gUHJvcGVydHlUeXBlLkxJU1Q7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiBQcm9wZXJ0eVR5cGUuTUFQO1xuICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuVU5TRVQ7XG4gIH1cbn1cblxuLyoqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIEdRTCBxdWVyeSAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdLFxuICAgIHB1YmxpYyByZWFkb25seSByb3dzOiBSb3dbXSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcm93Q291bnQ6IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGFzTW9yZTogYm9vbGVhbixcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ3M6IHN0cmluZ1tdLFxuICAgIHB1YmxpYyByZWFkb25seSByb3dzQWZmZWN0ZWQ6IG51bWJlciA9IDAsXG4gICAgLyoqXG4gICAgICogU2Vzc2lvbidzIGN1cnJlbnQgZ3JhcGggYWZ0ZXIgdGhpcyBSUEMgZXhlY3V0ZWQsIGFzIGF1dGhvcml0YXRpdmVseVxuICAgICAqIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuIEFsd2F5cyBwb3B1bGF0ZWQgb24gc3VjY2VzcyBhZ2FpbnN0IG5ld1xuICAgICAqIHNlcnZlcnMgKGNvdmVycyBzaW5nbGUvY29tcG91bmQgVVNFIEdSQVBIIGF0IGFueSBwb3NpdGlvbixcbiAgICAgKiBsYXN0LXdyaXRlLXdpbnMpLiBFbXB0eSB3aGVuIHJ1bm5pbmcgYWdhaW5zdCBhIHByZS1maXggc2VydmVyLCBpblxuICAgICAqIHdoaWNoIGNhc2UgdGhlIGRyaXZlciBmYWxscyBiYWNrIHRvIGl0cyBVU0UgR1JBUEggdGV4dC1wYXJzaW5nIHBhdGhcbiAgICAgKiBpbnRlcm5hbGx5IHRvIGtlZXAgdGhlIGxvY2FsIGRlZmF1bHQtZ3JhcGggY2FjaGUgaW4gc3luYy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudEdyYXBoOiBzdHJpbmcgPSAnJ1xuICApIHtcbiAgICAvLyBQdXNoIGNvbHVtbiBuYW1lcyBpbnRvIGVhY2ggUm93IHNvIG5hbWUtYmFzZWQgYWNjZXNzIChyb3cuZ2V0QnlOYW1lKVxuICAgIC8vIHdvcmtzIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBSZXNwb25zZS5nZXRCeU5hbWUocm93LCAuLi4pLiBNYXRjaGVzXG4gICAgLy8gUHl0aG9uJ3MgUmVzcG9uc2UuX19wb3N0X2luaXRfXyBiZWhhdmlvci5cbiAgICBpZiAodGhpcy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByb3cuY29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBubyByb3dzICovXG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogR2V0IHRoZSBmaXJzdCByb3cgKi9cbiAgZmlyc3QoKTogUm93IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzWzBdO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbGFzdCByb3cgKi9cbiAgbGFzdCgpOiBSb3cgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgdmFsdWUgZm9yIGEgY29sdW1uIGJ5IG5hbWUgKi9cbiAgZ2V0QnlOYW1lKHJvdzogUm93LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiByb3cuZ2V0KGluZGV4KTtcbiAgfVxuXG4gIC8qKiBJdGVyYXRlIG92ZXIgYWxsIHJvd3Mgd2l0aCBhIGNhbGxiYWNrICovXG4gIGZvckVhY2goZm46IChyb3c6IFJvdywgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucm93cy5mb3JFYWNoKGZuKTtcbiAgfVxuXG4gIC8qKiBUcmFuc2Zvcm0gZWFjaCByb3cgdXNpbmcgYSBjYWxsYmFjayAqL1xuICBtYXA8VD4oZm46IChyb3c6IFJvdykgPT4gVCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5tYXAoZm4pO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGFuIGFycmF5IG9mIG9iamVjdHMgKi9cbiAgdG9PYmplY3RzKCk6IFJlY29yZDxzdHJpbmcsIGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5tYXAocm93ID0+IHtcbiAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbCwgaSkgPT4ge1xuICAgICAgICAvLyBBZGQgYm91bmRhcnkgY2hlY2sgdG8gaGFuZGxlIG1pc21hdGNoZWQgY29sdW1ucy92YWx1ZXNcbiAgICAgICAgb2JqW2NvbF0gPSBpIDwgcm93LnZhbHVlcy5sZW5ndGggPyByb3cuZ2V0KGkpIDogbnVsbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBKU09OICovXG4gIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0cygpKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNpbmdsZSB2YWx1ZSBmcm9tIGEgc2luZ2xlLXJvdywgc2luZ2xlLWNvbHVtbiByZXNwb25zZSAqL1xuICBzaW5nbGVWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc2luZ2xlIHJvdywgZ290ICR7dGhpcy5yb3dzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93c1swXS52YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHNpbmdsZSBjb2x1bW4sIGdvdCAke3RoaXMucm93c1swXS52YWx1ZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb3dzWzBdLmdldCgwKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNpbmdsZSBudW1iZXIgdmFsdWUgKi9cbiAgc2luZ2xlTnVtYmVyKCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5zaW5nbGVWYWx1ZSgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICBpZiAoaXNOYU4obnVtKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAke3R5cGVvZiB2YWx9IHRvIG51bWJlcmApO1xuICAgIHJldHVybiBudW07XG4gIH1cblxuICAvKiogR2V0IHRoZSBzaW5nbGUgc3RyaW5nIHZhbHVlICovXG4gIHNpbmdsZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuc2luZ2xlVmFsdWUoKTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgfVxuXG4gIC8qKiBJdGVyYXRvciBzdXBwb3J0ICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFJvdz4ge1xuICAgIHJldHVybiB0aGlzLnJvd3NbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIHJvd3MgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBBbGlhc1Jlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gbmFtZS5cbiAgICogVXNlIHRoaXMgdG8gZXh0cmFjdCBkYXRhIGZyb20gYSBzcGVjaWZpYyBjb2x1bW4gYnkgbmFtZS5cbiAgICogRXhhbXBsZTogcmVzcC5hbGlhcyhcIm5cIikuYXNOb2RlcygpXG4gICAqL1xuICBhbGlhcyhjb2x1bW5OYW1lOiBzdHJpbmcpOiBBbGlhc1Jlc3VsdCB7XG4gICAgY29uc3QgY29sSWR4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGNvbElkeCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uIGFsaWFzIG5vdCBmb3VuZDogJHtjb2x1bW5OYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFsaWFzUmVzdWx0KGNvbHVtbk5hbWUsIGNvbElkeCwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIEFsaWFzUmVzdWx0IGZvciB0aGUgY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAqIFVzZSB0aGlzIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGEgc3BlY2lmaWMgY29sdW1uIGJ5IGluZGV4LlxuICAgKiBFeGFtcGxlOiByZXNwLmdldCgwKS5hc05vZGVzKClcbiAgICovXG4gIGdldChpbmRleDogbnVtYmVyKTogQWxpYXNSZXN1bHQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke2luZGV4fSAodG90YWw6ICR7dGhpcy5jb2x1bW5zLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWxpYXNSZXN1bHQodGhpcy5jb2x1bW5zW2luZGV4XSwgaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhbGlhcygpIG9yIGdldCgpIGluc3RlYWQuIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKiBFeHRyYWN0IG5vZGVzIGZyb20gcmVzcG9uc2Ugd2l0aCBzY2hlbWEgaW5mby5cbiAgICogU3VwcG9ydHMgYm90aCBOT0RFIGFuZCBMSVNUIG9mIE5PREUgY29sdW1ucy5cbiAgICovXG4gIGFzTm9kZXMoKTogTm9kZVJlc3VsdCB7XG4gICAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwPHN0cmluZywgU2NoZW1hPigpO1xuXG4gICAgY29uc3QgY29sbGVjdE5vZGUgPSAodmFsOiBhbnkpID0+IHtcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbC5pZCA9PT0gJ3N0cmluZycgJiYgJ2xhYmVscycgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgICBsYWJlbHM6IHZhbC5sYWJlbHMgfHwgW10sXG4gICAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH07XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2Ygbm9kZS5sYWJlbHMpIHtcbiAgICAgICAgICBpZiAoIXNjaGVtYXMuaGFzKGxhYmVsKSkge1xuICAgICAgICAgICAgc2NoZW1hcy5zZXQobGFiZWwsIHRoaXMuYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbCwgbm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZShpKTtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2ldO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgIGl0ZW1UeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLk5PREUpIHtcbiAgICAgICAgICBjb2xsZWN0Tm9kZShyb3cuZ2V0KGkpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLkxJU1QpIHtcbiAgICAgICAgICBjb25zdCBsaXN0ID0gcm93LmdldChpKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgY29sbGVjdE5vZGUoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbm9kZXMsIHNjaGVtYXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYWxpYXMoKSBvciBnZXQoKSBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogRXh0cmFjdCBlZGdlcyBmcm9tIHJlc3BvbnNlIHdpdGggc2NoZW1hIGluZm8uXG4gICAqIFN1cHBvcnRzIGJvdGggRURHRSBhbmQgTElTVCBvZiBFREdFIGNvbHVtbnMuXG4gICAqL1xuICBhc0VkZ2VzKCk6IEVkZ2VSZXN1bHQge1xuICAgIGNvbnN0IGVkZ2VzOiBFZGdlW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIFNjaGVtYT4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3RFZGdlID0gKHZhbDogYW55KSA9PiB7XG4gICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwuaWQgPT09ICdzdHJpbmcnICYmICdsYWJlbCcgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XG4gICAgICAgICAgaWQ6IHZhbC5pZCxcbiAgICAgICAgICBsYWJlbDogdmFsLmxhYmVsIHx8ICcnLFxuICAgICAgICAgIGZyb21Ob2RlSWQ6IHZhbC5mcm9tTm9kZUlkIHx8ICcnLFxuICAgICAgICAgIHRvTm9kZUlkOiB2YWwudG9Ob2RlSWQgfHwgJycsXG4gICAgICAgICAgcHJvcGVydGllczogdmFsLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgIH07XG4gICAgICAgIGVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgIGlmIChlZGdlLmxhYmVsICYmICFzY2hlbWFzLmhhcyhlZGdlLmxhYmVsKSkge1xuICAgICAgICAgIHNjaGVtYXMuc2V0KGVkZ2UubGFiZWwsIHRoaXMuYnVpbGRTY2hlbWFGcm9tRWRnZShlZGdlLmxhYmVsLCBlZGdlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGl0ZW1UeXBlID0gcm93LmdldFR5cGUoaSk7XG4gICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93LnZhbHVlc1tpXTtcbiAgICAgICAgaWYgKGl0ZW1UeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQgJiYgcmF3VmFsdWUgJiYgdHlwZW9mIHJhd1ZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gcmF3VmFsdWUpIHtcbiAgICAgICAgICBpdGVtVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5FREdFKSB7XG4gICAgICAgICAgY29sbGVjdEVkZ2Uocm93LmdldChpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5MSVNUKSB7XG4gICAgICAgICAgY29uc3QgbGlzdCA9IHJvdy5nZXQoaSk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgIGNvbGxlY3RFZGdlKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGVkZ2VzLCBzY2hlbWFzIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGFsaWFzKCkgb3IgZ2V0KCkgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIEV4dHJhY3QgcGF0aHMgZnJvbSByZXNwb25zZS5cbiAgICogUGF0aHMgYXJlIGlkZW50aWZpZWQgYnkgUHJvcGVydHlUeXBlLlBBVEggdHlwZSBpbiB0aGUgVHlwZWRWYWx1ZS5cbiAgICovXG4gIGFzUGF0aHMoKTogUGF0aFtdIHtcbiAgICBjb25zdCBwYXRoczogUGF0aFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDaGVjayB0eXBlIGZyb20gdHlwZXMgYXJyYXkgb3IgZnJvbSBUeXBlZFZhbHVlIG9iamVjdFxuICAgICAgICBsZXQgaXRlbVR5cGUgPSByb3cuZ2V0VHlwZShpKTtcbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2ldO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCAmJiByYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgIGl0ZW1UeXBlID0gcmF3VmFsdWUudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gUHJvcGVydHlUeXBlLlBBVEgpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IFR5cGVkVmFsdWUgdG8gR3FsZGJQYXRoXG4gICAgICAgICAgY29uc3QgdmFsID0gcm93LmdldChpKSBhcyBHcWxkYlBhdGg7XG4gICAgICAgICAgaWYgKHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbC5ub2RlcykpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgR3FsZGJOb2RlL0dxbGRiRWRnZSB0byBOb2RlL0VkZ2VcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzOiBOb2RlW10gPSAodmFsLm5vZGVzIHx8IFtdKS5tYXAoKG46IEdxbGRiTm9kZSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IG4uaWQgfHwgJycsXG4gICAgICAgICAgICAgIGxhYmVsczogbi5sYWJlbHMgfHwgW10sXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IG4ucHJvcGVydGllcyB8fCB7fSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VzOiBFZGdlW10gPSAodmFsLmVkZ2VzIHx8IFtdKS5tYXAoKGU6IEdxbGRiRWRnZSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IGUuaWQgfHwgJycsXG4gICAgICAgICAgICAgIGxhYmVsOiBlLmxhYmVsIHx8ICcnLFxuICAgICAgICAgICAgICBmcm9tTm9kZUlkOiBlLmZyb21Ob2RlSWQgfHwgJycsXG4gICAgICAgICAgICAgIHRvTm9kZUlkOiBlLnRvTm9kZUlkIHx8ICcnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBlLnByb3BlcnRpZXMgfHwge30sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBwYXRocy5wdXNoKHsgbm9kZXMsIGVkZ2VzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYWxpYXMoKSBvciBnZXQoKSBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogUmV0dXJuIHJlc3BvbnNlIGFzIGdlbmVyaWMgdGFibGUuXG4gICAqIElmIHJlc3BvbnNlIGlzIGEgc2luZ2xlIFRBQkxFIGNvbHVtbiwgdW53cmFwcyB0aGUgR3FsZGJUYWJsZSBpbnRvIHByb3BlciBoZWFkZXJzL3Jvd3MuXG4gICAqL1xuICBhc1RhYmxlKCk6IFRhYmxlIHtcbiAgICAvLyBJZiBzaW5nbGUgY29sdW1uIG9mIFRBQkxFIHR5cGUsIHVud3JhcCBHcWxkYlRhYmxlXG4gICAgaWYgKHRoaXMuY29sdW1ucy5sZW5ndGggPT09IDEgJiYgdGhpcy5yb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdGhpcy5yb3dzWzBdLmdldFR5cGUoMCk7XG4gICAgICBpZiAoaXRlbVR5cGUgPT09IFByb3BlcnR5VHlwZS5UQUJMRSkge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnJvd3NbMF0uZ2V0KDApIGFzIGFueTtcbiAgICAgICAgaWYgKHZhbCAmJiAnY29sdW1ucycgaW4gdmFsICYmICdyb3dzJyBpbiB2YWwpIHtcbiAgICAgICAgICBjb25zdCBndCA9IHZhbCBhcyB7IGNvbHVtbnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH07XG4gICAgICAgICAgY29uc3QgaGVhZGVyczogSGVhZGVyW10gPSBndC5jb2x1bW5zLm1hcCgoY29sOiBzdHJpbmcsIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuVU5TRVQ7XG4gICAgICAgICAgICBpZiAoZ3Qucm93cy5sZW5ndGggPiAwICYmIGkgPCBndC5yb3dzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB2ID0gZ3Qucm93c1swXVtpXTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgY29sVHlwZSA9IE51bWJlci5pc0ludGVnZXIodikgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIGNvbFR5cGUgPSBQcm9wZXJ0eVR5cGUuU1RSSU5HO1xuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nKSBjb2xUeXBlID0gUHJvcGVydHlUeXBlLkJPT0w7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBjb2wsIHR5cGU6IGNvbFR5cGUgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiB0aGlzLmNvbHVtbnNbMF0sIGhlYWRlcnMsIHJvd3M6IGd0LnJvd3MgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBnZW5lcmljIG11bHRpLWNvbHVtbiB0YWJsZVxuICAgIGNvbnN0IGhlYWRlcnM6IEhlYWRlcltdID0gdGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gKHtcbiAgICAgIG5hbWU6IGNvbCxcbiAgICAgIHR5cGU6IFByb3BlcnR5VHlwZS5VTlNFVCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCB0YWJsZVJvd3M6IGFueVtdW10gPSB0aGlzLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoXywgaSkgPT4gKGkgPCByb3cudmFsdWVzLmxlbmd0aCA/IHJvdy5nZXQoaSkgOiBudWxsKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBuYW1lOiAnJywgaGVhZGVycywgcm93czogdGFibGVSb3dzIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGFsaWFzKCkgb3IgZ2V0KCkgaW5zdGVhZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIEV4dHJhY3Qgc2NhbGFyIG9yIGxpc3QgYXR0cmlidXRlIHZhbHVlc1xuICAgKi9cbiAgYXNBdHRyKGNvbHVtbk5hbWU6IHN0cmluZyk6IEF0dHIge1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29sdW1uTmFtZSk7XG4gICAgaWYgKGNvbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gbm90IGZvdW5kOiAke2NvbHVtbk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGxldCBhdHRyVHlwZSA9IFByb3BlcnR5VHlwZS5VTlNFVDtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xuICAgICAgaWYgKGNvbEluZGV4IDwgcm93LnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGdldCB0eXBlIGZyb20gcm93LnR5cGVzIGZpcnN0LCB0aGVuIGZyb20gVHlwZWRWYWx1ZSBvYmplY3RcbiAgICAgICAgaWYgKGF0dHJUeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQpIHtcbiAgICAgICAgICBhdHRyVHlwZSA9IHJvdy5nZXRUeXBlKGNvbEluZGV4KTtcbiAgICAgICAgICBpZiAoYXR0clR5cGUgPT09IFByb3BlcnR5VHlwZS5VTlNFVCkge1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3cudmFsdWVzW2NvbEluZGV4XTtcbiAgICAgICAgICAgIGlmIChyYXdWYWx1ZSAmJiB0eXBlb2YgcmF3VmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiByYXdWYWx1ZSkge1xuICAgICAgICAgICAgICBhdHRyVHlwZSA9IHJhd1ZhbHVlLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LmdldChjb2xJbmRleCk7ICAvLyBVc2UgZ2V0KCkgdG8gY29udmVydCBUeXBlZFZhbHVlXG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1lOiBjb2x1bW5OYW1lLCB0eXBlOiBhdHRyVHlwZSwgdmFsdWVzIH07XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kc1xuXG4gIHByaXZhdGUgYnVpbGRTY2hlbWFGcm9tTm9kZShsYWJlbDogc3RyaW5nLCBub2RlOiBOb2RlKTogU2NoZW1hIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0eURlZltdID0gT2JqZWN0LmVudHJpZXMobm9kZS5wcm9wZXJ0aWVzKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdGhpcy5pbmZlclByb3BlcnR5VHlwZSh2YWx1ZSksXG4gICAgfSkpO1xuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsLCBwcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2NoZW1hRnJvbUVkZ2UobGFiZWw6IHN0cmluZywgZWRnZTogRWRnZSk6IFNjaGVtYSB7XG4gICAgY29uc3QgcHJvcGVydGllczogUHJvcGVydHlEZWZbXSA9IE9iamVjdC5lbnRyaWVzKGVkZ2UucHJvcGVydGllcykubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHRoaXMuaW5mZXJQcm9wZXJ0eVR5cGUodmFsdWUpLFxuICAgIH0pKTtcbiAgICByZXR1cm4geyBuYW1lOiBsYWJlbCwgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbmZlclByb3BlcnR5VHlwZSh2YWx1ZTogYW55KTogUHJvcGVydHlUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFByb3BlcnR5VHlwZS5OVUxMO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIFByb3BlcnR5VHlwZS5CT09MO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyBQcm9wZXJ0eVR5cGUuSU5UNjQgOiBQcm9wZXJ0eVR5cGUuRE9VQkxFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFByb3BlcnR5VHlwZS5TVFJJTkc7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuQkxPQjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBQcm9wZXJ0eVR5cGUuTElTVDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIFByb3BlcnR5VHlwZS5NQVA7XG4gICAgcmV0dXJuIFByb3BlcnR5VHlwZS5VTlNFVDtcbiAgfVxufVxuXG4vKiogUmVzdWx0IG9mIGFuIGluc2VydCBub2RlcyBvcGVyYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBub2RlSWRzOiBzdHJpbmdbXTtcbiAgbm9kZUNvdW50OiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFJlc3VsdCBvZiBhbiBpbnNlcnQgZWRnZXMgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydEVkZ2VzUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZWRnZUlkczogc3RyaW5nW107XG4gIGVkZ2VDb3VudDogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNraXBwZWRDb3VudDogbnVtYmVyO1xufVxuXG4vKiogUmVzdWx0IG9mIGEgZGVsZXRlIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxldGVSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkZWxldGVkQ291bnQ6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHVuaWZpZWQgRXhwb3J0IG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRDb25maWcge1xuICBncmFwaE5hbWU6IHN0cmluZztcbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICBleHBvcnROb2Rlcz86IGJvb2xlYW47XG4gIGV4cG9ydEVkZ2VzPzogYm9vbGVhbjtcbiAgbm9kZUxhYmVscz86IHN0cmluZ1tdO1xuICBlZGdlTGFiZWxzPzogc3RyaW5nW107XG4gIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKiBTdGF0aXN0aWNzIGZvciBhbiBleHBvcnQgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFN0YXRzIHtcbiAgbm9kZXNFeHBvcnRlZDogbnVtYmVyO1xuICBlZGdlc0V4cG9ydGVkOiBudW1iZXI7XG4gIGJ5dGVzV3JpdHRlbjogbnVtYmVyO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8qKiBBIGNodW5rIG9mIGV4cG9ydGVkIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0Q2h1bmsge1xuICBkYXRhOiBCdWZmZXI7XG4gIGlzRmluYWw6IGJvb2xlYW47XG4gIHN0YXRzPzogRXhwb3J0U3RhdHM7XG59XG5cbi8qKlxuICogQSBiYXRjaCBvZiBleHBvcnRlZCBub2Rlc1xuICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnROb2Rlc1Jlc3VsdCB7XG4gIG5vZGVzOiBFeHBvcnRlZE5vZGVbXTtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGJhdGNoIG9mIGV4cG9ydGVkIGVkZ2VzXG4gKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEVkZ2VzUmVzdWx0IHtcbiAgZWRnZXM6IEV4cG9ydGVkRWRnZVtdO1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgbm9kZSBleHBvcnRlZCBmcm9tIHRoZSBkYXRhYmFzZVxuICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRlZE5vZGUge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEFuIGVkZ2UgZXhwb3J0ZWQgZnJvbSB0aGUgZGF0YWJhc2VcbiAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0ZWRFZGdlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZnJvbU5vZGVJZDogc3RyaW5nO1xuICB0b05vZGVJZDogc3RyaW5nO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIGdyYXBoIGRhdGFiYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGUge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBncmFwaCBkYXRhYmFzZSAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGdlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZnJvbU5vZGVJZDogc3RyaW5nO1xuICB0b05vZGVJZDogc3RyaW5nO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKiogUmVwcmVzZW50cyBhIHBhdGggaW4gdGhlIGdyYXBoIGRhdGFiYXNlICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGgge1xuICBub2RlczogTm9kZVtdO1xuICBlZGdlczogRWRnZVtdO1xufVxuXG4vKiogUmVzdWx0IHdyYXBwZXIgZm9yIG5vZGVzIHdpdGggc2NoZW1hIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVSZXN1bHQge1xuICBub2RlczogTm9kZVtdO1xuICBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+O1xufVxuXG4vKiogUmVzdWx0IHdyYXBwZXIgZm9yIGVkZ2VzIHdpdGggc2NoZW1hIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEVkZ2VSZXN1bHQge1xuICBlZGdlczogRWRnZVtdO1xuICBzY2hlbWFzOiBNYXA8c3RyaW5nLCBTY2hlbWE+O1xufVxuIl19
@@ -1,16 +1,46 @@
1
1
  /**
2
2
  * Specialized data types for GQLDB Node.js driver.
3
3
  */
4
- /** 2D geographic point */
5
- export interface Point {
6
- latitude: number;
7
- longitude: number;
4
+ /**
5
+ * 2D geographic point (WGS-84 — server enforces
6
+ * longitude ∈ [-180, 180], latitude ∈ [-90, 90]).
7
+ *
8
+ * Primary fields are `latitude` and `longitude`. For symmetry with
9
+ * `Point3D` and cartesian-style code, `.x` (= longitude) and `.y`
10
+ * (= latitude) are exposed as read-only alias getters.
11
+ *
12
+ * Constructed instances expose the aliases. Plain object literals
13
+ * `{ latitude, longitude }` still pass {@link isPoint}; consumers that
14
+ * want `.x` / `.y` should construct via `new Point(...)`.
15
+ */
16
+ export declare class Point {
17
+ readonly latitude: number;
18
+ readonly longitude: number;
19
+ constructor(latitude: number, longitude: number);
20
+ /** Alias for `longitude` — matches the Point3D x/y/z convention. */
21
+ get x(): number;
22
+ /** Alias for `latitude` — matches the Point3D x/y/z convention. */
23
+ get y(): number;
8
24
  }
9
- /** 3D point */
10
- export interface Point3D {
11
- x: number;
12
- y: number;
13
- z: number;
25
+ /**
26
+ * 3D point (cartesian semantics — server does NOT enforce geographic
27
+ * bounds, so `x` and `y` may legitimately exceed lon/lat ranges).
28
+ *
29
+ * Primary fields are `x`, `y`, `z`. For symmetry with the geographic
30
+ * `Point`, `.longitude` (= x), `.latitude` (= y), `.height` (= z) are
31
+ * exposed as read-only alias getters for geographic-style readers.
32
+ */
33
+ export declare class Point3D {
34
+ readonly x: number;
35
+ readonly y: number;
36
+ readonly z: number;
37
+ constructor(x: number, y: number, z: number);
38
+ /** Alias for `x` — for geographic-style readers. */
39
+ get longitude(): number;
40
+ /** Alias for `y` — for geographic-style readers. */
41
+ get latitude(): number;
42
+ /** Alias for `z` — for geographic-3D (lon/lat/altitude) readers. */
43
+ get height(): number;
14
44
  }
15
45
  /** High-precision decimal number */
16
46
  export interface GqldbDecimal {
@@ -91,9 +121,24 @@ export interface DayToSecond {
91
121
  seconds: number;
92
122
  nanoseconds: number;
93
123
  }
94
- /** Float32 vector for embeddings */
95
- export interface Vector {
96
- values: number[];
124
+ /**
125
+ * Float32 vector for embeddings.
126
+ *
127
+ * Implements {@link Iterable} so `for (const v of vec)` walks the
128
+ * elements. `vec.length` returns the dimension count — mirrors the
129
+ * Python driver's `len(vec)` / `for x in vec` ergonomics.
130
+ *
131
+ * Constructed via `new Vector([...])`. Plain object literals
132
+ * `{ values: [...] }` still pass {@link isVector}; consumers that want
133
+ * the iterator / length getter should construct via the class.
134
+ */
135
+ export declare class Vector implements Iterable<number> {
136
+ readonly values: number[];
137
+ constructor(values: number[]);
138
+ /** Number of dimensions in the vector. */
139
+ get length(): number;
140
+ /** Iterate over the vector elements. */
141
+ [Symbol.iterator](): IterableIterator<number>;
97
142
  }
98
143
  /** Table data with columns and rows */
99
144
  export interface GqldbTable {