hl7-tstd 0.3.1 → 1.0.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/dist/index.cjs +307 -280
- package/dist/index.d.cts +20 -22
- package/dist/index.d.ts +20 -22
- package/dist/index.js +306 -260
- package/package.json +4 -4
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,145 +1,271 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
'use strict';
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
default: () => index_default
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(index_exports);
|
|
26
|
-
var Node = class {
|
|
27
|
-
constructor(data, next = null, prev = null) {
|
|
28
|
-
this.data = data;
|
|
29
|
-
this.next = next;
|
|
30
|
-
this.prev = prev;
|
|
31
|
-
}
|
|
3
|
+
var __typeError = (msg) => {
|
|
4
|
+
throw TypeError(msg);
|
|
32
5
|
};
|
|
6
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
7
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
8
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
9
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
10
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
11
|
+
|
|
12
|
+
// src/utils/segment.ts
|
|
13
|
+
var _parseMap, _Segment_instances, traverse_fn;
|
|
33
14
|
var Segment = class {
|
|
34
|
-
constructor(type,
|
|
15
|
+
constructor(type, parseOptions) {
|
|
35
16
|
this.type = type;
|
|
36
|
-
this
|
|
17
|
+
__privateAdd(this, _Segment_instances);
|
|
18
|
+
this.data = {};
|
|
19
|
+
__privateAdd(this, _parseMap);
|
|
37
20
|
var _a, _b, _c, _d;
|
|
21
|
+
if (!type || !/^[A-Z\d]{3}(\.\d+){0,2}$/.test(type))
|
|
22
|
+
throw new Error(`Invalid parameter: 'field' [${type}]`);
|
|
23
|
+
this.data[type === "MSH" ? "1" : "0"] = [{ 1: [type] }];
|
|
38
24
|
this.parseOptions = {
|
|
39
25
|
fieldDelim: (_a = parseOptions == null ? void 0 : parseOptions.fieldDelim) != null ? _a : "|",
|
|
40
26
|
repeatingDelim: (_b = parseOptions == null ? void 0 : parseOptions.repeatingDelim) != null ? _b : "~",
|
|
41
27
|
componentDelim: (_c = parseOptions == null ? void 0 : parseOptions.componentDelim) != null ? _c : "^",
|
|
42
28
|
subCompDelim: (_d = parseOptions == null ? void 0 : parseOptions.subCompDelim) != null ? _d : "&"
|
|
43
29
|
};
|
|
30
|
+
__privateSet(this, _parseMap, {
|
|
31
|
+
0: this.parseOptions.fieldDelim,
|
|
32
|
+
1: this.parseOptions.repeatingDelim,
|
|
33
|
+
2: this.parseOptions.componentDelim,
|
|
34
|
+
3: this.parseOptions.subCompDelim
|
|
35
|
+
});
|
|
44
36
|
}
|
|
45
37
|
get(field, repeatingIndex = 0, subComponentIndex = 0) {
|
|
46
|
-
|
|
47
|
-
if (!this.data) return null;
|
|
38
|
+
const validate = (val) => !(typeof val === "number" && val >= 0 || val == true);
|
|
48
39
|
if (!field || !/^[A-Z\d]{3}(\.\d+){0,2}$/.test(field))
|
|
49
40
|
throw new Error(`Invalid parameter: 'field' [${field}]`);
|
|
50
|
-
if (
|
|
41
|
+
if (validate(repeatingIndex))
|
|
51
42
|
throw new Error(`Invalid parameter: 'repeatingIndex' [${repeatingIndex}]`);
|
|
52
|
-
if (
|
|
43
|
+
if (validate(subComponentIndex))
|
|
53
44
|
throw new Error(`Invalid parameter: 'subComponentIndex' [${subComponentIndex}]`);
|
|
54
|
-
const { fieldDelim, repeatingDelim, componentDelim, subCompDelim } = this.parseOptions;
|
|
55
45
|
const [type, fieldIdx, compIdx] = field.split(".");
|
|
46
|
+
const path = [fieldIdx, repeatingIndex, compIdx, subComponentIndex];
|
|
56
47
|
if (!type || type !== this.type)
|
|
57
48
|
throw new Error(
|
|
58
|
-
`Invalid parameter: 'field'
|
|
49
|
+
`Invalid parameter: 'field'. Cannot get [${field}] from [${this.type}] segment.`
|
|
59
50
|
);
|
|
60
|
-
|
|
61
|
-
if (subComponentIndex === -1) {
|
|
62
|
-
return (_d = (_c = (_b = (_a = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _a[repeatingIndex]) == null ? void 0 : _b[`${type}.${fieldIdx}.${compIdx}`]) == null ? void 0 : _c.join(subCompDelim)) != null ? _d : null;
|
|
63
|
-
} else {
|
|
64
|
-
return (_h = (_g = (_f = (_e = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _e[repeatingIndex]) == null ? void 0 : _f[`${type}.${fieldIdx}.${compIdx}`]) == null ? void 0 : _g[subComponentIndex]) != null ? _h : null;
|
|
65
|
-
}
|
|
66
|
-
} else if (fieldIdx) {
|
|
67
|
-
let field2 = repeatingIndex === -1 ? this.data[`${type}.${fieldIdx}`] : [(_i = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _i[repeatingIndex]];
|
|
68
|
-
const repeatingFieldsArr = [];
|
|
69
|
-
if (!field2 || !field2[0]) return null;
|
|
70
|
-
for (const repeatingField of field2) {
|
|
71
|
-
const componentsArr = [];
|
|
72
|
-
for (const compKey in repeatingField) {
|
|
73
|
-
componentsArr.push(repeatingField[compKey].join(subCompDelim));
|
|
74
|
-
}
|
|
75
|
-
repeatingFieldsArr.push(componentsArr.join(componentDelim));
|
|
76
|
-
}
|
|
77
|
-
return repeatingFieldsArr.join(repeatingDelim);
|
|
78
|
-
} else {
|
|
79
|
-
if (!this.data) return null;
|
|
80
|
-
const fieldsArr = [this.type];
|
|
81
|
-
for (const fieldKey in this.data) {
|
|
82
|
-
const repeatingCompsArr = [];
|
|
83
|
-
for (const repeatingField of this.data[fieldKey]) {
|
|
84
|
-
const compsArr = [];
|
|
85
|
-
for (const compKey in repeatingField) {
|
|
86
|
-
compsArr.push((_j = repeatingField[compKey]) == null ? void 0 : _j.join(subCompDelim));
|
|
87
|
-
}
|
|
88
|
-
repeatingCompsArr.push(compsArr.join(componentDelim));
|
|
89
|
-
}
|
|
90
|
-
fieldsArr.push(repeatingCompsArr.join(repeatingDelim));
|
|
91
|
-
}
|
|
92
|
-
return fieldsArr.join(fieldDelim);
|
|
93
|
-
}
|
|
51
|
+
return __privateMethod(this, _Segment_instances, traverse_fn).call(this, this.data, path);
|
|
94
52
|
}
|
|
95
53
|
set(field, value, repeatingIndex = 0, subComponentIndex = 0) {
|
|
96
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
54
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
55
|
+
const validate = (val) => !(typeof val === "number" && val >= 0 || val == true);
|
|
97
56
|
if (!field || !/^[A-Z\d]{3}(\.\d+){1,2}$/.test(field))
|
|
98
57
|
throw new Error(`Invalid parameter: 'field' [${field}]`);
|
|
99
58
|
if (value == null || typeof value !== "string")
|
|
100
59
|
throw new Error(`Invalid parameter: 'value' [${value}]`);
|
|
101
|
-
if (
|
|
60
|
+
if (validate(repeatingIndex))
|
|
102
61
|
throw new Error(`Invalid parameter: 'repeatingIndex' [${repeatingIndex}]`);
|
|
103
|
-
if (
|
|
62
|
+
if (validate(subComponentIndex))
|
|
104
63
|
throw new Error(`Invalid parameter: 'subComponentIndex' [${subComponentIndex}]`);
|
|
105
64
|
const [type, fieldIdx, compIdx] = field.split(".");
|
|
106
65
|
if (!type || type !== this.type)
|
|
107
66
|
throw new Error(
|
|
108
67
|
`Invalid parameter: 'field' [${field}]. Cannot set [${field}] from [${this.type}] segment.`
|
|
109
68
|
);
|
|
110
|
-
if (!fieldIdx) throw new Error(`Invalid parameter: 'field' [${field}]`);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (((_b = (_a = this.data[`${type}.${i}`]) == null ? void 0 : _a[0]) == null ? void 0 : _b[`${type}.${i}.${1}`]) == null)
|
|
114
|
-
this.data[`${type}.${i}`] = [{ [`${type}.${i}.${1}`]: [""] }];
|
|
69
|
+
if (!fieldIdx || !Number(fieldIdx)) throw new Error(`Invalid parameter: 'field' [${field}]`);
|
|
70
|
+
for (let i = type === "MSH" ? 2 : 1; i <= Number(fieldIdx); i++) {
|
|
71
|
+
if (!((_d = (_c = (_b = (_a = this.data) == null ? void 0 : _a[i]) == null ? void 0 : _b[0]) == null ? void 0 : _c[1]) == null ? void 0 : _d[0]) == null) this.data[i] = [{ 1: [""] }];
|
|
115
72
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
this.data[
|
|
119
|
-
}
|
|
120
|
-
if (compIdx) {
|
|
121
|
-
for (let i = 1; i <= parseInt(compIdx, 10); i++) {
|
|
122
|
-
if (((_f = (_e = this.data[`${type}.${fieldIdx}`]) == null ? void 0 : _e[repeatingIndex]) == null ? void 0 : _f[`${type}.${fieldIdx}.${i}`]) == null)
|
|
123
|
-
this.data[`${type}.${fieldIdx}`][repeatingIndex][`${type}.${fieldIdx}.${i}`] = [""];
|
|
73
|
+
if (Number.isInteger(repeatingIndex)) {
|
|
74
|
+
for (let i = 0; i <= Number(repeatingIndex); i++) {
|
|
75
|
+
if (((_g = (_f = (_e = this.data[fieldIdx]) == null ? void 0 : _e[i]) == null ? void 0 : _f[1]) == null ? void 0 : _g[0]) == null) this.data[fieldIdx][i] = { 1: [""] };
|
|
124
76
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
this.data[
|
|
77
|
+
if (compIdx && Number(compIdx)) {
|
|
78
|
+
for (let i = 1; i <= Number(compIdx); i++) {
|
|
79
|
+
if (((_j = (_i = (_h = this.data[fieldIdx]) == null ? void 0 : _h[repeatingIndex]) == null ? void 0 : _i[i]) == null ? void 0 : _j[0]) == null)
|
|
80
|
+
this.data[fieldIdx][repeatingIndex][i] = [""];
|
|
81
|
+
}
|
|
82
|
+
if (Number.isInteger(subComponentIndex)) {
|
|
83
|
+
for (let i = 0; i <= Number(subComponentIndex); i++) {
|
|
84
|
+
if (((_m = (_l = (_k = this.data[fieldIdx]) == null ? void 0 : _k[repeatingIndex]) == null ? void 0 : _l[compIdx]) == null ? void 0 : _m[i]) == null)
|
|
85
|
+
this.data[fieldIdx][repeatingIndex][compIdx][i] = "";
|
|
86
|
+
}
|
|
87
|
+
this.data[fieldIdx][repeatingIndex][compIdx][subComponentIndex] = value;
|
|
88
|
+
} else if (subComponentIndex === true) {
|
|
89
|
+
this.data[fieldIdx][repeatingIndex][compIdx] = [value];
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
this.data[fieldIdx][repeatingIndex] = { 1: [value] };
|
|
128
93
|
}
|
|
129
|
-
|
|
94
|
+
} else if (repeatingIndex == true) {
|
|
95
|
+
this.data[fieldIdx] = [{ 1: [""] }];
|
|
96
|
+
if (compIdx && Number(compIdx)) {
|
|
97
|
+
for (let i = 1; i <= Number(compIdx); i++) {
|
|
98
|
+
if (((_p = (_o = (_n = this.data[fieldIdx]) == null ? void 0 : _n[0]) == null ? void 0 : _o[i]) == null ? void 0 : _p[0]) == null) this.data[fieldIdx][0][i] = [""];
|
|
99
|
+
}
|
|
100
|
+
if (Number.isInteger(subComponentIndex)) {
|
|
101
|
+
for (let i = 0; i <= Number(subComponentIndex); i++) {
|
|
102
|
+
if (((_s = (_r = (_q = this.data[fieldIdx]) == null ? void 0 : _q[0]) == null ? void 0 : _r[compIdx]) == null ? void 0 : _s[i]) == null)
|
|
103
|
+
this.data[fieldIdx][0][compIdx][i] = "";
|
|
104
|
+
}
|
|
105
|
+
this.data[fieldIdx][0][compIdx][subComponentIndex] = value;
|
|
106
|
+
} else if (subComponentIndex === true) {
|
|
107
|
+
this.data[fieldIdx][0][compIdx] = [value];
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
this.data[fieldIdx] = [{ 1: [value] }];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
_parseMap = new WeakMap();
|
|
116
|
+
_Segment_instances = new WeakSet();
|
|
117
|
+
traverse_fn = function(data, path, depth = 0) {
|
|
118
|
+
const index = path[depth];
|
|
119
|
+
if (Array.isArray(data)) {
|
|
120
|
+
if (index === true || index == null) {
|
|
121
|
+
const delim = __privateGet(this, _parseMap)[depth++];
|
|
122
|
+
return data.map((item) => __privateMethod(this, _Segment_instances, traverse_fn).call(this, item, path, depth)).join(delim);
|
|
123
|
+
} else {
|
|
124
|
+
return __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[Number(index)], path, ++depth);
|
|
125
|
+
}
|
|
126
|
+
} else if (typeof data === "object") {
|
|
127
|
+
if (index === true || index == null) {
|
|
128
|
+
const delim = __privateGet(this, _parseMap)[depth++];
|
|
129
|
+
const val = Object.keys(data).map((key) => __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[key], path, depth));
|
|
130
|
+
return val.join(delim);
|
|
130
131
|
} else {
|
|
131
|
-
this.data[
|
|
132
|
-
[`${type}.${fieldIdx}.${1}`]: [value]
|
|
133
|
-
};
|
|
132
|
+
return __privateMethod(this, _Segment_instances, traverse_fn).call(this, data[Number(index)], path, ++depth);
|
|
134
133
|
}
|
|
134
|
+
} else {
|
|
135
|
+
return data;
|
|
135
136
|
}
|
|
136
137
|
};
|
|
138
|
+
|
|
139
|
+
// src/utils/dll.ts
|
|
140
|
+
var Node = class {
|
|
141
|
+
constructor(data, next = null, prev = null) {
|
|
142
|
+
this.data = data;
|
|
143
|
+
this.next = next;
|
|
144
|
+
this.prev = prev;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var _head, _tail, _segmentNodeMap, _DLL_instances, detachNode_fn;
|
|
148
|
+
var DLL = class {
|
|
149
|
+
constructor() {
|
|
150
|
+
__privateAdd(this, _DLL_instances);
|
|
151
|
+
__privateAdd(this, _head, null);
|
|
152
|
+
__privateAdd(this, _tail, null);
|
|
153
|
+
__privateAdd(this, _segmentNodeMap, /* @__PURE__ */ new WeakMap());
|
|
154
|
+
}
|
|
155
|
+
getSegment(type) {
|
|
156
|
+
let curr = __privateGet(this, _head);
|
|
157
|
+
while (curr) {
|
|
158
|
+
if (curr.data.type === type) return curr.data;
|
|
159
|
+
curr = curr.next;
|
|
160
|
+
}
|
|
161
|
+
return curr || null;
|
|
162
|
+
}
|
|
163
|
+
getSegments(type) {
|
|
164
|
+
const segments = [];
|
|
165
|
+
let curr = __privateGet(this, _head);
|
|
166
|
+
while (curr) {
|
|
167
|
+
if (type) {
|
|
168
|
+
if (type === curr.data.type) segments.push(curr.data);
|
|
169
|
+
} else {
|
|
170
|
+
segments.push(curr.data);
|
|
171
|
+
}
|
|
172
|
+
curr = curr.next;
|
|
173
|
+
}
|
|
174
|
+
return segments;
|
|
175
|
+
}
|
|
176
|
+
getSegmentsAfter(type, startSegment, stopSegmentType = [], consecutive = false) {
|
|
177
|
+
const startNode = this.getNodeFromSegment(startSegment);
|
|
178
|
+
if (!startNode) throw new Error(`Failed to locate: 'startSegment' [${startSegment.type}]`);
|
|
179
|
+
const res = [];
|
|
180
|
+
let curr = startNode.next;
|
|
181
|
+
while (curr) {
|
|
182
|
+
if (stopSegmentType.length && stopSegmentType.includes(curr.data.type)) break;
|
|
183
|
+
if (curr.data.type === type) res.push(curr.data);
|
|
184
|
+
else if (consecutive && res.length) break;
|
|
185
|
+
curr = curr.next;
|
|
186
|
+
}
|
|
187
|
+
return res;
|
|
188
|
+
}
|
|
189
|
+
appendNewSegment(newSegment, targetSegment) {
|
|
190
|
+
const newNode = new Node(newSegment);
|
|
191
|
+
__privateGet(this, _segmentNodeMap).set(newSegment, newNode);
|
|
192
|
+
this.moveNodeAfter(newNode, this.getNodeFromSegment(targetSegment) || __privateGet(this, _tail));
|
|
193
|
+
return newSegment;
|
|
194
|
+
}
|
|
195
|
+
moveNodeAfter(node, targetNode) {
|
|
196
|
+
if (!node) throw new Error("Failed to locate node");
|
|
197
|
+
if (!__privateGet(this, _head)) {
|
|
198
|
+
__privateSet(this, _head, __privateSet(this, _tail, node));
|
|
199
|
+
node.prev = null;
|
|
200
|
+
node.next = null;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!targetNode) throw new Error("Failed to locate node targetNode");
|
|
204
|
+
if (node === targetNode || targetNode.next === node) return;
|
|
205
|
+
__privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
|
|
206
|
+
node.prev = targetNode;
|
|
207
|
+
node.next = targetNode.next;
|
|
208
|
+
if (targetNode.next) targetNode.next.prev = node;
|
|
209
|
+
else __privateSet(this, _tail, node);
|
|
210
|
+
targetNode.next = node;
|
|
211
|
+
}
|
|
212
|
+
prependNewSegment(newSegment, targetSegment) {
|
|
213
|
+
const newNode = new Node(newSegment);
|
|
214
|
+
__privateGet(this, _segmentNodeMap).set(newSegment, newNode);
|
|
215
|
+
const targetNode = this.getNodeFromSegment(targetSegment);
|
|
216
|
+
if (!targetNode) throw new Error();
|
|
217
|
+
this.moveNodeBefore(newNode, targetNode);
|
|
218
|
+
return newSegment;
|
|
219
|
+
}
|
|
220
|
+
moveNodeBefore(node, targetNode) {
|
|
221
|
+
if (!node) throw new Error("Failed to locate node");
|
|
222
|
+
if (!__privateGet(this, _head)) {
|
|
223
|
+
__privateSet(this, _head, __privateSet(this, _tail, node));
|
|
224
|
+
node.prev = null;
|
|
225
|
+
node.next = null;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (!targetNode) throw new Error("Failed to locate targetNode");
|
|
229
|
+
if (node === targetNode || targetNode.prev === node) return;
|
|
230
|
+
__privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
|
|
231
|
+
node.next = targetNode;
|
|
232
|
+
node.prev = targetNode.prev;
|
|
233
|
+
if (targetNode.prev) targetNode.prev.next = node;
|
|
234
|
+
else __privateSet(this, _head, node);
|
|
235
|
+
targetNode.prev = node;
|
|
236
|
+
}
|
|
237
|
+
deleteSegment(segment) {
|
|
238
|
+
const node = this.getNodeFromSegment(segment);
|
|
239
|
+
if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
|
|
240
|
+
__privateMethod(this, _DLL_instances, detachNode_fn).call(this, node);
|
|
241
|
+
__privateGet(this, _segmentNodeMap).delete(segment);
|
|
242
|
+
}
|
|
243
|
+
getNodeFromSegment(segment) {
|
|
244
|
+
if (segment && !(segment instanceof Segment))
|
|
245
|
+
throw new Error(`Invalid parameter: 'segment'. segment not an instance of Segment`);
|
|
246
|
+
return segment && __privateGet(this, _segmentNodeMap).get(segment) || null;
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
_head = new WeakMap();
|
|
250
|
+
_tail = new WeakMap();
|
|
251
|
+
_segmentNodeMap = new WeakMap();
|
|
252
|
+
_DLL_instances = new WeakSet();
|
|
253
|
+
detachNode_fn = function(node) {
|
|
254
|
+
if (node.prev) node.prev.next = node.next;
|
|
255
|
+
if (__privateGet(this, _head) === node) __privateSet(this, _head, node.next);
|
|
256
|
+
if (node.next) node.next.prev = node.prev;
|
|
257
|
+
if (__privateGet(this, _tail) === node) __privateSet(this, _tail, node.prev);
|
|
258
|
+
node.prev = null;
|
|
259
|
+
node.next = null;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
// src/utils/hl7.ts
|
|
263
|
+
var _dll;
|
|
137
264
|
var HL7 = class {
|
|
138
265
|
constructor(hl7Msg, parseOptions) {
|
|
139
|
-
this
|
|
140
|
-
this.tail = null;
|
|
266
|
+
__privateAdd(this, _dll);
|
|
141
267
|
var _a, _b, _c, _d, _e, _f;
|
|
142
|
-
this.raw =
|
|
268
|
+
this.raw = hl7Msg;
|
|
143
269
|
this.parseOptions = {
|
|
144
270
|
fieldDelim: (_a = parseOptions == null ? void 0 : parseOptions.fieldDelim) != null ? _a : "|",
|
|
145
271
|
repeatingDelim: (_b = parseOptions == null ? void 0 : parseOptions.repeatingDelim) != null ? _b : "~",
|
|
@@ -148,273 +274,174 @@ var HL7 = class {
|
|
|
148
274
|
eolDelim: (_e = parseOptions == null ? void 0 : parseOptions.eolDelim) != null ? _e : "\r?\n|\r",
|
|
149
275
|
buildEolChar: (_f = parseOptions == null ? void 0 : parseOptions.buildEolChar) != null ? _f : "\r\n"
|
|
150
276
|
};
|
|
277
|
+
__privateSet(this, _dll, new DLL());
|
|
151
278
|
this.transform();
|
|
152
279
|
}
|
|
153
280
|
/**
|
|
154
281
|
* @deprecated This method is triggered internally and doesnt need to be invoked manually.
|
|
155
282
|
*/
|
|
156
283
|
transform() {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
284
|
+
var _a;
|
|
285
|
+
if (typeof this.raw !== "string" || !this.raw.startsWith("MSH")) {
|
|
286
|
+
throw new Error("Invalid raw HL7 message. Expected msg to be a string starting with MSH");
|
|
287
|
+
}
|
|
288
|
+
if (!["\r?\n|\r", "\r\n", "\n", "\r"].includes(this.parseOptions.eolDelim)) {
|
|
289
|
+
throw new Error("Invalid EOL character. Expected \\r?\\n|\\r, \\r\\n, \\n, \\r");
|
|
161
290
|
}
|
|
162
|
-
const
|
|
291
|
+
const segmentsStrArr = this.raw.split(RegExp(this.parseOptions.eolDelim)).filter((segmentStr) => this.validateSegment(segmentStr));
|
|
163
292
|
const { fieldDelim, repeatingDelim, componentDelim, subCompDelim } = this.parseOptions;
|
|
164
|
-
for (const segmentStr of
|
|
165
|
-
const type = segmentStr.substring(0, 3);
|
|
166
|
-
const segment = new Segment(type, null, this.parseOptions);
|
|
293
|
+
for (const segmentStr of segmentsStrArr) {
|
|
167
294
|
const fields = segmentStr.split(fieldDelim);
|
|
295
|
+
const type = segmentStr.substring(0, 3);
|
|
296
|
+
const segment = new Segment(type, this.parseOptions);
|
|
297
|
+
let fieldIdx = type === "MSH" ? 1 : 0;
|
|
168
298
|
segment.data = {};
|
|
169
|
-
for (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const subComps = components[k].split(subCompDelim);
|
|
178
|
-
segment.data[`${type}.${fieldIdx}`][j][`${type}.${fieldIdx}.${k + 1}`] = [];
|
|
179
|
-
for (let l = 0; l < subComps.length; l++) {
|
|
180
|
-
segment.data[`${type}.${fieldIdx}`][j][`${type}.${fieldIdx}.${k + 1}`][l] = subComps[l];
|
|
181
|
-
}
|
|
299
|
+
for (const field of fields) {
|
|
300
|
+
segment.data[fieldIdx] = segment.data[fieldIdx] || [];
|
|
301
|
+
let repeatFieldIdx = 0;
|
|
302
|
+
for (const repeatField of field.split(repeatingDelim)) {
|
|
303
|
+
let compIdx = 1;
|
|
304
|
+
segment.data[fieldIdx][repeatFieldIdx] = segment.data[fieldIdx][repeatFieldIdx] || {};
|
|
305
|
+
for (const comp of repeatField.split(componentDelim)) {
|
|
306
|
+
segment.data[fieldIdx][repeatFieldIdx][compIdx++] = comp.split(subCompDelim);
|
|
182
307
|
}
|
|
308
|
+
repeatFieldIdx++;
|
|
183
309
|
}
|
|
310
|
+
fieldIdx++;
|
|
184
311
|
}
|
|
185
|
-
if (type === "MSH") {
|
|
186
|
-
segment.data[
|
|
187
|
-
{ "MSH.2.1": [`${componentDelim}${repeatingDelim}\\${subCompDelim}`] }
|
|
188
|
-
];
|
|
312
|
+
if (type === "MSH" && ((_a = segment.data[2]) == null ? void 0 : _a[0]) && fields[1]) {
|
|
313
|
+
segment.data[2] = [{ 1: [fields[1]] }];
|
|
189
314
|
}
|
|
190
|
-
this.
|
|
315
|
+
__privateGet(this, _dll).appendNewSegment(segment);
|
|
191
316
|
}
|
|
192
317
|
}
|
|
193
318
|
build() {
|
|
194
319
|
var _a;
|
|
195
|
-
const segments = this.getSegments();
|
|
196
320
|
const { fieldDelim, repeatingDelim, componentDelim, subCompDelim, buildEolChar } = this.parseOptions;
|
|
197
|
-
const
|
|
321
|
+
const segments = this.getSegments();
|
|
322
|
+
const segmentsStr = [];
|
|
198
323
|
for (const segment of segments) {
|
|
199
|
-
const
|
|
324
|
+
const fieldsStrArr = [];
|
|
200
325
|
for (const fieldKey in segment.data) {
|
|
201
|
-
const
|
|
202
|
-
for (const
|
|
203
|
-
const
|
|
204
|
-
for (const
|
|
205
|
-
|
|
326
|
+
const repeatsStrArr = [];
|
|
327
|
+
for (const repeatingField of segment.data[fieldKey]) {
|
|
328
|
+
const compsStrArr = [];
|
|
329
|
+
for (const compKey in repeatingField) {
|
|
330
|
+
compsStrArr.push((_a = repeatingField[compKey]) == null ? void 0 : _a.join(subCompDelim));
|
|
206
331
|
}
|
|
207
|
-
|
|
332
|
+
repeatsStrArr.push(compsStrArr.join(componentDelim));
|
|
208
333
|
}
|
|
209
|
-
|
|
334
|
+
fieldsStrArr.push(repeatsStrArr.join(repeatingDelim));
|
|
210
335
|
}
|
|
211
|
-
|
|
336
|
+
segmentsStr.push(fieldsStrArr.join(fieldDelim));
|
|
212
337
|
}
|
|
213
|
-
return
|
|
338
|
+
return segmentsStr.join(buildEolChar);
|
|
214
339
|
}
|
|
215
340
|
getSegment(type) {
|
|
216
341
|
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
217
|
-
|
|
218
|
-
while (curr) {
|
|
219
|
-
if (curr.data.type === type) return curr.data;
|
|
220
|
-
curr = curr.next;
|
|
221
|
-
}
|
|
222
|
-
return curr;
|
|
342
|
+
return __privateGet(this, _dll).getSegment(type);
|
|
223
343
|
}
|
|
224
344
|
getSegments(type) {
|
|
225
345
|
if (type && !/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
226
|
-
|
|
227
|
-
let curr = this.head;
|
|
228
|
-
while (curr) {
|
|
229
|
-
if (type) {
|
|
230
|
-
if (type === curr.data.type) segments.push(curr.data);
|
|
231
|
-
} else {
|
|
232
|
-
segments.push(curr.data);
|
|
233
|
-
}
|
|
234
|
-
curr = curr.next;
|
|
235
|
-
}
|
|
236
|
-
return segments;
|
|
346
|
+
return __privateGet(this, _dll).getSegments(type);
|
|
237
347
|
}
|
|
238
|
-
getSegmentsAfter(
|
|
348
|
+
getSegmentsAfter(type, startSegment, stopSegmentType = [], consecutive = false) {
|
|
349
|
+
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
239
350
|
if (!startSegment || !(startSegment instanceof Segment))
|
|
240
351
|
throw new Error(`Invalid parameter: 'startSegment'`);
|
|
241
|
-
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
242
352
|
if (!stopSegmentType || !Array.isArray(stopSegmentType))
|
|
243
353
|
throw new Error(`Invalid parameter: 'stopSegmentType'`);
|
|
244
354
|
if (typeof consecutive !== "boolean")
|
|
245
355
|
throw new Error(`Invalid parameter: 'consecutive' [${consecutive}]`);
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
let curr = startNode.next;
|
|
250
|
-
while (curr) {
|
|
251
|
-
if (stopSegmentType.length && stopSegmentType.includes(curr.data.type)) break;
|
|
252
|
-
if (curr.data.type === type) res.push(curr.data);
|
|
253
|
-
else if (consecutive && res.length) break;
|
|
254
|
-
curr = curr.next;
|
|
255
|
-
}
|
|
256
|
-
return res;
|
|
356
|
+
if (!__privateGet(this, _dll).getNodeFromSegment(startSegment))
|
|
357
|
+
throw new Error(`Failed to locate: 'startSegment' [${startSegment.type}]`);
|
|
358
|
+
return __privateGet(this, _dll).getSegmentsAfter(type, startSegment, stopSegmentType, consecutive);
|
|
257
359
|
}
|
|
258
360
|
createSegment(type) {
|
|
259
361
|
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
260
|
-
return this.
|
|
362
|
+
return __privateGet(this, _dll).appendNewSegment(new Segment(type, this.parseOptions));
|
|
261
363
|
}
|
|
262
364
|
createSegmentAfter(type, targetSegment) {
|
|
263
365
|
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
264
366
|
if (!targetSegment || !(targetSegment instanceof Segment))
|
|
265
367
|
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
266
|
-
|
|
368
|
+
if (__privateGet(this, _dll).getNodeFromSegment(targetSegment))
|
|
369
|
+
throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
|
|
370
|
+
return __privateGet(this, _dll).appendNewSegment(new Segment(type, this.parseOptions), targetSegment);
|
|
267
371
|
}
|
|
268
372
|
createSegmentBefore(type, targetSegment) {
|
|
269
373
|
if (!/^[A-Z\d]{3}$/.test(type)) throw new Error(`Invalid parameter: 'type' [${type}]`);
|
|
270
374
|
if (!targetSegment || !(targetSegment instanceof Segment))
|
|
271
375
|
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
272
|
-
|
|
376
|
+
if (__privateGet(this, _dll).getNodeFromSegment(targetSegment))
|
|
377
|
+
throw new Error(`Failed to locate: 'startSegment' [${targetSegment.type}]`);
|
|
378
|
+
return __privateGet(this, _dll).prependNewSegment(new Segment(type, this.parseOptions), targetSegment);
|
|
273
379
|
}
|
|
274
380
|
deleteSegment(segment) {
|
|
275
|
-
if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
|
|
276
381
|
this.deleteSegments([segment]);
|
|
277
382
|
}
|
|
278
383
|
deleteSegments(segments) {
|
|
279
|
-
var _a, _b;
|
|
280
384
|
for (const segment of segments) {
|
|
281
385
|
if (!segment || !(segment instanceof Segment))
|
|
282
386
|
throw new Error(`Invalid parameter: 'segments'`);
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if (!node) break;
|
|
287
|
-
if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
|
|
288
|
-
if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
|
|
289
|
-
if (this.head === node) this.head = this.head.next;
|
|
290
|
-
if (this.tail === node) this.tail = this.tail.prev;
|
|
291
|
-
node.next = null;
|
|
292
|
-
node.prev = null;
|
|
387
|
+
if (__privateGet(this, _dll).getNodeFromSegment(segment))
|
|
388
|
+
throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
|
|
389
|
+
__privateGet(this, _dll).deleteSegment(segment);
|
|
293
390
|
}
|
|
294
391
|
}
|
|
295
392
|
moveSegmentAfter(segment, targetSegment) {
|
|
296
|
-
var _a, _b, _c;
|
|
297
393
|
if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
|
|
298
394
|
if (!targetSegment || !(targetSegment instanceof Segment))
|
|
299
395
|
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
300
|
-
|
|
301
|
-
const
|
|
396
|
+
const node = __privateGet(this, _dll).getNodeFromSegment(segment);
|
|
397
|
+
const targetNode = __privateGet(this, _dll).getNodeFromSegment(targetSegment);
|
|
302
398
|
if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
|
|
303
|
-
const targetNode = this.getNode(targetSegment);
|
|
304
399
|
if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
|
|
305
|
-
|
|
306
|
-
if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
|
|
307
|
-
if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
|
|
308
|
-
node.next = targetNode.next;
|
|
309
|
-
node.prev = targetNode;
|
|
310
|
-
targetNode.next = node;
|
|
311
|
-
if ((_c = node.next) == null ? void 0 : _c.prev) node.next.prev = node;
|
|
312
|
-
if (targetNode === this.tail) this.tail = this.tail.next;
|
|
400
|
+
__privateGet(this, _dll).moveNodeAfter(node, targetNode);
|
|
313
401
|
}
|
|
314
402
|
moveSegmentBefore(segment, targetSegment) {
|
|
315
|
-
var _a, _b, _c;
|
|
316
403
|
if (!segment || !(segment instanceof Segment)) throw new Error(`Invalid parameter: 'segment'`);
|
|
317
404
|
if (!targetSegment || !(targetSegment instanceof Segment))
|
|
318
405
|
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
319
|
-
|
|
320
|
-
const
|
|
406
|
+
const node = __privateGet(this, _dll).getNodeFromSegment(segment);
|
|
407
|
+
const targetNode = __privateGet(this, _dll).getNodeFromSegment(targetSegment);
|
|
321
408
|
if (!node) throw new Error(`Failed to locate: 'segment' [${segment.type}]`);
|
|
322
|
-
const targetNode = this.getNode(targetSegment);
|
|
323
409
|
if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
|
|
324
|
-
|
|
325
|
-
if ((_a = node.prev) == null ? void 0 : _a.next) node.prev.next = node.next;
|
|
326
|
-
if ((_b = node.next) == null ? void 0 : _b.prev) node.next.prev = node.prev;
|
|
327
|
-
node.next = targetNode;
|
|
328
|
-
node.prev = targetNode.prev;
|
|
329
|
-
targetNode.prev = node;
|
|
330
|
-
if ((_c = node.prev) == null ? void 0 : _c.next) node.prev.next = node;
|
|
331
|
-
if (targetNode === this.head) this.head = this.head.prev;
|
|
410
|
+
__privateGet(this, _dll).moveNodeBefore(node, targetNode);
|
|
332
411
|
}
|
|
333
|
-
reindexSegments(
|
|
334
|
-
|
|
335
|
-
|
|
412
|
+
reindexSegments(reindexConfig, startIndex = 1, field = "1.1") {
|
|
413
|
+
var _a;
|
|
414
|
+
if (!reindexConfig || typeof reindexConfig !== "object" || Object.values(reindexConfig).some((val) => !Array.isArray(val)))
|
|
415
|
+
throw new Error(`Invalid parameter: 'reindexConfig'`);
|
|
336
416
|
if (!startIndex || typeof startIndex !== "number")
|
|
337
417
|
throw new Error(`Invalid parameter: 'startIndex' [${startIndex}]`);
|
|
338
418
|
if (field && !/^(\d+)(\.\d+){0,1}$/.test(field))
|
|
339
419
|
throw new Error(`Invalid parameter: 'field' [${field}]`);
|
|
340
|
-
|
|
420
|
+
const segments = this.getSegments();
|
|
341
421
|
const indexMap = {};
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
);
|
|
347
|
-
indexMap[key] = startIndex;
|
|
422
|
+
const indexResetTriggerMap = {};
|
|
423
|
+
for (const [seg, resetTriggerSegs] of Object.entries(reindexConfig)) {
|
|
424
|
+
indexMap[seg] = startIndex;
|
|
425
|
+
if (resetTriggerSegs)
|
|
426
|
+
for (const key of resetTriggerSegs) ((_a = indexResetTriggerMap[key]) != null ? _a : indexResetTriggerMap[key] = []).push(seg);
|
|
348
427
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (segment.type in resetRules)
|
|
428
|
+
for (const segment of segments) {
|
|
429
|
+
if (reindexConfig[segment.type]) {
|
|
352
430
|
segment.set(`${segment.type}.${field}`, String(indexMap[segment.type]++));
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
if (segment.type === resetTrigger) {
|
|
356
|
-
indexMap[segmentType] = startIndex;
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
431
|
+
if (indexResetTriggerMap[segment.type])
|
|
432
|
+
for (const seg of indexResetTriggerMap[segment.type]) indexMap[seg] = startIndex;
|
|
360
433
|
}
|
|
361
|
-
curr = curr.next;
|
|
362
434
|
}
|
|
363
435
|
}
|
|
364
|
-
|
|
365
|
-
if (
|
|
366
|
-
|
|
367
|
-
}
|
|
368
|
-
let curr = this.head;
|
|
369
|
-
while (curr) {
|
|
370
|
-
if (curr.data === segment) return curr;
|
|
371
|
-
curr = curr.next;
|
|
436
|
+
validateSegment(segment) {
|
|
437
|
+
if (/^[A-Z\d]{3}\|/.test(segment)) {
|
|
438
|
+
return true;
|
|
372
439
|
}
|
|
373
|
-
|
|
374
|
-
}
|
|
375
|
-
appendSegmentNode(newSegment, targetSegment) {
|
|
376
|
-
var _a;
|
|
377
|
-
if (!newSegment || !(newSegment instanceof Segment))
|
|
378
|
-
throw new Error(`Invalid parameter: 'newSegment'`);
|
|
379
|
-
if (targetSegment && !(targetSegment instanceof Segment))
|
|
380
|
-
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
381
|
-
const newNode = new Node(newSegment);
|
|
382
|
-
if (targetSegment) {
|
|
383
|
-
const targetNode = this.getNode(targetSegment);
|
|
384
|
-
if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
|
|
385
|
-
newNode.next = targetNode.next;
|
|
386
|
-
newNode.prev = targetNode;
|
|
387
|
-
targetNode.next = newNode;
|
|
388
|
-
if ((_a = newNode.next) == null ? void 0 : _a.prev) newNode.next.prev = newNode;
|
|
389
|
-
if (targetNode === this.tail) this.tail = this.tail.next;
|
|
390
|
-
} else if (!this.head) {
|
|
391
|
-
this.head = newNode;
|
|
392
|
-
this.tail = newNode;
|
|
393
|
-
} else if (this.tail) {
|
|
394
|
-
newNode.prev = this.tail;
|
|
395
|
-
this.tail.next = newNode;
|
|
396
|
-
this.tail = this.tail.next;
|
|
397
|
-
} else {
|
|
398
|
-
throw new Error(`Failed to append segment: ${newSegment.type}`);
|
|
399
|
-
}
|
|
400
|
-
return newSegment;
|
|
401
|
-
}
|
|
402
|
-
prependSegmentNode(newSegment, targetSegment) {
|
|
403
|
-
var _a;
|
|
404
|
-
if (!newSegment || !(newSegment instanceof Segment))
|
|
405
|
-
throw new Error(`Invalid parameter: 'newSegment'`);
|
|
406
|
-
if (!targetSegment || !(targetSegment instanceof Segment))
|
|
407
|
-
throw new Error(`Invalid parameter: 'targetSegment'`);
|
|
408
|
-
const targetNode = this.getNode(targetSegment);
|
|
409
|
-
if (!targetNode) throw new Error(`Failed to locate: 'targetSegment' [${targetSegment.type}]`);
|
|
410
|
-
const newNode = new Node(newSegment);
|
|
411
|
-
newNode.next = targetNode;
|
|
412
|
-
newNode.prev = targetNode.prev;
|
|
413
|
-
targetNode.prev = newNode;
|
|
414
|
-
if ((_a = newNode.prev) == null ? void 0 : _a.next) newNode.prev.next = newNode;
|
|
415
|
-
if (targetNode === this.head) this.head = this.head.prev;
|
|
416
|
-
return newSegment;
|
|
440
|
+
throw new Error(`Invalid Segment: [${segment.substring(0, 4)}]`);
|
|
417
441
|
}
|
|
418
442
|
};
|
|
419
|
-
|
|
420
|
-
|
|
443
|
+
_dll = new WeakMap();
|
|
444
|
+
|
|
445
|
+
exports.HL7 = HL7;
|
|
446
|
+
//# sourceMappingURL=index.cjs.map
|
|
447
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9zZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL2RsbC50cyIsIi4uL3NyYy91dGlscy9obDcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxTQUFBLEVBQUEsa0JBQUEsRUFBQSxXQUFBO0FBRU8sSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUtuQixXQUFBLENBQ1csTUFDVCxZQUFBLEVBQ0E7QUFGUyxJQUFBLElBQUEsQ0FBQSxJQUFBLEdBQUEsSUFBQTtBQU5OLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxrQkFBQSxDQUFBO0FBQ0wsSUFBQSxJQUFBLENBQUEsSUFBQSxHQUFxQixFQUFDO0FBRXRCLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxTQUFBLENBQUE7QUFMRixJQUFBLElBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQTtBQVdJLElBQUEsSUFBSSxDQUFDLElBQUEsSUFBUSxDQUFDLDBCQUFBLENBQTJCLEtBQUssSUFBSSxDQUFBO0FBQ2hELE1BQUEsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLDRCQUFBLEVBQStCLElBQUksQ0FBQSxDQUFBLENBQUcsQ0FBQTtBQUN4RCxJQUFBLElBQUEsQ0FBSyxJQUFBLENBQUssSUFBQSxLQUFTLEtBQUEsR0FBUSxHQUFBLEdBQU0sR0FBRyxDQUFBLEdBQUksQ0FBQyxFQUFFLENBQUEsRUFBRyxDQUFDLElBQUksQ0FBQSxFQUFHLENBQUE7QUFDdEQsSUFBQSxJQUFBLENBQUssWUFBQSxHQUFlO0FBQUEsTUFDbEIsVUFBQSxFQUFBLENBQVksRUFBQSxHQUFBLFlBQUEsSUFBQSxJQUFBLEdBQUEsTUFBQSxHQUFBLFlBQUEsQ0FBYyxVQUFBLEtBQWQsSUFBQSxHQUFBLEVBQUEsR0FBNEIsR0FBQTtBQUFBLE1BQ3hDLGNBQUEsRUFBQSxDQUFnQixFQUFBLEdBQUEsWUFBQSxJQUFBLElBQUEsR0FBQSxNQUFBLEdBQUEsWUFBQSxDQUFj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QUksQ0FBQSxFQUFHLE9BQUEsQ0FBUSxJQUFJLENBQUEsQ0FBQSxFQUFJLEtBQUssQ0FBQSxDQUFBLEVBQUksTUFBQSxDQUFPLFFBQUEsQ0FBUyxPQUFBLENBQVEsSUFBSSxDQUFBLEVBQUcsQ0FBQyxDQUFBO0FBRXhFLFFBQUEsSUFBSSxvQkFBQSxDQUFxQixRQUFRLElBQUksQ0FBQTtBQUNuQyxVQUFBLEtBQUEsTUFBVyxPQUFPLG9CQUFBLENBQXFCLE9BQUEsQ0FBUSxJQUFJLENBQUEsRUFBSSxRQUFBLENBQVMsR0FBRyxDQUFBLEdBQUksVUFBQTtBQUFBLE1BQzNFO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGdCQUFnQixPQUFBLEVBQWlCO0FBQ3ZDLElBQUEsSUFBSSxlQUFBLENBQWdCLElBQUEsQ0FBSyxPQUFPLENBQUEsRUFBRztBQUNqQyxNQUFBLE9BQU8sSUFBQTtBQUFBLElBQ1Q7QUFFQSxJQUFBLE1BQU0sSUFBSSxNQUFNLENBQUEsa0JBQUEsRUFBcUIsT0FBQSxDQUFRLFVBQVUsQ0FBQSxFQUFHLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBRyxDQUFBO0FBQUEsRUFDakU7QUFDRjtBQWxQRSxJQUFBLEdBQUEsSUFBQSxPQUFBLEVBQUEiLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcmV0dGlmeSwgU2VnbWVudFR5cGUsIFRQYXJzZU9wdGlvbnMsIFRTZWdtZW50RGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudCB7XG4gIGRhdGE6IFRTZWdtZW50RGF0YSA9IHt9O1xuICBwcml2YXRlIHBhcnNlT3B0aW9uczogUHJldHRpZnk8T21pdDxUUGFyc2VPcHRpb25zLCAnZW9sRGVsaW0nIHwgJ2J1aWxkRW9sQ2hhcic+PjtcbiAgI3BhcnNlTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHR5cGU6IFNlZ21lbnRUeXBlLFxuICAgIHBhcnNlT3B0aW9ucz86IFByZXR0aWZ5PE9taXQ8VFBhcnNlT3B0aW9ucywgJ2VvbERlbGltJyB8ICdidWlsZEVvbENoYXInPj4sXG4gICkge1xuICAgIGlmICghdHlwZSB8fCAhL15bQS1aXFxkXXszfShcXC5cXGQrKXswLDJ9JC8udGVzdCh0eXBlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7dHlwZX1dYCk7XG4gICAgdGhpcy5kYXRhW3R5cGUgPT09ICdNU0gnID8gJzEnIDogJzAnXSA9IFt7IDE6IFt0eXBlXSB9XTtcbiAgICB0aGlzLnBhcnNlT3B0aW9ucyA9IHtcbiAgICAgIGZpZWxkRGVsaW06IHBhcnNlT3B0aW9ucz8uZmllbGREZWxpbSA/PyAnfCcsXG4gICAgICByZXBlYXRpbmdEZWxpbTogcGFyc2VPcHRpb25zPy5yZXBlYXRpbmdEZWxpbSA/PyAnficsXG4gICAgICBjb21wb25lbnREZWxpbTogcGFyc2VPcHRpb25zPy5jb21wb25lbnREZWxpbSA/PyAnXicsXG4gICAgICBzdWJDb21wRGVsaW06IHBhcnNlT3B0aW9ucz8uc3ViQ29tcERlbGltID8/ICcmJyxcbiAgICB9O1xuICAgIHRoaXMuI3BhcnNlTWFwID0ge1xuICAgICAgMDogdGhpcy5wYXJzZU9wdGlvbnMuZmllbGREZWxpbSxcbiAgICAgIDE6IHRoaXMucGFyc2VPcHRpb25zLnJlcGVhdGluZ0RlbGltLFxuICAgICAgMjogdGhpcy5wYXJzZU9wdGlvbnMuY29tcG9uZW50RGVsaW0sXG4gICAgICAzOiB0aGlzLnBhcnNlT3B0aW9ucy5zdWJDb21wRGVsaW0sXG4gICAgfTtcbiAgfVxuXG4gIGdldChmaWVsZDogc3RyaW5nLCByZXBlYXRpbmdJbmRleDogbnVtYmVyIHwgdHJ1ZSA9IDAsIHN1YkNvbXBvbmVudEluZGV4OiBudW1iZXIgfCB0cnVlID0gMCkge1xuICAgIGNvbnN0IHZhbGlkYXRlID0gKHZhbDogbnVtYmVyIHwgdHJ1ZSkgPT5cbiAgICAgICEoKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+PSAwKSB8fCB2YWwgPT0gdHJ1ZSk7XG5cbiAgICBpZiAoIWZpZWxkIHx8ICEvXltBLVpcXGRdezN9KFxcLlxcZCspezAsMn0kLy50ZXN0KGZpZWxkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XWApO1xuICAgIGlmICh2YWxpZGF0ZShyZXBlYXRpbmdJbmRleCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAncmVwZWF0aW5nSW5kZXgnIFske3JlcGVhdGluZ0luZGV4fV1gKTtcbiAgICBpZiAodmFsaWRhdGUoc3ViQ29tcG9uZW50SW5kZXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3N1YkNvbXBvbmVudEluZGV4JyBbJHtzdWJDb21wb25lbnRJbmRleH1dYCk7XG5cbiAgICBjb25zdCBbdHlwZSwgZmllbGRJZHgsIGNvbXBJZHhdID0gZmllbGQuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBwYXRoID0gW2ZpZWxkSWR4LCByZXBlYXRpbmdJbmRleCwgY29tcElkeCwgc3ViQ29tcG9uZW50SW5kZXhdIGFzIGNvbnN0O1xuXG4gICAgaWYgKCF0eXBlIHx8IHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyYW1ldGVyOiAnZmllbGQnLiBDYW5ub3QgZ2V0IFske2ZpZWxkfV0gZnJvbSBbJHt0aGlzLnR5cGV9XSBzZWdtZW50LmAsXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuI3RyYXZlcnNlKHRoaXMuZGF0YSwgcGF0aCk7XG4gIH1cblxuICBzZXQoXG4gICAgZmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHJlcGVhdGluZ0luZGV4OiBudW1iZXIgfCB0cnVlID0gMCxcbiAgICBzdWJDb21wb25lbnRJbmRleDogbnVtYmVyIHwgdHJ1ZSA9IDAsXG4gICkge1xuICAgIGNvbnN0IHZhbGlkYXRlID0gKHZhbDogbnVtYmVyIHwgdHJ1ZSkgPT5cbiAgICAgICEoKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+PSAwKSB8fCB2YWwgPT0gdHJ1ZSk7XG5cbiAgICBpZiAoIWZpZWxkIHx8ICEvXltBLVpcXGRdezN9KFxcLlxcZCspezEsMn0kLy50ZXN0KGZpZWxkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XWApO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndmFsdWUnIFske3ZhbHVlfV1gKTtcbiAgICBpZiAodmFsaWRhdGUocmVwZWF0aW5nSW5kZXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3JlcGVhdGluZ0luZGV4JyBbJHtyZXBlYXRpbmdJbmRleH1dYCk7XG4gICAgaWYgKHZhbGlkYXRlKHN1YkNvbXBvbmVudEluZGV4KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdWJDb21wb25lbnRJbmRleCcgWyR7c3ViQ29tcG9uZW50SW5kZXh9XWApO1xuXG4gICAgY29uc3QgW3R5cGUsIGZpZWxkSWR4LCBjb21wSWR4XSA9IGZpZWxkLnNwbGl0KCcuJyk7XG5cbiAgICBpZiAoIXR5cGUgfHwgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XS4gQ2Fubm90IHNldCBbJHtmaWVsZH1dIGZyb20gWyR7dGhpcy50eXBlfV0gc2VnbWVudC5gLFxuICAgICAgKTtcbiAgICBpZiAoIWZpZWxkSWR4IHx8ICFOdW1iZXIoZmllbGRJZHgpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAnZmllbGQnIFske2ZpZWxkfV1gKTtcblxuICAgIGZvciAobGV0IGkgPSB0eXBlID09PSAnTVNIJyA/IDIgOiAxOyBpIDw9IE51bWJlcihmaWVsZElkeCk7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmRhdGE/LltpXT8uWzBdPy5bMV0/LlswXSA9PSBudWxsKSB0aGlzLmRhdGFbaV0gPSBbeyAxOiBbJyddIH1dO1xuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdGluZ0luZGV4KSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gTnVtYmVyKHJlcGVhdGluZ0luZGV4KTsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5baV0/LlsxXT8uWzBdID09IG51bGwpIHRoaXMuZGF0YVtmaWVsZElkeF0hW2ldID0geyAxOiBbJyddIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wSWR4ICYmIE51bWJlcihjb21wSWR4KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIoY29tcElkeCk7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bcmVwZWF0aW5nSW5kZXggYXMgbnVtYmVyXT8uW2ldPy5bMF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hW3JlcGVhdGluZ0luZGV4IGFzIG51bWJlcl0hW2ldID0gWycnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHN1YkNvbXBvbmVudEluZGV4KSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE51bWJlcihzdWJDb21wb25lbnRJbmRleCk7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtmaWVsZElkeF0/LltyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdPy5bY29tcElkeF0/LltpXSA9PSBudWxsKVxuICAgICAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVtyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdIVtjb21wSWR4XSFbaV0gPSAnJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVtyZXBlYXRpbmdJbmRleCBhcyBudW1iZXJdIVtjb21wSWR4XSFbc3ViQ29tcG9uZW50SW5kZXggYXMgbnVtYmVyXSA9XG4gICAgICAgICAgICB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJDb21wb25lbnRJbmRleCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hW3JlcGVhdGluZ0luZGV4IGFzIG51bWJlcl0hW2NvbXBJZHhdID0gW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhW2ZpZWxkSWR4XSFbcmVwZWF0aW5nSW5kZXggYXMgbnVtYmVyXSA9IHsgMTogW3ZhbHVlXSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVwZWF0aW5nSW5kZXggPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5kYXRhW2ZpZWxkSWR4XSA9IFt7IDE6IFsnJ10gfV07XG5cbiAgICAgIGlmIChjb21wSWR4ICYmIE51bWJlcihjb21wSWR4KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIoY29tcElkeCk7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bMF0/LltpXT8uWzBdID09IG51bGwpIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtpXSA9IFsnJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihzdWJDb21wb25lbnRJbmRleCkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBOdW1iZXIoc3ViQ29tcG9uZW50SW5kZXgpOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbZmllbGRJZHhdPy5bMF0/Lltjb21wSWR4XT8uW2ldID09IG51bGwpXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtjb21wSWR4XSFbaV0gPSAnJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGRJZHhdIVswXSFbY29tcElkeF0hW3N1YkNvbXBvbmVudEluZGV4IGFzIG51bWJlcl0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJDb21wb25lbnRJbmRleCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0hWzBdIVtjb21wSWR4XSA9IFt2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0YVtmaWVsZElkeF0gPSBbeyAxOiBbdmFsdWVdIH1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICN0cmF2ZXJzZShcbiAgICBkYXRhOiBhbnksXG4gICAgcGF0aDogcmVhZG9ubHkgW3N0cmluZyB8IHVuZGVmaW5lZCwgbnVtYmVyIHwgdHJ1ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBudW1iZXIgfCB0cnVlXSxcbiAgICBkZXB0aCA9IDAsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBwYXRoW2RlcHRoXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRydWUgfHwgaW5kZXggPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkZWxpbSA9IHRoaXMuI3BhcnNlTWFwW2RlcHRoKytdO1xuICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuI3RyYXZlcnNlKGl0ZW0sIHBhdGgsIGRlcHRoKSkuam9pbihkZWxpbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhdmVyc2UoZGF0YVtOdW1iZXIoaW5kZXgpXSwgcGF0aCwgKytkZXB0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdHJ1ZSB8fCBpbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRlbGltID0gdGhpcy4jcGFyc2VNYXBbZGVwdGgrK107XG5cbiAgICAgICAgY29uc3QgdmFsID0gT2JqZWN0LmtleXMoZGF0YSkubWFwKChrZXkpID0+IHRoaXMuI3RyYXZlcnNlKGRhdGFba2V5XSwgcGF0aCwgZGVwdGgpKTtcblxuICAgICAgICByZXR1cm4gdmFsLmpvaW4oZGVsaW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYXZlcnNlKGRhdGFbTnVtYmVyKGluZGV4KV0sIHBhdGgsICsrZGVwdGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNlZ21lbnQgfSBmcm9tICcuL3NlZ21lbnQnO1xuaW1wb3J0IHR5cGUgeyBTZWdtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5jbGFzcyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IFNlZ21lbnQsXG4gICAgcHVibGljIG5leHQ6IE5vZGUgfCBudWxsID0gbnVsbCxcbiAgICBwdWJsaWMgcHJldjogTm9kZSB8IG51bGwgPSBudWxsLFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBETEwge1xuICAjaGVhZDogTm9kZSB8IG51bGwgPSBudWxsO1xuICAjdGFpbDogTm9kZSB8IG51bGwgPSBudWxsO1xuICAjc2VnbWVudE5vZGVNYXAgPSBuZXcgV2Vha01hcDxTZWdtZW50LCBOb2RlPigpO1xuXG4gIGdldFNlZ21lbnQodHlwZTogU2VnbWVudFR5cGUpIHtcbiAgICBsZXQgY3VyciA9IHRoaXMuI2hlYWQ7XG5cbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgaWYgKGN1cnIuZGF0YS50eXBlID09PSB0eXBlKSByZXR1cm4gY3Vyci5kYXRhO1xuXG4gICAgICBjdXJyID0gY3Vyci5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyIHx8IG51bGw7XG4gIH1cblxuICBnZXRTZWdtZW50cyh0eXBlPzogU2VnbWVudFR5cGUpIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IFtdO1xuICAgIGxldCBjdXJyID0gdGhpcy4jaGVhZDtcblxuICAgIHdoaWxlIChjdXJyKSB7XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gY3Vyci5kYXRhLnR5cGUpIHNlZ21lbnRzLnB1c2goY3Vyci5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goY3Vyci5kYXRhKTtcbiAgICAgIH1cblxuICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICBnZXRTZWdtZW50c0FmdGVyKFxuICAgIHR5cGU6IFNlZ21lbnRUeXBlLFxuICAgIHN0YXJ0U2VnbWVudDogU2VnbWVudCxcbiAgICBzdG9wU2VnbWVudFR5cGU6IFNlZ21lbnRUeXBlW10gPSBbXSxcbiAgICBjb25zZWN1dGl2ZSA9IGZhbHNlLFxuICApIHtcbiAgICBjb25zdCBzdGFydE5vZGUgPSB0aGlzLmdldE5vZGVGcm9tU2VnbWVudChzdGFydFNlZ21lbnQpO1xuXG4gICAgaWYgKCFzdGFydE5vZGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3N0YXJ0U2VnbWVudCcgWyR7c3RhcnRTZWdtZW50LnR5cGV9XWApO1xuXG4gICAgY29uc3QgcmVzID0gW107XG4gICAgbGV0IGN1cnIgPSBzdGFydE5vZGUubmV4dDtcblxuICAgIHdoaWxlIChjdXJyKSB7XG4gICAgICBpZiAoc3RvcFNlZ21lbnRUeXBlLmxlbmd0aCAmJiBzdG9wU2VnbWVudFR5cGUuaW5jbHVkZXMoY3Vyci5kYXRhLnR5cGUpKSBicmVhaztcblxuICAgICAgaWYgKGN1cnIuZGF0YS50eXBlID09PSB0eXBlKSByZXMucHVzaChjdXJyLmRhdGEpO1xuICAgICAgZWxzZSBpZiAoY29uc2VjdXRpdmUgJiYgcmVzLmxlbmd0aCkgYnJlYWs7XG5cbiAgICAgIGN1cnIgPSBjdXJyLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFwcGVuZE5ld1NlZ21lbnQobmV3U2VnbWVudDogU2VnbWVudCwgdGFyZ2V0U2VnbWVudD86IFNlZ21lbnQpIHtcbiAgICBjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUobmV3U2VnbWVudCk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuc2V0KG5ld1NlZ21lbnQsIG5ld05vZGUpO1xuXG4gICAgdGhpcy5tb3ZlTm9kZUFmdGVyKG5ld05vZGUsIHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpIHx8IHRoaXMuI3RhaWwpO1xuXG4gICAgcmV0dXJuIG5ld1NlZ21lbnQ7XG4gIH1cblxuICBtb3ZlTm9kZUFmdGVyKG5vZGU6IE5vZGUsIHRhcmdldE5vZGU6IE5vZGUgfCBudWxsKSB7XG4gICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2NhdGUgbm9kZScpO1xuXG4gICAgaWYgKCF0aGlzLiNoZWFkKSB7XG4gICAgICB0aGlzLiNoZWFkID0gdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgICBub2RlLnByZXYgPSBudWxsO1xuICAgICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldE5vZGUpIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvY2F0ZSBub2RlIHRhcmdldE5vZGUnKTtcbiAgICBpZiAobm9kZSA9PT0gdGFyZ2V0Tm9kZSB8fCB0YXJnZXROb2RlLm5leHQgPT09IG5vZGUpIHJldHVybjtcblxuICAgIHRoaXMuI2RldGFjaE5vZGUobm9kZSk7XG5cbiAgICBub2RlLnByZXYgPSB0YXJnZXROb2RlO1xuICAgIG5vZGUubmV4dCA9IHRhcmdldE5vZGUubmV4dDtcblxuICAgIGlmICh0YXJnZXROb2RlLm5leHQpIHRhcmdldE5vZGUubmV4dC5wcmV2ID0gbm9kZTtcbiAgICBlbHNlIHRoaXMuI3RhaWwgPSBub2RlO1xuXG4gICAgdGFyZ2V0Tm9kZS5uZXh0ID0gbm9kZTtcbiAgfVxuXG4gIHByZXBlbmROZXdTZWdtZW50KG5ld1NlZ21lbnQ6IFNlZ21lbnQsIHRhcmdldFNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICBjb25zdCBuZXdOb2RlID0gbmV3IE5vZGUobmV3U2VnbWVudCk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuc2V0KG5ld1NlZ21lbnQsIG5ld05vZGUpO1xuXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpO1xuXG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoKTsgLy8gVG9kb1xuXG4gICAgdGhpcy5tb3ZlTm9kZUJlZm9yZShuZXdOb2RlLCB0YXJnZXROb2RlKTtcblxuICAgIHJldHVybiBuZXdTZWdtZW50O1xuICB9XG5cbiAgbW92ZU5vZGVCZWZvcmUobm9kZTogTm9kZSwgdGFyZ2V0Tm9kZTogTm9kZSkge1xuICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9jYXRlIG5vZGUnKTtcblxuICAgIGlmICghdGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSBub2RlO1xuICAgICAgbm9kZS5wcmV2ID0gbnVsbDtcbiAgICAgIG5vZGUubmV4dCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2NhdGUgdGFyZ2V0Tm9kZScpO1xuICAgIGlmIChub2RlID09PSB0YXJnZXROb2RlIHx8IHRhcmdldE5vZGUucHJldiA9PT0gbm9kZSkgcmV0dXJuO1xuXG4gICAgdGhpcy4jZGV0YWNoTm9kZShub2RlKTtcblxuICAgIG5vZGUubmV4dCA9IHRhcmdldE5vZGU7XG4gICAgbm9kZS5wcmV2ID0gdGFyZ2V0Tm9kZS5wcmV2O1xuXG4gICAgaWYgKHRhcmdldE5vZGUucHJldikgdGFyZ2V0Tm9kZS5wcmV2Lm5leHQgPSBub2RlO1xuICAgIGVsc2UgdGhpcy4jaGVhZCA9IG5vZGU7XG5cbiAgICB0YXJnZXROb2RlLnByZXYgPSBub2RlO1xuICB9XG5cbiAgZGVsZXRlU2VnbWVudChzZWdtZW50OiBTZWdtZW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZUZyb21TZWdtZW50KHNlZ21lbnQpO1xuICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAnc2VnbWVudCcgWyR7c2VnbWVudC50eXBlfV1gKTtcblxuICAgIHRoaXMuI2RldGFjaE5vZGUobm9kZSk7XG4gICAgdGhpcy4jc2VnbWVudE5vZGVNYXAuZGVsZXRlKHNlZ21lbnQpO1xuICB9XG5cbiAgI2RldGFjaE5vZGUobm9kZTogTm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIGlmICh0aGlzLiNoZWFkID09PSBub2RlKSB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuXG4gICAgaWYgKG5vZGUubmV4dCkgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgaWYgKHRoaXMuI3RhaWwgPT09IG5vZGUpIHRoaXMuI3RhaWwgPSBub2RlLnByZXY7XG5cbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IG51bGw7XG4gIH1cblxuICBnZXROb2RlRnJvbVNlZ21lbnQoc2VnbWVudD86IFNlZ21lbnQpIHtcbiAgICBpZiAoc2VnbWVudCAmJiAhKHNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzZWdtZW50Jy4gc2VnbWVudCBub3QgYW4gaW5zdGFuY2Ugb2YgU2VnbWVudGApO1xuXG4gICAgcmV0dXJuIChzZWdtZW50ICYmIHRoaXMuI3NlZ21lbnROb2RlTWFwLmdldChzZWdtZW50KSkgfHwgbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRExMIH0gZnJvbSAnLi9kbGwnO1xuaW1wb3J0IHsgU2VnbWVudCB9IGZyb20gJy4vc2VnbWVudCc7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5LCBTZWdtZW50VHlwZSwgVFBhcnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSEw3IHtcbiAgcmF3OiBzdHJpbmc7XG4gIHBhcnNlT3B0aW9uczogVFBhcnNlT3B0aW9ucztcbiAgI2RsbDogRExMO1xuXG4gIGNvbnN0cnVjdG9yKGhsN01zZzogc3RyaW5nLCBwYXJzZU9wdGlvbnM/OiBQcmV0dGlmeTxQYXJ0aWFsPFRQYXJzZU9wdGlvbnM+Pikge1xuICAgIHRoaXMucmF3ID0gaGw3TXNnO1xuICAgIHRoaXMucGFyc2VPcHRpb25zID0ge1xuICAgICAgZmllbGREZWxpbTogcGFyc2VPcHRpb25zPy5maWVsZERlbGltID8/ICd8JyxcbiAgICAgIHJlcGVhdGluZ0RlbGltOiBwYXJzZU9wdGlvbnM/LnJlcGVhdGluZ0RlbGltID8/ICd+JyxcbiAgICAgIGNvbXBvbmVudERlbGltOiBwYXJzZU9wdGlvbnM/LmNvbXBvbmVudERlbGltID8/ICdeJyxcbiAgICAgIHN1YkNvbXBEZWxpbTogcGFyc2VPcHRpb25zPy5zdWJDb21wRGVsaW0gPz8gJyYnLFxuICAgICAgZW9sRGVsaW06IHBhcnNlT3B0aW9ucz8uZW9sRGVsaW0gPz8gJ1xccj9cXG58XFxyJyxcbiAgICAgIGJ1aWxkRW9sQ2hhcjogcGFyc2VPcHRpb25zPy5idWlsZEVvbENoYXIgPz8gJ1xcclxcbicsXG4gICAgfTtcbiAgICB0aGlzLiNkbGwgPSBuZXcgRExMKCk7XG4gICAgdGhpcy50cmFuc2Zvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyB0cmlnZ2VyZWQgaW50ZXJuYWxseSBhbmQgZG9lc250IG5lZWQgdG8gYmUgaW52b2tlZCBtYW51YWxseS5cbiAgICovXG4gIHRyYW5zZm9ybSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucmF3ICE9PSAnc3RyaW5nJyB8fCAhdGhpcy5yYXcuc3RhcnRzV2l0aCgnTVNIJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByYXcgSEw3IG1lc3NhZ2UuIEV4cGVjdGVkIG1zZyB0byBiZSBhIHN0cmluZyBzdGFydGluZyB3aXRoIE1TSCcpO1xuICAgIH1cblxuICAgIGlmICghWydcXHI/XFxuXFx8XFxyJywgJ1xcclxcbicsICdcXG4nLCAnXFxyJ10uaW5jbHVkZXModGhpcy5wYXJzZU9wdGlvbnMuZW9sRGVsaW0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgRU9MIGNoYXJhY3Rlci4gRXhwZWN0ZWQgXFxcXHI/XFxcXG5cXHxcXFxcciwgXFxcXHJcXFxcbiwgXFxcXG4sIFxcXFxyJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudHNTdHJBcnIgPSB0aGlzLnJhd1xuICAgICAgLnNwbGl0KFJlZ0V4cCh0aGlzLnBhcnNlT3B0aW9ucy5lb2xEZWxpbSkpXG4gICAgICAuZmlsdGVyKChzZWdtZW50U3RyKSA9PiB0aGlzLnZhbGlkYXRlU2VnbWVudChzZWdtZW50U3RyKSk7XG5cbiAgICBjb25zdCB7IGZpZWxkRGVsaW0sIHJlcGVhdGluZ0RlbGltLCBjb21wb25lbnREZWxpbSwgc3ViQ29tcERlbGltIH0gPSB0aGlzLnBhcnNlT3B0aW9ucztcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudFN0ciBvZiBzZWdtZW50c1N0ckFycikge1xuICAgICAgY29uc3QgZmllbGRzID0gc2VnbWVudFN0ci5zcGxpdChmaWVsZERlbGltKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBzZWdtZW50U3RyLnN1YnN0cmluZygwLCAzKSBhcyBTZWdtZW50VHlwZTtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSBuZXcgU2VnbWVudCh0eXBlLCB0aGlzLnBhcnNlT3B0aW9ucyk7XG4gICAgICBsZXQgZmllbGRJZHggPSB0eXBlID09PSAnTVNIJyA/IDEgOiAwO1xuICAgICAgc2VnbWVudC5kYXRhID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0gPSBzZWdtZW50LmRhdGFbZmllbGRJZHhdIHx8IFtdO1xuICAgICAgICBsZXQgcmVwZWF0RmllbGRJZHggPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVwZWF0RmllbGQgb2YgZmllbGQuc3BsaXQocmVwZWF0aW5nRGVsaW0pKSB7XG4gICAgICAgICAgbGV0IGNvbXBJZHggPSAxO1xuICAgICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSA9IHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSB8fCB7fTtcblxuICAgICAgICAgIGZvciAoY29uc3QgY29tcCBvZiByZXBlYXRGaWVsZC5zcGxpdChjb21wb25lbnREZWxpbSkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQuZGF0YVtmaWVsZElkeF0hW3JlcGVhdEZpZWxkSWR4XSFbY29tcElkeCsrXSA9IGNvbXAuc3BsaXQoc3ViQ29tcERlbGltKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXBlYXRGaWVsZElkeCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRJZHgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdNU0gnICYmIHNlZ21lbnQuZGF0YVsyXT8uWzBdICYmIGZpZWxkc1sxXSkge1xuICAgICAgICBzZWdtZW50LmRhdGFbMl0gPSBbeyAxOiBbZmllbGRzWzFdXSB9XTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jZGxsLmFwcGVuZE5ld1NlZ21lbnQoc2VnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgY29uc3QgeyBmaWVsZERlbGltLCByZXBlYXRpbmdEZWxpbSwgY29tcG9uZW50RGVsaW0sIHN1YkNvbXBEZWxpbSwgYnVpbGRFb2xDaGFyIH0gPVxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnM7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLmdldFNlZ21lbnRzKCk7XG4gICAgY29uc3Qgc2VnbWVudHNTdHIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3QgZmllbGRzU3RyQXJyID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGRLZXkgaW4gc2VnbWVudC5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHJlcGVhdHNTdHJBcnIgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlcGVhdGluZ0ZpZWxkIG9mIHNlZ21lbnQuZGF0YVtmaWVsZEtleV0hKSB7XG4gICAgICAgICAgY29uc3QgY29tcHNTdHJBcnIgPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgY29tcEtleSBpbiByZXBlYXRpbmdGaWVsZCkge1xuICAgICAgICAgICAgY29tcHNTdHJBcnIucHVzaChyZXBlYXRpbmdGaWVsZFtjb21wS2V5XT8uam9pbihzdWJDb21wRGVsaW0pKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXBlYXRzU3RyQXJyLnB1c2goY29tcHNTdHJBcnIuam9pbihjb21wb25lbnREZWxpbSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRzU3RyQXJyLnB1c2gocmVwZWF0c1N0ckFyci5qb2luKHJlcGVhdGluZ0RlbGltKSk7XG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnRzU3RyLnB1c2goZmllbGRzU3RyQXJyLmpvaW4oZmllbGREZWxpbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWdtZW50c1N0ci5qb2luKGJ1aWxkRW9sQ2hhcik7XG4gIH1cblxuICBnZXRTZWdtZW50KHR5cGU6IFNlZ21lbnRUeXBlKTogU2VnbWVudCB8IG51bGwge1xuICAgIGlmICghL15bQS1aXFxkXXszfSQvLnRlc3QodHlwZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0eXBlJyBbJHt0eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuZ2V0U2VnbWVudCh0eXBlKTtcbiAgfVxuXG4gIGdldFNlZ21lbnRzKHR5cGU/OiBTZWdtZW50VHlwZSk6IFNlZ21lbnRbXSB7XG4gICAgaWYgKHR5cGUgJiYgIS9eW0EtWlxcZF17M30kLy50ZXN0KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG5cbiAgICByZXR1cm4gdGhpcy4jZGxsLmdldFNlZ21lbnRzKHR5cGUpO1xuICB9XG5cbiAgZ2V0U2VnbWVudHNBZnRlcihcbiAgICB0eXBlOiBTZWdtZW50VHlwZSxcbiAgICBzdGFydFNlZ21lbnQ6IFNlZ21lbnQsXG4gICAgc3RvcFNlZ21lbnRUeXBlOiBTZWdtZW50VHlwZVtdID0gW10sXG4gICAgY29uc2VjdXRpdmUgPSBmYWxzZSxcbiAgKTogU2VnbWVudFtdIHtcbiAgICBpZiAoIS9eW0EtWlxcZF17M30kLy50ZXN0KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndHlwZScgWyR7dHlwZX1dYCk7XG4gICAgaWYgKCFzdGFydFNlZ21lbnQgfHwgIShzdGFydFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdGFydFNlZ21lbnQnYCk7XG4gICAgaWYgKCFzdG9wU2VnbWVudFR5cGUgfHwgIUFycmF5LmlzQXJyYXkoc3RvcFNlZ21lbnRUeXBlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdG9wU2VnbWVudFR5cGUnYCk7XG4gICAgaWYgKHR5cGVvZiBjb25zZWN1dGl2ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ2NvbnNlY3V0aXZlJyBbJHtjb25zZWN1dGl2ZX1dYCk7XG4gICAgaWYgKCF0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHN0YXJ0U2VnbWVudCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICdzdGFydFNlZ21lbnQnIFske3N0YXJ0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuZ2V0U2VnbWVudHNBZnRlcih0eXBlLCBzdGFydFNlZ21lbnQsIHN0b3BTZWdtZW50VHlwZSwgY29uc2VjdXRpdmUpO1xuICB9XG5cbiAgY3JlYXRlU2VnbWVudCh0eXBlOiBTZWdtZW50VHlwZSk6IFNlZ21lbnQge1xuICAgIGlmICghL15bQS1aXFxkXXszfSQvLnRlc3QodHlwZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0eXBlJyBbJHt0eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuYXBwZW5kTmV3U2VnbWVudChuZXcgU2VnbWVudCh0eXBlLCB0aGlzLnBhcnNlT3B0aW9ucykpO1xuICB9XG5cbiAgY3JlYXRlU2VnbWVudEFmdGVyKHR5cGU6IFNlZ21lbnRUeXBlLCB0YXJnZXRTZWdtZW50OiBTZWdtZW50KTogU2VnbWVudCB7XG4gICAgaWYgKCEvXltBLVpcXGRdezN9JC8udGVzdCh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3R5cGUnIFske3R5cGV9XWApO1xuICAgIGlmICghdGFyZ2V0U2VnbWVudCB8fCAhKHRhcmdldFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0YXJnZXRTZWdtZW50J2ApO1xuICAgIGlmICh0aGlzLiNkbGwuZ2V0Tm9kZUZyb21TZWdtZW50KHRhcmdldFNlZ21lbnQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAndGFyZ2V0U2VnbWVudCcgWyR7dGFyZ2V0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwuYXBwZW5kTmV3U2VnbWVudChuZXcgU2VnbWVudCh0eXBlLCB0aGlzLnBhcnNlT3B0aW9ucyksIHRhcmdldFNlZ21lbnQpO1xuICB9XG5cbiAgY3JlYXRlU2VnbWVudEJlZm9yZSh0eXBlOiBTZWdtZW50VHlwZSwgdGFyZ2V0U2VnbWVudDogU2VnbWVudCk6IFNlZ21lbnQge1xuICAgIGlmICghL15bQS1aXFxkXXszfSQvLnRlc3QodHlwZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0eXBlJyBbJHt0eXBlfV1gKTtcbiAgICBpZiAoIXRhcmdldFNlZ21lbnQgfHwgISh0YXJnZXRTZWdtZW50IGluc3RhbmNlb2YgU2VnbWVudCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyOiAndGFyZ2V0U2VnbWVudCdgKTtcbiAgICBpZiAodGhpcy4jZGxsLmdldE5vZGVGcm9tU2VnbWVudCh0YXJnZXRTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3N0YXJ0U2VnbWVudCcgWyR7dGFyZ2V0U2VnbWVudC50eXBlfV1gKTtcblxuICAgIHJldHVybiB0aGlzLiNkbGwucHJlcGVuZE5ld1NlZ21lbnQobmV3IFNlZ21lbnQodHlwZSwgdGhpcy5wYXJzZU9wdGlvbnMpLCB0YXJnZXRTZWdtZW50KTtcbiAgfVxuXG4gIGRlbGV0ZVNlZ21lbnQoc2VnbWVudDogU2VnbWVudCkge1xuICAgIHRoaXMuZGVsZXRlU2VnbWVudHMoW3NlZ21lbnRdKTtcbiAgfVxuXG4gIGRlbGV0ZVNlZ21lbnRzKHNlZ21lbnRzOiBTZWdtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGlmICghc2VnbWVudCB8fCAhKHNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3NlZ21lbnRzJ2ApO1xuICAgICAgaWYgKHRoaXMuI2RsbC5nZXROb2RlRnJvbVNlZ21lbnQoc2VnbWVudCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3NlZ21lbnQnIFske3NlZ21lbnQudHlwZX1dYCk7XG5cbiAgICAgIHRoaXMuI2RsbC5kZWxldGVTZWdtZW50KHNlZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVTZWdtZW50QWZ0ZXIoc2VnbWVudDogU2VnbWVudCwgdGFyZ2V0U2VnbWVudDogU2VnbWVudCkge1xuICAgIGlmICghc2VnbWVudCB8fCAhKHNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3NlZ21lbnQnYCk7XG4gICAgaWYgKCF0YXJnZXRTZWdtZW50IHx8ICEodGFyZ2V0U2VnbWVudCBpbnN0YW5jZW9mIFNlZ21lbnQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3RhcmdldFNlZ21lbnQnYCk7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy4jZGxsLmdldE5vZGVGcm9tU2VnbWVudChzZWdtZW50KTtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGhpcy4jZGxsLmdldE5vZGVGcm9tU2VnbWVudCh0YXJnZXRTZWdtZW50KTtcblxuICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9jYXRlOiAnc2VnbWVudCcgWyR7c2VnbWVudC50eXBlfV1gKTtcbiAgICBpZiAoIXRhcmdldE5vZGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3RhcmdldFNlZ21lbnQnIFske3RhcmdldFNlZ21lbnQudHlwZX1dYCk7XG5cbiAgICB0aGlzLiNkbGwubW92ZU5vZGVBZnRlcihub2RlLCB0YXJnZXROb2RlKTtcbiAgfVxuXG4gIG1vdmVTZWdtZW50QmVmb3JlKHNlZ21lbnQ6IFNlZ21lbnQsIHRhcmdldFNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICBpZiAoIXNlZ21lbnQgfHwgIShzZWdtZW50IGluc3RhbmNlb2YgU2VnbWVudCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzZWdtZW50J2ApO1xuICAgIGlmICghdGFyZ2V0U2VnbWVudCB8fCAhKHRhcmdldFNlZ21lbnQgaW5zdGFuY2VvZiBTZWdtZW50KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICd0YXJnZXRTZWdtZW50J2ApO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuI2RsbC5nZXROb2RlRnJvbVNlZ21lbnQoc2VnbWVudCk7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMuI2RsbC5nZXROb2RlRnJvbVNlZ21lbnQodGFyZ2V0U2VnbWVudCk7XG5cbiAgICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvY2F0ZTogJ3NlZ21lbnQnIFske3NlZ21lbnQudHlwZX1dYCk7XG4gICAgaWYgKCF0YXJnZXROb2RlKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2NhdGU6ICd0YXJnZXRTZWdtZW50JyBbJHt0YXJnZXRTZWdtZW50LnR5cGV9XWApO1xuXG4gICAgdGhpcy4jZGxsLm1vdmVOb2RlQmVmb3JlKG5vZGUsIHRhcmdldE5vZGUpO1xuICB9XG5cbiAgcmVpbmRleFNlZ21lbnRzKFxuICAgIHJlaW5kZXhDb25maWc6IFBhcnRpYWw8UmVjb3JkPFNlZ21lbnRUeXBlLCBTZWdtZW50VHlwZVtdPj4sXG4gICAgc3RhcnRJbmRleCA9IDEsXG4gICAgZmllbGQgPSAnMS4xJyxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIXJlaW5kZXhDb25maWcgfHxcbiAgICAgIHR5cGVvZiByZWluZGV4Q29uZmlnICE9PSAnb2JqZWN0JyB8fFxuICAgICAgT2JqZWN0LnZhbHVlcyhyZWluZGV4Q29uZmlnKS5zb21lKCh2YWwpID0+ICFBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtZXRlcjogJ3JlaW5kZXhDb25maWcnYCk7XG4gICAgaWYgKCFzdGFydEluZGV4IHx8IHR5cGVvZiBzdGFydEluZGV4ICE9PSAnbnVtYmVyJylcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdzdGFydEluZGV4JyBbJHtzdGFydEluZGV4fV1gKTtcbiAgICBpZiAoZmllbGQgJiYgIS9eKFxcZCspKFxcLlxcZCspezAsMX0kLy50ZXN0KGZpZWxkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJhbWV0ZXI6ICdmaWVsZCcgWyR7ZmllbGR9XWApO1xuXG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLmdldFNlZ21lbnRzKCk7XG4gICAgY29uc3QgaW5kZXhNYXA6IFBhcnRpYWw8UmVjb3JkPFNlZ21lbnRUeXBlLCBudW1iZXI+PiA9IHt9O1xuICAgIGNvbnN0IGluZGV4UmVzZXRUcmlnZ2VyTWFwOiBQYXJ0aWFsPFJlY29yZDxTZWdtZW50VHlwZSwgU2VnbWVudFR5cGVbXT4+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtzZWcsIHJlc2V0VHJpZ2dlclNlZ3NdIG9mIE9iamVjdC5lbnRyaWVzKHJlaW5kZXhDb25maWcpKSB7XG4gICAgICBpbmRleE1hcFtzZWddID0gc3RhcnRJbmRleDtcblxuICAgICAgaWYgKHJlc2V0VHJpZ2dlclNlZ3MpXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc2V0VHJpZ2dlclNlZ3MpIChpbmRleFJlc2V0VHJpZ2dlck1hcFtrZXldID8/PSBbXSkucHVzaChzZWcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgICAgaWYgKHJlaW5kZXhDb25maWdbc2VnbWVudC50eXBlXSkge1xuICAgICAgICBzZWdtZW50LnNldChgJHtzZWdtZW50LnR5cGV9LiR7ZmllbGR9YCwgU3RyaW5nKGluZGV4TWFwW3NlZ21lbnQudHlwZV0rKykpO1xuXG4gICAgICAgIGlmIChpbmRleFJlc2V0VHJpZ2dlck1hcFtzZWdtZW50LnR5cGVdKVxuICAgICAgICAgIGZvciAoY29uc3Qgc2VnIG9mIGluZGV4UmVzZXRUcmlnZ2VyTWFwW3NlZ21lbnQudHlwZV0hKSBpbmRleE1hcFtzZWddID0gc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlU2VnbWVudChzZWdtZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoL15bQS1aXFxkXXszfVxcfC8udGVzdChzZWdtZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFNlZ21lbnQ6IFske3NlZ21lbnQuc3Vic3RyaW5nKDAsIDQpfV1gKTtcbiAgfVxufVxuIl19
|