state-sync-log 0.9.0 → 0.10.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/CHANGELOG.md +5 -0
- package/README.md +368 -277
- package/dist/state-sync-log.esm.js +929 -136
- package/dist/state-sync-log.esm.mjs +929 -136
- package/dist/state-sync-log.umd.js +928 -135
- package/dist/types/createOps/constant.d.ts +6 -0
- package/dist/types/createOps/createOps.d.ts +25 -0
- package/dist/types/createOps/current.d.ts +13 -0
- package/dist/types/createOps/draft.d.ts +14 -0
- package/dist/types/createOps/draftify.d.ts +5 -0
- package/dist/types/createOps/index.d.ts +12 -0
- package/dist/types/createOps/interface.d.ts +74 -0
- package/dist/types/createOps/original.d.ts +15 -0
- package/dist/types/createOps/pushOp.d.ts +9 -0
- package/dist/types/createOps/setHelpers.d.ts +25 -0
- package/dist/types/createOps/utils.d.ts +95 -0
- package/dist/types/draft.d.ts +2 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/json.d.ts +1 -1
- package/dist/types/operations.d.ts +2 -2
- package/dist/types/utils.d.ts +5 -0
- package/package.json +1 -1
- package/src/createOps/constant.ts +10 -0
- package/src/createOps/createOps.ts +97 -0
- package/src/createOps/current.ts +85 -0
- package/src/createOps/draft.ts +606 -0
- package/src/createOps/draftify.ts +45 -0
- package/src/createOps/index.ts +18 -0
- package/src/createOps/interface.ts +95 -0
- package/src/createOps/original.ts +24 -0
- package/src/createOps/pushOp.ts +42 -0
- package/src/createOps/setHelpers.ts +93 -0
- package/src/createOps/utils.ts +325 -0
- package/src/draft.ts +306 -288
- package/src/index.ts +1 -0
- package/src/json.ts +1 -1
- package/src/operations.ts +33 -11
- package/src/utils.ts +67 -55
|
@@ -5,28 +5,6 @@
|
|
|
5
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
6
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
7
|
|
|
8
|
-
function getFinalizedEpochAndCheckpoint(yCheckpoint) {
|
|
9
|
-
let maxEpoch = -1;
|
|
10
|
-
let best = null;
|
|
11
|
-
let bestTxCount = -1;
|
|
12
|
-
let bestClientId = "";
|
|
13
|
-
for (const [key, cp] of yCheckpoint.entries()) {
|
|
14
|
-
const { epoch, clientId } = parseCheckpointKey(key);
|
|
15
|
-
if (epoch > maxEpoch) {
|
|
16
|
-
maxEpoch = epoch;
|
|
17
|
-
best = cp;
|
|
18
|
-
bestTxCount = cp.txCount;
|
|
19
|
-
bestClientId = clientId;
|
|
20
|
-
} else if (epoch === maxEpoch) {
|
|
21
|
-
if (cp.txCount > bestTxCount || cp.txCount === bestTxCount && clientId < bestClientId) {
|
|
22
|
-
best = cp;
|
|
23
|
-
bestTxCount = cp.txCount;
|
|
24
|
-
bestClientId = clientId;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return { finalizedEpoch: maxEpoch, checkpoint: best };
|
|
29
|
-
}
|
|
30
8
|
class StateSyncLogError extends Error {
|
|
31
9
|
constructor(msg) {
|
|
32
10
|
super(msg);
|
|
@@ -36,88 +14,232 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
36
14
|
function failure(message) {
|
|
37
15
|
throw new StateSyncLogError(message);
|
|
38
16
|
}
|
|
39
|
-
|
|
40
|
-
|
|
17
|
+
const PROXY_DRAFT = /* @__PURE__ */ Symbol.for("__CREATEOPS_PROXY_DRAFT__");
|
|
18
|
+
var DraftType = /* @__PURE__ */ ((DraftType2) => {
|
|
19
|
+
DraftType2[DraftType2["Object"] = 0] = "Object";
|
|
20
|
+
DraftType2[DraftType2["Array"] = 1] = "Array";
|
|
21
|
+
return DraftType2;
|
|
22
|
+
})(DraftType || {});
|
|
23
|
+
function latest(proxyDraft) {
|
|
24
|
+
var _a;
|
|
25
|
+
return (_a = proxyDraft.copy) != null ? _a : proxyDraft.original;
|
|
41
26
|
}
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
27
|
+
function isDraft(target) {
|
|
28
|
+
return !!getProxyDraft(target);
|
|
29
|
+
}
|
|
30
|
+
function getProxyDraft(value) {
|
|
31
|
+
var _a;
|
|
32
|
+
if (typeof value !== "object" || value === null) return null;
|
|
33
|
+
return (_a = value[PROXY_DRAFT]) != null ? _a : null;
|
|
34
|
+
}
|
|
35
|
+
function getValue(value) {
|
|
36
|
+
var _a;
|
|
37
|
+
const proxyDraft = getProxyDraft(value);
|
|
38
|
+
return proxyDraft ? (_a = proxyDraft.copy) != null ? _a : proxyDraft.original : value;
|
|
39
|
+
}
|
|
40
|
+
function isDraftable(value) {
|
|
41
|
+
if (value === null || typeof value !== "object") return false;
|
|
42
|
+
return Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype;
|
|
43
|
+
}
|
|
44
|
+
function getType(target) {
|
|
45
|
+
return Array.isArray(target) ? DraftType.Array : DraftType.Object;
|
|
46
|
+
}
|
|
47
|
+
function get(target, key) {
|
|
48
|
+
return target[key];
|
|
49
|
+
}
|
|
50
|
+
function set(target, key, value) {
|
|
51
|
+
target[key] = value;
|
|
52
|
+
}
|
|
53
|
+
function has(target, key) {
|
|
54
|
+
return Object.hasOwn(target, key);
|
|
55
|
+
}
|
|
56
|
+
function peek(target, key) {
|
|
57
|
+
const state = getProxyDraft(target);
|
|
58
|
+
const source = state ? latest(state) : target;
|
|
59
|
+
return source[key];
|
|
60
|
+
}
|
|
61
|
+
function isEqual(x, y) {
|
|
62
|
+
if (x === y) {
|
|
63
|
+
return x !== 0 || 1 / x === 1 / y;
|
|
47
64
|
}
|
|
48
|
-
return
|
|
49
|
-
epoch: Number.parseInt(key.substring(0, i1), 10),
|
|
50
|
-
txCount: Number.parseInt(key.substring(i1 + 1, i2), 10),
|
|
51
|
-
clientId: key.substring(i2 + 1)
|
|
52
|
-
};
|
|
65
|
+
return x !== x && y !== y;
|
|
53
66
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
while (endIndex > 0 && sortedTxs[endIndex - 1].txTimestamp.epoch > activeEpoch) {
|
|
60
|
-
endIndex--;
|
|
67
|
+
function revokeProxy(proxyDraft) {
|
|
68
|
+
if (!proxyDraft) return;
|
|
69
|
+
while (proxyDraft.finalities.revoke.length > 0) {
|
|
70
|
+
const revoke = proxyDraft.finalities.revoke.pop();
|
|
71
|
+
revoke();
|
|
61
72
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
}
|
|
74
|
+
function getPath(target, path = []) {
|
|
75
|
+
var _a;
|
|
76
|
+
if (Object.hasOwn(target, "key") && target.key !== void 0) {
|
|
77
|
+
const parentCopy = (_a = target.parent) == null ? void 0 : _a.copy;
|
|
78
|
+
if (parentCopy) {
|
|
79
|
+
const proxyDraft = getProxyDraft(get(parentCopy, target.key));
|
|
80
|
+
if (proxyDraft !== null && proxyDraft.original !== target.original) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
path.push(target.key);
|
|
65
85
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
86
|
+
if (target.parent) {
|
|
87
|
+
return getPath(target.parent, path);
|
|
88
|
+
}
|
|
89
|
+
path.reverse();
|
|
90
|
+
return path;
|
|
91
|
+
}
|
|
92
|
+
function getPathOrThrow(target) {
|
|
93
|
+
const path = getPath(target);
|
|
94
|
+
if (!path) {
|
|
95
|
+
throw failure("Cannot determine path for operation");
|
|
96
|
+
}
|
|
97
|
+
return path;
|
|
98
|
+
}
|
|
99
|
+
function getAllPathsForDraft(rootDraft, targetDraft) {
|
|
100
|
+
const result = [];
|
|
101
|
+
function search(current2, currentPath) {
|
|
102
|
+
if (current2 === targetDraft) {
|
|
103
|
+
result.push([...currentPath]);
|
|
72
104
|
}
|
|
73
|
-
const
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
105
|
+
const source = latest(current2);
|
|
106
|
+
if (!source || typeof source !== "object") return;
|
|
107
|
+
const keys = Array.isArray(source) ? Array.from({ length: source.length }, (_, i) => i) : Object.keys(source);
|
|
108
|
+
for (const key of keys) {
|
|
109
|
+
const value = source[key];
|
|
110
|
+
const childDraft = getProxyDraft(value);
|
|
111
|
+
if (childDraft) {
|
|
112
|
+
search(childDraft, [...currentPath, key]);
|
|
113
|
+
}
|
|
77
114
|
}
|
|
78
|
-
newWatermarks[ts.clientId] = newWm;
|
|
79
|
-
txCount++;
|
|
80
115
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
116
|
+
search(rootDraft, []);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
function getDescriptor(target, key) {
|
|
120
|
+
if (key in target) {
|
|
121
|
+
let prototype = Reflect.getPrototypeOf(target);
|
|
122
|
+
while (prototype) {
|
|
123
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(prototype, key);
|
|
124
|
+
if (descriptor) return descriptor;
|
|
125
|
+
prototype = Reflect.getPrototypeOf(prototype);
|
|
84
126
|
}
|
|
85
127
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
keysToDelete.push(entry.txTimestampKey);
|
|
128
|
+
return void 0;
|
|
129
|
+
}
|
|
130
|
+
const propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
131
|
+
function shallowCopy(original2) {
|
|
132
|
+
if (Array.isArray(original2)) {
|
|
133
|
+
return Array.prototype.concat.call(original2);
|
|
134
|
+
}
|
|
135
|
+
const copy = {};
|
|
136
|
+
for (const key of Object.keys(original2)) {
|
|
137
|
+
copy[key] = original2[key];
|
|
138
|
+
}
|
|
139
|
+
for (const key of Object.getOwnPropertySymbols(original2)) {
|
|
140
|
+
if (propIsEnum.call(original2, key)) {
|
|
141
|
+
copy[key] = original2[key];
|
|
142
|
+
}
|
|
102
143
|
}
|
|
103
|
-
|
|
144
|
+
return copy;
|
|
104
145
|
}
|
|
105
|
-
function
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
146
|
+
function ensureShallowCopy(target) {
|
|
147
|
+
var _a;
|
|
148
|
+
if (target.copy) return;
|
|
149
|
+
target.copy = shallowCopy(target.original);
|
|
150
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
151
|
+
}
|
|
152
|
+
function deepClone$1(target) {
|
|
153
|
+
if (!isDraftable(target)) {
|
|
154
|
+
return isDraft(target) ? getValue(target) : target;
|
|
155
|
+
}
|
|
156
|
+
if (Array.isArray(target)) {
|
|
157
|
+
return target.map(deepClone$1);
|
|
158
|
+
}
|
|
159
|
+
const copy = {};
|
|
160
|
+
for (const key in target) {
|
|
161
|
+
if (has(target, key)) {
|
|
162
|
+
copy[key] = deepClone$1(target[key]);
|
|
113
163
|
}
|
|
114
164
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
165
|
+
return copy;
|
|
166
|
+
}
|
|
167
|
+
function markChanged(target) {
|
|
168
|
+
if (!target.operated) {
|
|
169
|
+
target.operated = true;
|
|
170
|
+
if (target.parent) {
|
|
171
|
+
markChanged(target.parent);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function forEach(target, callback) {
|
|
176
|
+
if (Array.isArray(target)) {
|
|
177
|
+
for (let i = 0; i < target.length; i++) {
|
|
178
|
+
callback(i, target[i], target);
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
for (const key of Reflect.ownKeys(target)) {
|
|
182
|
+
callback(key, target[key], target);
|
|
118
183
|
}
|
|
119
184
|
}
|
|
120
185
|
}
|
|
186
|
+
function handleValue(target, handledSet) {
|
|
187
|
+
if (!isDraftable(target) || isDraft(target) || handledSet.has(target) || Object.isFrozen(target)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
handledSet.add(target);
|
|
191
|
+
forEach(target, (key, value) => {
|
|
192
|
+
var _a;
|
|
193
|
+
if (isDraft(value)) {
|
|
194
|
+
const proxyDraft = getProxyDraft(value);
|
|
195
|
+
ensureShallowCopy(proxyDraft);
|
|
196
|
+
const updatedValue = ((_a = proxyDraft.assignedMap) == null ? void 0 : _a.size) || proxyDraft.operated ? proxyDraft.copy : proxyDraft.original;
|
|
197
|
+
set(target, key, updatedValue);
|
|
198
|
+
} else {
|
|
199
|
+
handleValue(value, handledSet);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
function getCurrent(target) {
|
|
204
|
+
const proxyDraft = getProxyDraft(target);
|
|
205
|
+
if (!isDraftable(target)) return target;
|
|
206
|
+
if (proxyDraft && !proxyDraft.operated) {
|
|
207
|
+
return proxyDraft.original;
|
|
208
|
+
}
|
|
209
|
+
let currentValue;
|
|
210
|
+
function ensureShallowCopyLocal() {
|
|
211
|
+
currentValue = shallowCopy(target);
|
|
212
|
+
}
|
|
213
|
+
if (proxyDraft) {
|
|
214
|
+
proxyDraft.finalized = true;
|
|
215
|
+
try {
|
|
216
|
+
ensureShallowCopyLocal();
|
|
217
|
+
} finally {
|
|
218
|
+
proxyDraft.finalized = false;
|
|
219
|
+
}
|
|
220
|
+
} else {
|
|
221
|
+
currentValue = target;
|
|
222
|
+
}
|
|
223
|
+
forEach(currentValue, (key, value) => {
|
|
224
|
+
if (proxyDraft && isEqual(get(proxyDraft.original, key), value)) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const newValue = getCurrent(value);
|
|
228
|
+
if (newValue !== value) {
|
|
229
|
+
if (currentValue === target) {
|
|
230
|
+
ensureShallowCopyLocal();
|
|
231
|
+
}
|
|
232
|
+
set(currentValue, key, newValue);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
return currentValue;
|
|
236
|
+
}
|
|
237
|
+
function current(target) {
|
|
238
|
+
if (!isDraft(target)) {
|
|
239
|
+
throw new Error(`current() is only used for Draft, parameter: ${target}`);
|
|
240
|
+
}
|
|
241
|
+
return getCurrent(target);
|
|
242
|
+
}
|
|
121
243
|
function getDefaultExportFromCjs(x) {
|
|
122
244
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
123
245
|
}
|
|
@@ -385,6 +507,636 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
385
507
|
return value;
|
|
386
508
|
};
|
|
387
509
|
}
|
|
510
|
+
function parseArrayIndex(key) {
|
|
511
|
+
const n = Number(key);
|
|
512
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
return n;
|
|
516
|
+
}
|
|
517
|
+
function pushOp(proxyDraft, op) {
|
|
518
|
+
const rootDraft = proxyDraft.finalities.rootDraft;
|
|
519
|
+
if (!rootDraft) {
|
|
520
|
+
throw failure("rootDraft is not set - cannot emit op");
|
|
521
|
+
}
|
|
522
|
+
if (proxyDraft.aliasCount <= 1) {
|
|
523
|
+
proxyDraft.finalities.ops.push(op);
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
const allPaths = getAllPathsForDraft(rootDraft, proxyDraft);
|
|
527
|
+
for (const path of allPaths) {
|
|
528
|
+
const adjustedOp = { ...op, path };
|
|
529
|
+
proxyDraft.finalities.ops.push(adjustedOp);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
function incAliasCount(value) {
|
|
533
|
+
const draft = getProxyDraft(value);
|
|
534
|
+
if (draft) draft.aliasCount++;
|
|
535
|
+
}
|
|
536
|
+
function decAliasCount(value) {
|
|
537
|
+
const draft = getProxyDraft(value);
|
|
538
|
+
if (draft) draft.aliasCount--;
|
|
539
|
+
}
|
|
540
|
+
function normalizeIndex(index, len, defaultValue) {
|
|
541
|
+
if (index === void 0) return defaultValue;
|
|
542
|
+
return index < 0 ? Math.max(len + index, 0) : Math.min(index, len);
|
|
543
|
+
}
|
|
544
|
+
const MUTATING_ARRAY_METHODS = /* @__PURE__ */ new Set([
|
|
545
|
+
"push",
|
|
546
|
+
"pop",
|
|
547
|
+
"shift",
|
|
548
|
+
"unshift",
|
|
549
|
+
"splice",
|
|
550
|
+
"sort",
|
|
551
|
+
"reverse",
|
|
552
|
+
"fill",
|
|
553
|
+
"copyWithin"
|
|
554
|
+
]);
|
|
555
|
+
function createArrayMethodWrapper(proxyDraft, proxyRef, method) {
|
|
556
|
+
return function(...args) {
|
|
557
|
+
ensureShallowCopy(proxyDraft);
|
|
558
|
+
markChanged(proxyDraft);
|
|
559
|
+
const arr = proxyDraft.copy;
|
|
560
|
+
const originalLength = arr.length;
|
|
561
|
+
const proxy = proxyRef;
|
|
562
|
+
switch (method) {
|
|
563
|
+
case "push": {
|
|
564
|
+
for (const arg of args) {
|
|
565
|
+
incAliasCount(arg);
|
|
566
|
+
}
|
|
567
|
+
const result = arr.push(...args);
|
|
568
|
+
pushOp(proxyDraft, {
|
|
569
|
+
kind: "splice",
|
|
570
|
+
path: getPathOrThrow(proxyDraft),
|
|
571
|
+
index: originalLength,
|
|
572
|
+
deleteCount: 0,
|
|
573
|
+
inserts: args.map(deepClone$1)
|
|
574
|
+
});
|
|
575
|
+
return result;
|
|
576
|
+
}
|
|
577
|
+
case "pop": {
|
|
578
|
+
if (originalLength === 0) {
|
|
579
|
+
return arr.pop();
|
|
580
|
+
}
|
|
581
|
+
const returnValue = proxy[originalLength - 1];
|
|
582
|
+
decAliasCount(arr[originalLength - 1]);
|
|
583
|
+
arr.pop();
|
|
584
|
+
pushOp(proxyDraft, {
|
|
585
|
+
kind: "splice",
|
|
586
|
+
path: getPathOrThrow(proxyDraft),
|
|
587
|
+
index: originalLength - 1,
|
|
588
|
+
deleteCount: 1,
|
|
589
|
+
inserts: []
|
|
590
|
+
});
|
|
591
|
+
return returnValue;
|
|
592
|
+
}
|
|
593
|
+
case "shift": {
|
|
594
|
+
if (originalLength === 0) {
|
|
595
|
+
return arr.shift();
|
|
596
|
+
}
|
|
597
|
+
const returnValue = proxy[0];
|
|
598
|
+
decAliasCount(arr[0]);
|
|
599
|
+
arr.shift();
|
|
600
|
+
pushOp(proxyDraft, {
|
|
601
|
+
kind: "splice",
|
|
602
|
+
path: getPathOrThrow(proxyDraft),
|
|
603
|
+
index: 0,
|
|
604
|
+
deleteCount: 1,
|
|
605
|
+
inserts: []
|
|
606
|
+
});
|
|
607
|
+
return returnValue;
|
|
608
|
+
}
|
|
609
|
+
case "unshift": {
|
|
610
|
+
for (const arg of args) {
|
|
611
|
+
incAliasCount(arg);
|
|
612
|
+
}
|
|
613
|
+
const result = arr.unshift(...args);
|
|
614
|
+
pushOp(proxyDraft, {
|
|
615
|
+
kind: "splice",
|
|
616
|
+
path: getPathOrThrow(proxyDraft),
|
|
617
|
+
index: 0,
|
|
618
|
+
deleteCount: 0,
|
|
619
|
+
inserts: args.map(deepClone$1)
|
|
620
|
+
});
|
|
621
|
+
return result;
|
|
622
|
+
}
|
|
623
|
+
case "splice": {
|
|
624
|
+
const start = args[0];
|
|
625
|
+
const deleteCountArg = args[1];
|
|
626
|
+
const inserts = args.slice(2);
|
|
627
|
+
const index = start === void 0 ? 0 : start < 0 ? Math.max(originalLength + start, 0) : start;
|
|
628
|
+
const deleteCount = deleteCountArg != null ? deleteCountArg : originalLength - index;
|
|
629
|
+
const returnValues = [];
|
|
630
|
+
for (let i = 0; i < deleteCount && index + i < originalLength; i++) {
|
|
631
|
+
returnValues.push(proxy[index + i]);
|
|
632
|
+
decAliasCount(arr[index + i]);
|
|
633
|
+
}
|
|
634
|
+
for (const insert of inserts) {
|
|
635
|
+
incAliasCount(insert);
|
|
636
|
+
}
|
|
637
|
+
arr.splice(...args);
|
|
638
|
+
pushOp(proxyDraft, {
|
|
639
|
+
kind: "splice",
|
|
640
|
+
path: getPathOrThrow(proxyDraft),
|
|
641
|
+
index: start != null ? start : 0,
|
|
642
|
+
deleteCount: deleteCountArg != null ? deleteCountArg : originalLength,
|
|
643
|
+
inserts: inserts.map(deepClone$1)
|
|
644
|
+
});
|
|
645
|
+
return returnValues;
|
|
646
|
+
}
|
|
647
|
+
case "fill": {
|
|
648
|
+
const fillValue = args[0];
|
|
649
|
+
const startArg = args[1];
|
|
650
|
+
const endArg = args[2];
|
|
651
|
+
const len = originalLength;
|
|
652
|
+
const start = normalizeIndex(startArg, len, 0);
|
|
653
|
+
const end = normalizeIndex(endArg, len, len);
|
|
654
|
+
const fillCount = end - start;
|
|
655
|
+
if (fillCount > 0) {
|
|
656
|
+
const fillValues = Array(fillCount).fill(fillValue);
|
|
657
|
+
proxy.splice(start, fillCount, ...fillValues);
|
|
658
|
+
}
|
|
659
|
+
return proxy;
|
|
660
|
+
}
|
|
661
|
+
case "sort": {
|
|
662
|
+
const compareFn = args[0];
|
|
663
|
+
const sorted = [...arr].sort(compareFn);
|
|
664
|
+
if (originalLength > 0) {
|
|
665
|
+
proxy.splice(0, originalLength, ...sorted);
|
|
666
|
+
}
|
|
667
|
+
return proxy;
|
|
668
|
+
}
|
|
669
|
+
case "reverse": {
|
|
670
|
+
const reversed = [...arr].reverse();
|
|
671
|
+
if (originalLength > 0) {
|
|
672
|
+
proxy.splice(0, originalLength, ...reversed);
|
|
673
|
+
}
|
|
674
|
+
return proxy;
|
|
675
|
+
}
|
|
676
|
+
case "copyWithin": {
|
|
677
|
+
const targetArg = args[0];
|
|
678
|
+
const startArg = args[1];
|
|
679
|
+
const endArg = args[2];
|
|
680
|
+
const len = originalLength;
|
|
681
|
+
const targetIdx = normalizeIndex(targetArg, len, 0);
|
|
682
|
+
const startIdx = normalizeIndex(startArg, len, 0);
|
|
683
|
+
const endIdx = normalizeIndex(endArg, len, len);
|
|
684
|
+
const copyCount = Math.min(endIdx - startIdx, len - targetIdx);
|
|
685
|
+
if (copyCount > 0) {
|
|
686
|
+
const elementsToCopy = arr.slice(startIdx, startIdx + copyCount);
|
|
687
|
+
proxy.splice(targetIdx, copyCount, ...elementsToCopy);
|
|
688
|
+
}
|
|
689
|
+
return proxy;
|
|
690
|
+
}
|
|
691
|
+
default:
|
|
692
|
+
return arr[method](...args);
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
const proxyHandler = {
|
|
697
|
+
get(target, key, receiver) {
|
|
698
|
+
var _a, _b;
|
|
699
|
+
const copy = (_a = target.copy) == null ? void 0 : _a[key];
|
|
700
|
+
if (copy && target.finalities.draftsCache.has(copy)) {
|
|
701
|
+
return copy;
|
|
702
|
+
}
|
|
703
|
+
if (key === PROXY_DRAFT) return target;
|
|
704
|
+
const source = latest(target);
|
|
705
|
+
if (target.type === DraftType.Array && typeof key === "string" && MUTATING_ARRAY_METHODS.has(key)) {
|
|
706
|
+
const originalMethod = source[key];
|
|
707
|
+
if (typeof originalMethod === "function") {
|
|
708
|
+
return createArrayMethodWrapper(target, receiver, key);
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
if (!has(source, key)) {
|
|
712
|
+
const desc = getDescriptor(source, key);
|
|
713
|
+
return desc ? "value" in desc ? desc.value : (_b = desc.get) == null ? void 0 : _b.call(target.proxy) : void 0;
|
|
714
|
+
}
|
|
715
|
+
const value = source[key];
|
|
716
|
+
if (target.finalized || !isDraftable(value)) {
|
|
717
|
+
return value;
|
|
718
|
+
}
|
|
719
|
+
if (value === peek(target.original, key)) {
|
|
720
|
+
ensureShallowCopy(target);
|
|
721
|
+
const nestedKey = target.type === DraftType.Array ? Number(key) : key;
|
|
722
|
+
target.copy[key] = createDraft$1({
|
|
723
|
+
original: target.original[key],
|
|
724
|
+
parentDraft: target,
|
|
725
|
+
key: nestedKey,
|
|
726
|
+
finalities: target.finalities
|
|
727
|
+
});
|
|
728
|
+
return target.copy[key];
|
|
729
|
+
}
|
|
730
|
+
if (isDraft(value)) {
|
|
731
|
+
target.finalities.draftsCache.add(value);
|
|
732
|
+
}
|
|
733
|
+
return value;
|
|
734
|
+
},
|
|
735
|
+
set(target, key, value) {
|
|
736
|
+
var _a;
|
|
737
|
+
if (typeof key === "symbol") {
|
|
738
|
+
throw new Error(`Cannot set symbol properties on drafts`);
|
|
739
|
+
}
|
|
740
|
+
let opKey = key;
|
|
741
|
+
if (target.type === DraftType.Array) {
|
|
742
|
+
if (key === "length") {
|
|
743
|
+
opKey = "length";
|
|
744
|
+
} else {
|
|
745
|
+
const numKey = typeof key === "number" ? key : parseArrayIndex(key);
|
|
746
|
+
if (numKey === null) {
|
|
747
|
+
throw new Error(`Only supports setting array indices and the 'length' property.`);
|
|
748
|
+
}
|
|
749
|
+
opKey = numKey;
|
|
750
|
+
const source = latest(target);
|
|
751
|
+
if (numKey > source.length) {
|
|
752
|
+
throw new Error(
|
|
753
|
+
`Cannot create sparse array. Index ${numKey} is out of bounds for array of length ${source.length}.`
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
const desc = getDescriptor(latest(target), key);
|
|
759
|
+
if (desc == null ? void 0 : desc.set) {
|
|
760
|
+
desc.set.call(target.proxy, value);
|
|
761
|
+
return true;
|
|
762
|
+
}
|
|
763
|
+
const current2 = peek(latest(target), key);
|
|
764
|
+
const currentProxyDraft = getProxyDraft(current2);
|
|
765
|
+
if (currentProxyDraft && isEqual(currentProxyDraft.original, value)) {
|
|
766
|
+
target.copy[key] = value;
|
|
767
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
768
|
+
target.assignedMap.set(key, false);
|
|
769
|
+
return true;
|
|
770
|
+
}
|
|
771
|
+
if (isEqual(value, current2) && (value !== void 0 || has(target.original, key))) {
|
|
772
|
+
return true;
|
|
773
|
+
}
|
|
774
|
+
ensureShallowCopy(target);
|
|
775
|
+
markChanged(target);
|
|
776
|
+
if (has(target.original, key) && isEqual(value, target.original[key])) {
|
|
777
|
+
target.assignedMap.delete(key);
|
|
778
|
+
} else {
|
|
779
|
+
target.assignedMap.set(key, true);
|
|
780
|
+
}
|
|
781
|
+
const copy = target.copy;
|
|
782
|
+
decAliasCount(copy[key]);
|
|
783
|
+
incAliasCount(value);
|
|
784
|
+
copy[key] = value;
|
|
785
|
+
if (target.type === DraftType.Array && opKey === "length") {
|
|
786
|
+
const oldLength = target.original.length;
|
|
787
|
+
const newLength = value;
|
|
788
|
+
if (newLength !== oldLength) {
|
|
789
|
+
pushOp(target, {
|
|
790
|
+
kind: "set",
|
|
791
|
+
path: getPathOrThrow(target),
|
|
792
|
+
key: "length",
|
|
793
|
+
value: newLength
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
} else {
|
|
797
|
+
pushOp(target, {
|
|
798
|
+
kind: "set",
|
|
799
|
+
path: getPathOrThrow(target),
|
|
800
|
+
key: opKey,
|
|
801
|
+
value: deepClone$1(value)
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
return true;
|
|
805
|
+
},
|
|
806
|
+
has(target, key) {
|
|
807
|
+
return key in latest(target);
|
|
808
|
+
},
|
|
809
|
+
ownKeys(target) {
|
|
810
|
+
return Reflect.ownKeys(latest(target));
|
|
811
|
+
},
|
|
812
|
+
getOwnPropertyDescriptor(target, key) {
|
|
813
|
+
const source = latest(target);
|
|
814
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(source, key);
|
|
815
|
+
if (!descriptor) return descriptor;
|
|
816
|
+
return {
|
|
817
|
+
writable: true,
|
|
818
|
+
configurable: target.type !== DraftType.Array || key !== "length",
|
|
819
|
+
enumerable: descriptor.enumerable,
|
|
820
|
+
value: source[key]
|
|
821
|
+
};
|
|
822
|
+
},
|
|
823
|
+
getPrototypeOf(target) {
|
|
824
|
+
return Reflect.getPrototypeOf(target.original);
|
|
825
|
+
},
|
|
826
|
+
setPrototypeOf() {
|
|
827
|
+
throw new Error(`Cannot call 'setPrototypeOf()' on drafts`);
|
|
828
|
+
},
|
|
829
|
+
defineProperty() {
|
|
830
|
+
throw new Error(`Cannot call 'defineProperty()' on drafts`);
|
|
831
|
+
},
|
|
832
|
+
deleteProperty(target, key) {
|
|
833
|
+
var _a;
|
|
834
|
+
if (typeof key === "symbol") {
|
|
835
|
+
throw new Error(`Cannot delete symbol properties from drafts`);
|
|
836
|
+
}
|
|
837
|
+
if (target.type === DraftType.Array) {
|
|
838
|
+
return proxyHandler.set.call(this, target, key, void 0, target.proxy);
|
|
839
|
+
}
|
|
840
|
+
const current2 = peek(latest(target), key);
|
|
841
|
+
const existed = current2 !== void 0 || key in target.original;
|
|
842
|
+
if (existed) {
|
|
843
|
+
ensureShallowCopy(target);
|
|
844
|
+
markChanged(target);
|
|
845
|
+
target.assignedMap.set(key, false);
|
|
846
|
+
pushOp(target, {
|
|
847
|
+
kind: "delete",
|
|
848
|
+
path: getPathOrThrow(target),
|
|
849
|
+
key
|
|
850
|
+
});
|
|
851
|
+
const copy = target.copy;
|
|
852
|
+
decAliasCount(copy[key]);
|
|
853
|
+
delete copy[key];
|
|
854
|
+
} else {
|
|
855
|
+
target.assignedMap = (_a = target.assignedMap) != null ? _a : /* @__PURE__ */ new Map();
|
|
856
|
+
target.assignedMap.delete(key);
|
|
857
|
+
}
|
|
858
|
+
return true;
|
|
859
|
+
}
|
|
860
|
+
};
|
|
861
|
+
function createDraft$1(options) {
|
|
862
|
+
const { original: original2, parentDraft, key, finalities } = options;
|
|
863
|
+
const type = getType(original2);
|
|
864
|
+
const proxyDraft = {
|
|
865
|
+
type,
|
|
866
|
+
finalized: false,
|
|
867
|
+
parent: parentDraft != null ? parentDraft : null,
|
|
868
|
+
original: original2,
|
|
869
|
+
copy: null,
|
|
870
|
+
proxy: null,
|
|
871
|
+
finalities,
|
|
872
|
+
aliasCount: 1
|
|
873
|
+
};
|
|
874
|
+
if (key !== void 0 || "key" in options) {
|
|
875
|
+
proxyDraft.key = key;
|
|
876
|
+
}
|
|
877
|
+
const { proxy, revoke } = Proxy.revocable(
|
|
878
|
+
type === DraftType.Array ? Object.assign([], proxyDraft) : proxyDraft,
|
|
879
|
+
proxyHandler
|
|
880
|
+
);
|
|
881
|
+
finalities.revoke.push(revoke);
|
|
882
|
+
proxyDraft.proxy = proxy;
|
|
883
|
+
if (parentDraft) {
|
|
884
|
+
parentDraft.finalities.draft.push(() => {
|
|
885
|
+
const copy = parentDraft.copy;
|
|
886
|
+
if (!copy) return;
|
|
887
|
+
const draft = get(copy, key);
|
|
888
|
+
const childProxyDraft = getProxyDraft(draft);
|
|
889
|
+
if (childProxyDraft) {
|
|
890
|
+
let updatedValue = childProxyDraft.original;
|
|
891
|
+
if (childProxyDraft.operated) {
|
|
892
|
+
updatedValue = getValue(draft);
|
|
893
|
+
}
|
|
894
|
+
childProxyDraft.finalized = true;
|
|
895
|
+
set(copy, key, updatedValue);
|
|
896
|
+
}
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
return proxy;
|
|
900
|
+
}
|
|
901
|
+
function finalizeDraft(result, returnedValue) {
|
|
902
|
+
var _a;
|
|
903
|
+
const proxyDraft = getProxyDraft(result);
|
|
904
|
+
const hasReturnedValue = returnedValue.length > 0;
|
|
905
|
+
if (proxyDraft == null ? void 0 : proxyDraft.operated) {
|
|
906
|
+
while (proxyDraft.finalities.draft.length > 0) {
|
|
907
|
+
const finalize = proxyDraft.finalities.draft.pop();
|
|
908
|
+
finalize();
|
|
909
|
+
}
|
|
910
|
+
proxyDraft.finalized = true;
|
|
911
|
+
}
|
|
912
|
+
const state = hasReturnedValue ? returnedValue[0] : proxyDraft ? proxyDraft.operated ? proxyDraft.copy : proxyDraft.original : result;
|
|
913
|
+
if (proxyDraft && state && typeof state === "object") {
|
|
914
|
+
handleValue(state, proxyDraft.finalities.handledSet);
|
|
915
|
+
}
|
|
916
|
+
const ops = (_a = proxyDraft == null ? void 0 : proxyDraft.finalities.ops) != null ? _a : [];
|
|
917
|
+
if (proxyDraft) {
|
|
918
|
+
revokeProxy(proxyDraft);
|
|
919
|
+
}
|
|
920
|
+
return [state, ops];
|
|
921
|
+
}
|
|
922
|
+
function draftify(baseState) {
|
|
923
|
+
const finalities = {
|
|
924
|
+
draft: [],
|
|
925
|
+
revoke: [],
|
|
926
|
+
handledSet: /* @__PURE__ */ new WeakSet(),
|
|
927
|
+
draftsCache: /* @__PURE__ */ new WeakSet(),
|
|
928
|
+
ops: [],
|
|
929
|
+
rootDraft: null
|
|
930
|
+
// Will be set by createDraft
|
|
931
|
+
};
|
|
932
|
+
if (!isDraftable(baseState)) {
|
|
933
|
+
throw new Error(`createOps() only supports plain objects and arrays.`);
|
|
934
|
+
}
|
|
935
|
+
const draft = createDraft$1({
|
|
936
|
+
original: baseState,
|
|
937
|
+
parentDraft: null,
|
|
938
|
+
finalities
|
|
939
|
+
});
|
|
940
|
+
finalities.rootDraft = getProxyDraft(draft);
|
|
941
|
+
return [
|
|
942
|
+
draft,
|
|
943
|
+
(returnedValue = []) => {
|
|
944
|
+
return finalizeDraft(draft, returnedValue);
|
|
945
|
+
}
|
|
946
|
+
];
|
|
947
|
+
}
|
|
948
|
+
function createOps(base, mutate) {
|
|
949
|
+
const state = isDraft(base) ? current(base) : base;
|
|
950
|
+
if (!isDraftable(state)) {
|
|
951
|
+
throw new Error(`createOps() only supports plain objects and arrays.`);
|
|
952
|
+
}
|
|
953
|
+
const [draft, finalize] = draftify(state);
|
|
954
|
+
let result;
|
|
955
|
+
try {
|
|
956
|
+
result = mutate(draft);
|
|
957
|
+
} catch (error) {
|
|
958
|
+
revokeProxy(getProxyDraft(draft));
|
|
959
|
+
throw error;
|
|
960
|
+
}
|
|
961
|
+
const proxyDraft = getProxyDraft(draft);
|
|
962
|
+
if (result !== void 0 && !isDraft(result)) {
|
|
963
|
+
if (!isEqual(result, draft) && proxyDraft.operated) {
|
|
964
|
+
throw new Error(
|
|
965
|
+
`Either the value is returned as a new non-draft value, or only the draft is modified without returning any value.`
|
|
966
|
+
);
|
|
967
|
+
}
|
|
968
|
+
if (result !== void 0) {
|
|
969
|
+
const [, ops2] = finalize([]);
|
|
970
|
+
return { nextState: result, ops: ops2 };
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
if (result === draft || result === void 0) {
|
|
974
|
+
const [nextState2, ops2] = finalize([]);
|
|
975
|
+
return { nextState: nextState2, ops: ops2 };
|
|
976
|
+
}
|
|
977
|
+
const returnedProxyDraft = getProxyDraft(result);
|
|
978
|
+
if (returnedProxyDraft) {
|
|
979
|
+
if (returnedProxyDraft.operated) {
|
|
980
|
+
throw new Error(`Cannot return a modified child draft.`);
|
|
981
|
+
}
|
|
982
|
+
const [, ops2] = finalize([]);
|
|
983
|
+
return { nextState: current(result), ops: ops2 };
|
|
984
|
+
}
|
|
985
|
+
const [nextState, ops] = finalize([]);
|
|
986
|
+
return { nextState, ops };
|
|
987
|
+
}
|
|
988
|
+
function original(target) {
|
|
989
|
+
const proxyDraft = getProxyDraft(target);
|
|
990
|
+
if (!proxyDraft) {
|
|
991
|
+
throw new Error(`original() is only used for a draft, parameter: ${target}`);
|
|
992
|
+
}
|
|
993
|
+
return proxyDraft.original;
|
|
994
|
+
}
|
|
995
|
+
function addToSet(draft, value) {
|
|
996
|
+
const proxyDraft = getProxyDraft(draft);
|
|
997
|
+
if (!proxyDraft) {
|
|
998
|
+
throw new Error(`addToSet() can only be used on draft arrays`);
|
|
999
|
+
}
|
|
1000
|
+
ensureShallowCopy(proxyDraft);
|
|
1001
|
+
markChanged(proxyDraft);
|
|
1002
|
+
const arr = proxyDraft.copy;
|
|
1003
|
+
if (arr.some((item) => item === value || deepEqual(item, value))) {
|
|
1004
|
+
return;
|
|
1005
|
+
}
|
|
1006
|
+
arr.push(value);
|
|
1007
|
+
pushOp(proxyDraft, {
|
|
1008
|
+
kind: "addToSet",
|
|
1009
|
+
path: getPathOrThrow(proxyDraft),
|
|
1010
|
+
value: deepClone(value)
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
function deleteFromSet(draft, value) {
|
|
1014
|
+
const proxyDraft = getProxyDraft(draft);
|
|
1015
|
+
if (!proxyDraft) {
|
|
1016
|
+
throw new Error(`deleteFromSet() can only be used on draft arrays`);
|
|
1017
|
+
}
|
|
1018
|
+
ensureShallowCopy(proxyDraft);
|
|
1019
|
+
markChanged(proxyDraft);
|
|
1020
|
+
const arr = proxyDraft.copy;
|
|
1021
|
+
const hasValue = arr.some((item) => item === value || deepEqual(item, value));
|
|
1022
|
+
if (!hasValue) {
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
for (let i = arr.length - 1; i >= 0; i--) {
|
|
1026
|
+
if (arr[i] === value || deepEqual(arr[i], value)) {
|
|
1027
|
+
arr.splice(i, 1);
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
pushOp(proxyDraft, {
|
|
1031
|
+
kind: "deleteFromSet",
|
|
1032
|
+
path: getPathOrThrow(proxyDraft),
|
|
1033
|
+
value: deepClone(value)
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
function getFinalizedEpochAndCheckpoint(yCheckpoint) {
|
|
1037
|
+
let maxEpoch = -1;
|
|
1038
|
+
let best = null;
|
|
1039
|
+
let bestTxCount = -1;
|
|
1040
|
+
let bestClientId = "";
|
|
1041
|
+
for (const [key, cp] of yCheckpoint.entries()) {
|
|
1042
|
+
const { epoch, clientId } = parseCheckpointKey(key);
|
|
1043
|
+
if (epoch > maxEpoch) {
|
|
1044
|
+
maxEpoch = epoch;
|
|
1045
|
+
best = cp;
|
|
1046
|
+
bestTxCount = cp.txCount;
|
|
1047
|
+
bestClientId = clientId;
|
|
1048
|
+
} else if (epoch === maxEpoch) {
|
|
1049
|
+
if (cp.txCount > bestTxCount || cp.txCount === bestTxCount && clientId < bestClientId) {
|
|
1050
|
+
best = cp;
|
|
1051
|
+
bestTxCount = cp.txCount;
|
|
1052
|
+
bestClientId = clientId;
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
return { finalizedEpoch: maxEpoch, checkpoint: best };
|
|
1057
|
+
}
|
|
1058
|
+
function checkpointKeyDataToKey(data) {
|
|
1059
|
+
return `${data.epoch};${data.txCount};${data.clientId}`;
|
|
1060
|
+
}
|
|
1061
|
+
function parseCheckpointKey(key) {
|
|
1062
|
+
const i1 = key.indexOf(";");
|
|
1063
|
+
const i2 = key.indexOf(";", i1 + 1);
|
|
1064
|
+
if (i1 === -1 || i2 === -1) {
|
|
1065
|
+
failure(`Malformed checkpoint key: ${key}`);
|
|
1066
|
+
}
|
|
1067
|
+
return {
|
|
1068
|
+
epoch: Number.parseInt(key.substring(0, i1), 10),
|
|
1069
|
+
txCount: Number.parseInt(key.substring(i1 + 1, i2), 10),
|
|
1070
|
+
clientId: key.substring(i2 + 1)
|
|
1071
|
+
};
|
|
1072
|
+
}
|
|
1073
|
+
function createCheckpoint(yTx, yCheckpoint, clientState, activeEpoch, currentState, myClientId) {
|
|
1074
|
+
const { checkpoint: prevCP } = getFinalizedEpochAndCheckpoint(yCheckpoint);
|
|
1075
|
+
const newWatermarks = prevCP ? { ...prevCP.watermarks } : {};
|
|
1076
|
+
const sortedTxs = clientState.stateCalculator.getSortedTxs();
|
|
1077
|
+
let endIndex = sortedTxs.length;
|
|
1078
|
+
while (endIndex > 0 && sortedTxs[endIndex - 1].txTimestamp.epoch > activeEpoch) {
|
|
1079
|
+
endIndex--;
|
|
1080
|
+
}
|
|
1081
|
+
const activeTxs = sortedTxs.slice(0, endIndex);
|
|
1082
|
+
if (activeTxs.length === 0) {
|
|
1083
|
+
return;
|
|
1084
|
+
}
|
|
1085
|
+
let minWallClock = Number.POSITIVE_INFINITY;
|
|
1086
|
+
let txCount = 0;
|
|
1087
|
+
for (const entry of activeTxs) {
|
|
1088
|
+
const ts = entry.txTimestamp;
|
|
1089
|
+
if (ts.wallClock < minWallClock) {
|
|
1090
|
+
minWallClock = ts.wallClock;
|
|
1091
|
+
}
|
|
1092
|
+
const newWm = newWatermarks[ts.clientId] ? { ...newWatermarks[ts.clientId] } : { maxClock: -1, maxWallClock: 0 };
|
|
1093
|
+
if (ts.clock > newWm.maxClock) {
|
|
1094
|
+
newWm.maxClock = ts.clock;
|
|
1095
|
+
newWm.maxWallClock = ts.wallClock;
|
|
1096
|
+
}
|
|
1097
|
+
newWatermarks[ts.clientId] = newWm;
|
|
1098
|
+
txCount++;
|
|
1099
|
+
}
|
|
1100
|
+
for (const clientId in newWatermarks) {
|
|
1101
|
+
if (minWallClock - newWatermarks[clientId].maxWallClock > clientState.retentionWindowMs) {
|
|
1102
|
+
delete newWatermarks[clientId];
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
const cpKey = checkpointKeyDataToKey({
|
|
1106
|
+
epoch: activeEpoch,
|
|
1107
|
+
txCount,
|
|
1108
|
+
clientId: myClientId
|
|
1109
|
+
});
|
|
1110
|
+
yCheckpoint.set(cpKey, {
|
|
1111
|
+
state: currentState,
|
|
1112
|
+
// Responsibility for cloning is moved to the caller if needed
|
|
1113
|
+
watermarks: newWatermarks,
|
|
1114
|
+
txCount,
|
|
1115
|
+
minWallClock
|
|
1116
|
+
});
|
|
1117
|
+
const keysToDelete = [];
|
|
1118
|
+
for (const entry of activeTxs) {
|
|
1119
|
+
yTx.delete(entry.txTimestampKey);
|
|
1120
|
+
keysToDelete.push(entry.txTimestampKey);
|
|
1121
|
+
}
|
|
1122
|
+
clientState.stateCalculator.removeTxs(keysToDelete);
|
|
1123
|
+
}
|
|
1124
|
+
function pruneCheckpoints(yCheckpoint, finalizedEpoch) {
|
|
1125
|
+
let canonicalKey = null;
|
|
1126
|
+
let bestTxCount = -1;
|
|
1127
|
+
for (const [key] of yCheckpoint.entries()) {
|
|
1128
|
+
const { epoch, txCount } = parseCheckpointKey(key);
|
|
1129
|
+
if (epoch === finalizedEpoch && txCount > bestTxCount) {
|
|
1130
|
+
canonicalKey = key;
|
|
1131
|
+
bestTxCount = txCount;
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
for (const key of yCheckpoint.keys()) {
|
|
1135
|
+
if (key !== canonicalKey) {
|
|
1136
|
+
yCheckpoint.delete(key);
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
388
1140
|
function createDraft(base) {
|
|
389
1141
|
return {
|
|
390
1142
|
root: base,
|
|
@@ -423,46 +1175,62 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
423
1175
|
if (path.length === 0) {
|
|
424
1176
|
return ctx.root;
|
|
425
1177
|
}
|
|
426
|
-
let
|
|
1178
|
+
let current2 = ctx.root;
|
|
427
1179
|
for (let i = 0; i < path.length; i++) {
|
|
428
1180
|
const segment = path[i];
|
|
429
1181
|
const isArrayIndex = typeof segment === "number";
|
|
430
1182
|
if (isArrayIndex) {
|
|
431
|
-
if (!Array.isArray(
|
|
1183
|
+
if (!Array.isArray(current2)) {
|
|
432
1184
|
failure(`Expected array at path segment ${segment}`);
|
|
433
1185
|
}
|
|
434
|
-
if (segment < 0 || segment >=
|
|
1186
|
+
if (segment < 0 || segment >= current2.length) {
|
|
435
1187
|
failure(`Index ${segment} out of bounds`);
|
|
436
1188
|
}
|
|
437
1189
|
} else {
|
|
438
|
-
if (!isObject(
|
|
1190
|
+
if (!isObject(current2) || Array.isArray(current2)) {
|
|
439
1191
|
failure(`Expected object at path segment "${segment}"`);
|
|
440
1192
|
}
|
|
441
|
-
if (!(segment in
|
|
1193
|
+
if (!(segment in current2)) {
|
|
442
1194
|
failure(`Property "${segment}" does not exist`);
|
|
443
1195
|
}
|
|
444
1196
|
}
|
|
445
|
-
const child =
|
|
1197
|
+
const child = current2[segment];
|
|
446
1198
|
if (child === null || typeof child !== "object") {
|
|
447
1199
|
failure(`Cannot traverse through primitive at path segment ${segment}`);
|
|
448
1200
|
}
|
|
449
|
-
|
|
1201
|
+
current2 = ensureOwned(ctx, current2, segment, child);
|
|
450
1202
|
}
|
|
451
|
-
return
|
|
1203
|
+
return current2;
|
|
452
1204
|
}
|
|
453
1205
|
function draftSet(ctx, path, key, value) {
|
|
454
1206
|
const container = ensureOwnedPath(ctx, path);
|
|
455
|
-
if (
|
|
456
|
-
failure("set requires object container");
|
|
1207
|
+
if (!isObject(container)) {
|
|
1208
|
+
failure("set requires object or array container");
|
|
1209
|
+
}
|
|
1210
|
+
let finalKey = key;
|
|
1211
|
+
if (Array.isArray(container) && typeof key === "string" && key !== "length") {
|
|
1212
|
+
const numKey = parseArrayIndex(key);
|
|
1213
|
+
if (numKey === null) {
|
|
1214
|
+
failure(`Cannot set non-numeric property "${key}" on array`);
|
|
1215
|
+
}
|
|
1216
|
+
finalKey = numKey;
|
|
457
1217
|
}
|
|
458
|
-
container[
|
|
1218
|
+
container[finalKey] = value;
|
|
459
1219
|
}
|
|
460
1220
|
function draftDelete(ctx, path, key) {
|
|
461
1221
|
const container = ensureOwnedPath(ctx, path);
|
|
462
|
-
if (
|
|
463
|
-
failure("delete requires object container");
|
|
1222
|
+
if (!isObject(container)) {
|
|
1223
|
+
failure("delete requires object or array container");
|
|
1224
|
+
}
|
|
1225
|
+
let finalKey = key;
|
|
1226
|
+
if (Array.isArray(container) && typeof key === "string") {
|
|
1227
|
+
const numKey = parseArrayIndex(key);
|
|
1228
|
+
if (numKey === null) {
|
|
1229
|
+
failure(`Cannot delete non-numeric property "${key}" from array`);
|
|
1230
|
+
}
|
|
1231
|
+
finalKey = numKey;
|
|
464
1232
|
}
|
|
465
|
-
delete container[
|
|
1233
|
+
delete container[finalKey];
|
|
466
1234
|
}
|
|
467
1235
|
function draftSplice(ctx, path, index, deleteCount, inserts) {
|
|
468
1236
|
const container = ensureOwnedPath(ctx, path);
|
|
@@ -539,50 +1307,50 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
539
1307
|
diffValue(currentState, targetState, [], ops);
|
|
540
1308
|
return ops;
|
|
541
1309
|
}
|
|
542
|
-
function diffValue(
|
|
543
|
-
if (
|
|
544
|
-
const currentType = typeof
|
|
1310
|
+
function diffValue(current2, target, path, ops) {
|
|
1311
|
+
if (current2 === target) return;
|
|
1312
|
+
const currentType = typeof current2;
|
|
545
1313
|
const targetType = typeof target;
|
|
546
|
-
if (
|
|
1314
|
+
if (current2 === null || target === null || currentType !== "object" || targetType !== "object") {
|
|
547
1315
|
emitReplace(path, target, ops);
|
|
548
1316
|
return;
|
|
549
1317
|
}
|
|
550
|
-
const currentIsArray = Array.isArray(
|
|
1318
|
+
const currentIsArray = Array.isArray(current2);
|
|
551
1319
|
const targetIsArray = Array.isArray(target);
|
|
552
1320
|
if (currentIsArray !== targetIsArray) {
|
|
553
1321
|
emitReplace(path, target, ops);
|
|
554
1322
|
return;
|
|
555
1323
|
}
|
|
556
1324
|
if (currentIsArray) {
|
|
557
|
-
diffArray(
|
|
1325
|
+
diffArray(current2, target, path, ops);
|
|
558
1326
|
} else {
|
|
559
|
-
diffObject(
|
|
1327
|
+
diffObject(current2, target, path, ops);
|
|
560
1328
|
}
|
|
561
1329
|
}
|
|
562
|
-
function diffObject(
|
|
563
|
-
for (const key in
|
|
564
|
-
if (Object.hasOwn(
|
|
1330
|
+
function diffObject(current2, target, path, ops) {
|
|
1331
|
+
for (const key in current2) {
|
|
1332
|
+
if (Object.hasOwn(current2, key) && !Object.hasOwn(target, key)) {
|
|
565
1333
|
ops.push({ kind: "delete", path, key });
|
|
566
1334
|
}
|
|
567
1335
|
}
|
|
568
1336
|
for (const key in target) {
|
|
569
1337
|
if (Object.hasOwn(target, key)) {
|
|
570
1338
|
const targetVal = target[key];
|
|
571
|
-
if (!Object.hasOwn(
|
|
1339
|
+
if (!Object.hasOwn(current2, key)) {
|
|
572
1340
|
ops.push({ kind: "set", path, key, value: targetVal });
|
|
573
|
-
} else if (
|
|
574
|
-
diffValue(
|
|
1341
|
+
} else if (current2[key] !== targetVal) {
|
|
1342
|
+
diffValue(current2[key], targetVal, [...path, key], ops);
|
|
575
1343
|
}
|
|
576
1344
|
}
|
|
577
1345
|
}
|
|
578
1346
|
}
|
|
579
|
-
function diffArray(
|
|
580
|
-
const currentLen =
|
|
1347
|
+
function diffArray(current2, target, path, ops) {
|
|
1348
|
+
const currentLen = current2.length;
|
|
581
1349
|
const targetLen = target.length;
|
|
582
1350
|
const minLen = currentLen < targetLen ? currentLen : targetLen;
|
|
583
1351
|
for (let i = 0; i < minLen; i++) {
|
|
584
|
-
if (
|
|
585
|
-
diffValue(
|
|
1352
|
+
if (current2[i] !== target[i]) {
|
|
1353
|
+
diffValue(current2[i], target[i], [...path, i], ops);
|
|
586
1354
|
}
|
|
587
1355
|
}
|
|
588
1356
|
if (targetLen > currentLen) {
|
|
@@ -1258,43 +2026,61 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1258
2026
|
};
|
|
1259
2027
|
}
|
|
1260
2028
|
function resolvePath(state, path) {
|
|
1261
|
-
let
|
|
2029
|
+
let current2 = state;
|
|
1262
2030
|
for (const segment of path) {
|
|
1263
2031
|
if (typeof segment === "string") {
|
|
1264
|
-
if (!isObject(
|
|
2032
|
+
if (!isObject(current2) || Array.isArray(current2)) {
|
|
1265
2033
|
failure(`Expected object at path segment "${segment}"`);
|
|
1266
2034
|
}
|
|
1267
|
-
if (!(segment in
|
|
2035
|
+
if (!(segment in current2)) {
|
|
1268
2036
|
failure(`Property "${segment}" does not exist`);
|
|
1269
2037
|
}
|
|
1270
|
-
|
|
2038
|
+
current2 = current2[segment];
|
|
1271
2039
|
} else {
|
|
1272
|
-
if (!Array.isArray(
|
|
2040
|
+
if (!Array.isArray(current2)) {
|
|
1273
2041
|
failure(`Expected array at path segment ${segment}`);
|
|
1274
2042
|
}
|
|
1275
|
-
if (segment < 0 || segment >=
|
|
2043
|
+
if (segment < 0 || segment >= current2.length) {
|
|
1276
2044
|
failure(`Index ${segment} out of bounds`);
|
|
1277
2045
|
}
|
|
1278
|
-
|
|
2046
|
+
current2 = current2[segment];
|
|
1279
2047
|
}
|
|
1280
2048
|
}
|
|
1281
|
-
return
|
|
2049
|
+
return current2;
|
|
1282
2050
|
}
|
|
1283
2051
|
function applyOp(state, op, cloneValues) {
|
|
1284
2052
|
const container = resolvePath(state, op.path);
|
|
1285
2053
|
switch (op.kind) {
|
|
1286
|
-
case "set":
|
|
1287
|
-
if (!isObject(container)
|
|
1288
|
-
failure("set requires object container");
|
|
2054
|
+
case "set": {
|
|
2055
|
+
if (!isObject(container)) {
|
|
2056
|
+
failure("set requires object or array container");
|
|
2057
|
+
}
|
|
2058
|
+
let key = op.key;
|
|
2059
|
+
if (Array.isArray(container) && typeof key === "string" && key !== "length") {
|
|
2060
|
+
const numKey = parseArrayIndex(key);
|
|
2061
|
+
if (numKey === null) {
|
|
2062
|
+
failure(`Cannot set non-numeric property "${key}" on array`);
|
|
2063
|
+
}
|
|
2064
|
+
key = numKey;
|
|
1289
2065
|
}
|
|
1290
|
-
container[
|
|
2066
|
+
container[key] = cloneValues ? deepClone(op.value) : op.value;
|
|
1291
2067
|
break;
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
2068
|
+
}
|
|
2069
|
+
case "delete": {
|
|
2070
|
+
if (!isObject(container)) {
|
|
2071
|
+
failure("delete requires object or array container");
|
|
1295
2072
|
}
|
|
1296
|
-
|
|
2073
|
+
let key = op.key;
|
|
2074
|
+
if (Array.isArray(container) && typeof key === "string") {
|
|
2075
|
+
const numKey = parseArrayIndex(key);
|
|
2076
|
+
if (numKey === null) {
|
|
2077
|
+
failure(`Cannot delete non-numeric property "${key}" from array`);
|
|
2078
|
+
}
|
|
2079
|
+
key = numKey;
|
|
2080
|
+
}
|
|
2081
|
+
delete container[key];
|
|
1297
2082
|
break;
|
|
2083
|
+
}
|
|
1298
2084
|
case "splice": {
|
|
1299
2085
|
if (!Array.isArray(container)) {
|
|
1300
2086
|
failure("splice requires array container");
|
|
@@ -1336,8 +2122,15 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1336
2122
|
applyOp(target, op, cloneValues);
|
|
1337
2123
|
}
|
|
1338
2124
|
}
|
|
2125
|
+
exports2.addToSet = addToSet;
|
|
1339
2126
|
exports2.applyOps = applyOps;
|
|
2127
|
+
exports2.createOps = createOps;
|
|
1340
2128
|
exports2.createStateSyncLog = createStateSyncLog;
|
|
2129
|
+
exports2.current = current;
|
|
2130
|
+
exports2.deleteFromSet = deleteFromSet;
|
|
2131
|
+
exports2.isDraft = isDraft;
|
|
2132
|
+
exports2.isDraftable = isDraftable;
|
|
2133
|
+
exports2.original = original;
|
|
1341
2134
|
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
1342
2135
|
}));
|
|
1343
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtc3luYy1sb2cudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2hlY2twb2ludFV0aWxzLnRzIiwiLi4vc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NoZWNrcG9pbnRzLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtZGVlcC1lcXVhbEAzLjEuMy9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL25hbm9pZEA1LjEuNi9ub2RlX21vZHVsZXMvbmFub2lkL3VybC1hbHBoYWJldC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjYvbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JmZGNAMS40LjEvbm9kZV9tb2R1bGVzL3JmZGMvaW5kZXguanMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvZHJhZnQudHMiLCIuLi9zcmMvcmVjb25jaWxlLnRzIiwiLi4vc3JjL3R4VGltZXN0YW1wLnRzIiwiLi4vc3JjL1NvcnRlZFR4RW50cnkudHMiLCIuLi9zcmMvU3RhdGVDYWxjdWxhdG9yLnRzIiwiLi4vc3JjL2NsaWVudFN0YXRlLnRzIiwiLi4vc3JjL3R4TG9nLnRzIiwiLi4vc3JjL2NyZWF0ZVN0YXRlU3luY0xvZy50cyIsIi4uL3NyYy9vcGVyYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyB0eXBlIENoZWNrcG9pbnRSZWNvcmQsIHBhcnNlQ2hlY2twb2ludEtleSB9IGZyb20gXCIuL2NoZWNrcG9pbnRzXCJcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBmaW5hbGl6ZWQgZXBvY2ggYW5kIGl0cyBjYW5vbmljYWwgY2hlY2twb2ludCBpbiBhIHNpbmdsZSBwYXNzLlxuICpcbiAqIFBvbGljeSBBOiBUaGUgZmluYWxpemVkIGVwb2NoIGlzIHRoZSBtb3N0IHJlY2VudCBlcG9jaCB3aXRoIGEgY2hlY2twb2ludC5cbiAqIENhbm9uaWNhbCBjaGVja3BvaW50OiBUaGUgY2hlY2twb2ludCB3aXRoIGhpZ2hlc3QgdHhDb3VudCBmb3IgdGhhdCBlcG9jaFxuICogKHRpZS1icmVhazogbG93ZXN0IGNsaWVudElkIGFscGhhYmV0aWNhbGx5KS5cbiAqXG4gKiBSZXR1cm5zIHsgZmluYWxpemVkRXBvY2g6IC0xLCBjaGVja3BvaW50OiBudWxsIH0gaWYgbm8gY2hlY2twb2ludHMgZXhpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+KToge1xuICBmaW5hbGl6ZWRFcG9jaDogbnVtYmVyXG4gIGNoZWNrcG9pbnQ6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsXG59IHtcbiAgbGV0IG1heEVwb2NoID0gLTFcbiAgbGV0IGJlc3Q6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsID0gbnVsbFxuICBsZXQgYmVzdFR4Q291bnQgPSAtMVxuICBsZXQgYmVzdENsaWVudElkID0gXCJcIlxuXG4gIGZvciAoY29uc3QgW2tleSwgY3BdIG9mIHlDaGVja3BvaW50LmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHsgZXBvY2gsIGNsaWVudElkIH0gPSBwYXJzZUNoZWNrcG9pbnRLZXkoa2V5KVxuXG4gICAgaWYgKGVwb2NoID4gbWF4RXBvY2gpIHtcbiAgICAgIC8vIE5ldyBoaWdoZXN0IGVwb2NoIC0gcmVzZXQgYmVzdCBjaGVja3BvaW50IHRyYWNraW5nXG4gICAgICBtYXhFcG9jaCA9IGVwb2NoXG4gICAgICBiZXN0ID0gY3BcbiAgICAgIGJlc3RUeENvdW50ID0gY3AudHhDb3VudFxuICAgICAgYmVzdENsaWVudElkID0gY2xpZW50SWRcbiAgICB9IGVsc2UgaWYgKGVwb2NoID09PSBtYXhFcG9jaCkge1xuICAgICAgLy8gU2FtZSBlcG9jaCAtIGNoZWNrIGlmIHRoaXMgaXMgYSBiZXR0ZXIgY2Fub25pY2FsIGNoZWNrcG9pbnRcbiAgICAgIC8vIFByaW1hcnk6IGhpZ2hlciB0eENvdW50IHdpbnNcbiAgICAgIC8vIFNlY29uZGFyeSAodGllLWJyZWFrKTogbG93ZXIgY2xpZW50SWQgKGFscGhhYmV0aWNhbGx5KSB3aW5zXG4gICAgICBpZiAoY3AudHhDb3VudCA+IGJlc3RUeENvdW50IHx8IChjcC50eENvdW50ID09PSBiZXN0VHhDb3VudCAmJiBjbGllbnRJZCA8IGJlc3RDbGllbnRJZCkpIHtcbiAgICAgICAgYmVzdCA9IGNwXG4gICAgICAgIGJlc3RUeENvdW50ID0gY3AudHhDb3VudFxuICAgICAgICBiZXN0Q2xpZW50SWQgPSBjbGllbnRJZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpbmFsaXplZEVwb2NoOiBtYXhFcG9jaCwgY2hlY2twb2ludDogYmVzdCB9XG59XG4iLCJleHBvcnQgY2xhc3MgU3RhdGVTeW5jTG9nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIobXNnKVxuXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseSBmb3IgYmV0dGVyIGluc3RhbmNlb2Ygc3VwcG9ydFxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTdGF0ZVN5bmNMb2dFcnJvci5wcm90b3R5cGUpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobWVzc2FnZTogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgU3RhdGVTeW5jTG9nRXJyb3IobWVzc2FnZSlcbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBDbGllbnRJZCB9IGZyb20gXCIuL0NsaWVudElkXCJcbmltcG9ydCB7IGdldEZpbmFsaXplZEVwb2NoQW5kQ2hlY2twb2ludCB9IGZyb20gXCIuL2NoZWNrcG9pbnRVdGlsc1wiXG5pbXBvcnQgeyBDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5pbXBvcnQgeyBUeFJlY29yZCB9IGZyb20gXCIuL1R4UmVjb3JkXCJcbmltcG9ydCB7IFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIFdhdGVybWFya2luZyBmb3IgZGVkdXBsaWNhdGlvbiBhbmQgcHJ1bmluZy5cbiAqIC0gbWF4Q2xvY2s6IEFsbCB0eHMgZnJvbSB0aGlzIGNsaWVudCB3aXRoIGNsb2NrIDw9IG1heENsb2NrIGFyZSBGSU5BTElaRUQuXG4gKiAtIG1heFdhbGxDbG9jazogVGhlIGxhc3QgdGltZSB3ZSBzYXcgdGhpcyBjbGllbnQgYWN0aXZlIChmb3IgcHJ1bmluZykuXG4gKi9cbnR5cGUgQ2xpZW50V2F0ZXJtYXJrID0gUmVhZG9ubHk8e1xuICBtYXhDbG9jazogbnVtYmVyXG4gIG1heFdhbGxDbG9jazogbnVtYmVyXG59PlxuXG4vKipcbiAqIFdhdGVybWFya3MgZm9yIGFsbCBjbGllbnRzLlxuICovXG5leHBvcnQgdHlwZSBDbGllbnRXYXRlcm1hcmtzID0gUmVjb3JkPENsaWVudElkLCBDbGllbnRXYXRlcm1hcms+XG5cbi8qKlxuICogQSBzbmFwc2hvdCBvZiB0aGUgc3RhdGUgYXQgdGhlIGVuZCBvZiBhIHNwZWNpZmljIGVwb2NoLlxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50UmVjb3JkID0ge1xuICBzdGF0ZTogSlNPTk9iamVjdCAvLyBUaGUgZG9jdW1lbnQgc3RhdGVcbiAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyAvLyBEZWR1cC9QcnVuaW5nIGluZm9cbiAgdHhDb3VudDogbnVtYmVyIC8vIFRpZS1icmVha2VyIGZvciBjYW5vbmljYWwgc2VsZWN0aW9uXG4gIG1pbldhbGxDbG9jazogbnVtYmVyIC8vIFJlZmVyZW5jZSB0aW1lIGZvciB0aGlzIGVwb2NoIChkZXRlcm1pbmlzdGljIHBydW5pbmcpXG59XG5cbi8qKlxuICogVW5pcXVlIElEIGZvciBhIGNoZWNrcG9pbnQuXG4gKiBGb3JtYXQ6IGAke2Vwb2NofTske3R4Q291bnR9OyR7Y2xpZW50SWR9YFxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50S2V5ID0gc3RyaW5nXG5cbi8qKlxuICogRGF0YSBleHRyYWN0ZWQgZnJvbSBhIGNoZWNrcG9pbnQga2V5LlxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50S2V5RGF0YSA9IHtcbiAgZXBvY2g6IG51bWJlclxuICB0eENvdW50OiBudW1iZXJcbiAgY2xpZW50SWQ6IENsaWVudElkXG59XG5cbi8qKlxuICogQ29udmVydHMgY2hlY2twb2ludCBrZXkgZGF0YSBjb21wb25lbnRzIHRvIGEga2V5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gY2hlY2twb2ludEtleURhdGFUb0tleShkYXRhOiBDaGVja3BvaW50S2V5RGF0YSk6IENoZWNrcG9pbnRLZXkge1xuICByZXR1cm4gYCR7ZGF0YS5lcG9jaH07JHtkYXRhLnR4Q291bnR9OyR7ZGF0YS5jbGllbnRJZH1gXG59XG5cbi8qKlxuICogSGVscGVyIHRvIHBhcnNlIGNoZWNrcG9pbnQga2V5cy5cbiAqIENoZWNrcG9pbnQga2V5cyBoYXZlIGZvcm1hdDogYCR7ZXBvY2h9OyR7dHhDb3VudH07JHtjbGllbnRJZH1gXG4gKiBUaHJvd3MgaWYga2V5IGlzIG1hbGZvcm1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hlY2twb2ludEtleShrZXk6IENoZWNrcG9pbnRLZXkpOiBDaGVja3BvaW50S2V5RGF0YSB7XG4gIGNvbnN0IGkxID0ga2V5LmluZGV4T2YoXCI7XCIpXG4gIGNvbnN0IGkyID0ga2V5LmluZGV4T2YoXCI7XCIsIGkxICsgMSlcblxuICBpZiAoaTEgPT09IC0xIHx8IGkyID09PSAtMSkge1xuICAgIGZhaWx1cmUoYE1hbGZvcm1lZCBjaGVja3BvaW50IGtleTogJHtrZXl9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXBvY2g6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKDAsIGkxKSwgMTApLFxuICAgIHR4Q291bnQ6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKGkxICsgMSwgaTIpLCAxMCksXG4gICAgY2xpZW50SWQ6IGtleS5zdWJzdHJpbmcoaTIgKyAxKSxcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBwZXJpb2RpY2FsbHkgKGUuZy4gYnkgYSBzZXJ2ZXIgb3IgbGVhZGVyIGNsaWVudCkgdG8gZmluYWxpemUgdGhlIGVwb2NoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hlY2twb2ludChcbiAgeVR4OiBZLk1hcDxUeFJlY29yZD4sXG4gIHlDaGVja3BvaW50OiBZLk1hcDxDaGVja3BvaW50UmVjb3JkPixcbiAgY2xpZW50U3RhdGU6IENsaWVudFN0YXRlLFxuICBhY3RpdmVFcG9jaDogbnVtYmVyLFxuICBjdXJyZW50U3RhdGU6IEpTT05PYmplY3QsXG4gIG15Q2xpZW50SWQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIC8vIDEuIFN0YXJ0IHdpdGggcHJldmlvdXMgd2F0ZXJtYXJrcyAoZnJvbSBmaW5hbGl6ZWQgZXBvY2ggPSBhY3RpdmVFcG9jaCAtIDEpXG4gIGNvbnN0IHsgY2hlY2twb2ludDogcHJldkNQIH0gPSBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQpXG4gIGNvbnN0IG5ld1dhdGVybWFya3MgPSBwcmV2Q1AgPyB7IC4uLnByZXZDUC53YXRlcm1hcmtzIH0gOiB7fVxuXG4gIC8vIEdldCBhY3RpdmUgdHhzIHVzaW5nIGNhY2hlZCBzb3J0ZWQgb3JkZXIgKGZpbHRlciBieSBlcG9jaClcbiAgLy8gRklMVEVSIElTIFJFUVVJUkVEOlxuICAvLyBBbHRob3VnaCB3ZSBhcmUgZmluYWxpemluZyAnYWN0aXZlRXBvY2gnLCBvdGhlciBwZWVycyBtYXkgaGF2ZSBhbHJlYWR5XG4gIC8vIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGVwb2NoIGFuZCBzdGFydGVkIHN5bmNpbmcgdGhvc2UgdHhzLlxuICAvLyBXZSBtdXN0IGVuc3VyZSB0aGlzIGNoZWNrcG9pbnQgT05MWSBjb250YWlucyB0eHMgZnJvbSAnYWN0aXZlRXBvY2gnLlxuICAvLyBVc2luZyBzdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzIGF2b2lkcyByZWR1bmRhbnQga2V5IHBhcnNpbmcgKHRpbWVzdGFtcHMgYXJlIGNhY2hlZCkuXG4gIC8vXG4gIC8vIE9QVElNSVpBVElPTjogU2luY2Ugc29ydGVkVHhzIGlzIHNvcnRlZCBieSBlcG9jaCAocHJpbWFyeSBrZXkpIGFuZCBwYXN0IGVwb2Noc1xuICAvLyBhcmUgcHJ1bmVkLCB3ZSBvbmx5IG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgYm91bmRhcnkuIEZ1dHVyZSBlcG9jaHMgYXJlIHJhcmUsXG4gIC8vIHNvIGEgc2ltcGxlIGxpbmVhciBzZWFyY2ggZnJvbSB0aGUgcmlnaHQgaXMgZWZmaWNpZW50ICh0eXBpY2FsbHkgMC0xIGl0ZXJhdGlvbnMpLlxuICBjb25zdCBzb3J0ZWRUeHMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKClcblxuICAvLyBGaW5kIGVuZCBib3VuZGFyeSBieSBzZWFyY2hpbmcgZnJvbSByaWdodCAoc2tpcCBhbnkgZnV0dXJlIGVwb2NoIGVudHJpZXMpXG4gIGxldCBlbmRJbmRleCA9IHNvcnRlZFR4cy5sZW5ndGhcbiAgd2hpbGUgKGVuZEluZGV4ID4gMCAmJiBzb3J0ZWRUeHNbZW5kSW5kZXggLSAxXS50eFRpbWVzdGFtcC5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgZW5kSW5kZXgtLVxuICB9XG5cbiAgLy8gU2xpY2UgZnJvbSBzdGFydCB0byBlbmRJbmRleCAocGFzdCBlcG9jaHMgYXJlIHBydW5lZCwgc28gdGhlc2UgYXJlIGFsbCBhY3RpdmVFcG9jaClcbiAgY29uc3QgYWN0aXZlVHhzID0gc29ydGVkVHhzLnNsaWNlKDAsIGVuZEluZGV4KVxuXG4gIGlmIChhY3RpdmVUeHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC8vIERvIG5vdGhpbmcgaWYgbm8gdHhzIChwcmV2ZW50cyBlbXB0eSBlcG9jaHMpXG4gIH1cblxuICAvLyAyLiBVcGRhdGUgd2F0ZXJtYXJrcyBiYXNlZCBvbiBPQlNFUlZFRCBhY3RpdmUgdHhzIGFuZCBjYWxjdWxhdGUgbWluV2FsbENsb2NrXG4gIC8vIE5PVEU6IFdlIGNhbm5vdCB1c2UgYWN0aXZlVHhzWzBdLnR4VGltZXN0YW1wLndhbGxDbG9jayBmb3IgbWluV2FsbENsb2NrIGJlY2F1c2VcbiAgLy8gdHhzIGFyZSBzb3J0ZWQgYnkgTGFtcG9ydCBjbG9jayAoZXBvY2gg4oaSIGNsb2NrIOKGkiBjbGllbnRJZCksIG5vdCBieSB3YWxsQ2xvY2suXG4gIC8vIEEgY2xpZW50IG1heSBoYXZlIGEgaGlnaCBMYW1wb3J0IGNsb2NrIGJ1dCBlYXJseSB3YWxsQ2xvY2sgZHVlIHRvIGNsb2NrIGRyaWZ0XG4gIC8vIG9yIHJlY2VpdmluZyBtYW55IG1lc3NhZ2VzIGJlZm9yZSBlbWl0dGluZy5cbiAgbGV0IG1pbldhbGxDbG9jayA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICBsZXQgdHhDb3VudCA9IDBcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhY3RpdmVUeHMpIHtcbiAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG5cbiAgICAvLyBUcmFjayBtaW4gd2FsbENsb2NrIGZvciBkZXRlcm1pbmlzdGljIHBydW5pbmcgcmVmZXJlbmNlXG4gICAgaWYgKHRzLndhbGxDbG9jayA8IG1pbldhbGxDbG9jaykge1xuICAgICAgbWluV2FsbENsb2NrID0gdHMud2FsbENsb2NrXG4gICAgfVxuXG4gICAgY29uc3QgbmV3V20gPSBuZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXVxuICAgICAgPyB7IC4uLm5ld1dhdGVybWFya3NbdHMuY2xpZW50SWRdIH1cbiAgICAgIDogeyBtYXhDbG9jazogLTEsIG1heFdhbGxDbG9jazogMCB9XG5cbiAgICBpZiAodHMuY2xvY2sgPiBuZXdXbS5tYXhDbG9jaykge1xuICAgICAgbmV3V20ubWF4Q2xvY2sgPSB0cy5jbG9ja1xuICAgICAgbmV3V20ubWF4V2FsbENsb2NrID0gdHMud2FsbENsb2NrXG4gICAgfVxuICAgIG5ld1dhdGVybWFya3NbdHMuY2xpZW50SWRdID0gbmV3V21cbiAgICB0eENvdW50KytcbiAgfVxuXG4gIC8vIDMuIFBydW5lIEluYWN0aXZlIFdhdGVybWFya3MgKERldGVybWluaXN0aWMpXG4gIC8vIFVzZXMgbWluV2FsbENsb2NrIHNvIGFsbCBjbGllbnRzIGFncmVlIG9uIGV4YWN0bHkgd2hvIHRvIHBydW5lLlxuICBmb3IgKGNvbnN0IGNsaWVudElkIGluIG5ld1dhdGVybWFya3MpIHtcbiAgICBpZiAobWluV2FsbENsb2NrIC0gbmV3V2F0ZXJtYXJrc1tjbGllbnRJZF0ubWF4V2FsbENsb2NrID4gY2xpZW50U3RhdGUucmV0ZW50aW9uV2luZG93TXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdXYXRlcm1hcmtzW2NsaWVudElkXVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFNhdmUgQ2hlY2twb2ludFxuICBjb25zdCBjcEtleSA9IGNoZWNrcG9pbnRLZXlEYXRhVG9LZXkoe1xuICAgIGVwb2NoOiBhY3RpdmVFcG9jaCxcbiAgICB0eENvdW50LFxuICAgIGNsaWVudElkOiBteUNsaWVudElkLFxuICB9KVxuICB5Q2hlY2twb2ludC5zZXQoY3BLZXksIHtcbiAgICBzdGF0ZTogY3VycmVudFN0YXRlLCAvLyBSZXNwb25zaWJpbGl0eSBmb3IgY2xvbmluZyBpcyBtb3ZlZCB0byB0aGUgY2FsbGVyIGlmIG5lZWRlZFxuICAgIHdhdGVybWFya3M6IG5ld1dhdGVybWFya3MsXG4gICAgdHhDb3VudCxcbiAgICBtaW5XYWxsQ2xvY2ssXG4gIH0pXG5cbiAgLy8gNS4gRWFybHkgdHggcHJ1bmluZyAoT3B0aW1pemF0aW9uKVxuICAvLyBEZWxldGUgYWxsIHR4cyBmcm9tIHRoZSBub3ctZmluYWxpemVkIGVwb2NoXG4gIC8vIFRoaXMgcmVkdWNlcyBtZW1vcnkgcHJlc3N1cmUgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBjbGVhbnVwTG9nXG4gIGNvbnN0IGtleXNUb0RlbGV0ZTogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWN0aXZlVHhzKSB7XG4gICAgeVR4LmRlbGV0ZShlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgICBrZXlzVG9EZWxldGUucHVzaChlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgfVxuICBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IucmVtb3ZlVHhzKGtleXNUb0RlbGV0ZSlcbn1cblxuLyoqXG4gKiBHYXJiYWdlIGNvbGxlY3RzIG9sZCBjaGVja3BvaW50cy5cbiAqIFNob3VsZCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aCBvZiB5Q2hlY2twb2ludC5cbiAqXG4gKiBLZWVwcyBvbmx5IHRoZSBjYW5vbmljYWwgY2hlY2twb2ludCBmb3IgdGhlIGZpbmFsaXplZCBlcG9jaC5cbiAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBkZWxldGVkIChvbGQgZXBvY2hzICsgbm9uLWNhbm9uaWNhbCkuXG4gKlxuICogTm90ZTogVGhlIGFjdGl2ZSBlcG9jaCBuZXZlciBoYXMgY2hlY2twb2ludHMgLSBjcmVhdGluZyBhIGNoZWNrcG9pbnRcbiAqIGZvciBhbiBlcG9jaCBpbW1lZGlhdGVseSBtYWtlcyBpdCBmaW5hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUNoZWNrcG9pbnRzKFxuICB5Q2hlY2twb2ludDogWS5NYXA8Q2hlY2twb2ludFJlY29yZD4sXG4gIGZpbmFsaXplZEVwb2NoOiBudW1iZXJcbik6IHZvaWQge1xuICAvLyBGaW5kIHRoZSBjYW5vbmljYWwgY2hlY2twb2ludCBhbmQgaXRzIGtleSBpbiBvbmUgcGFzc1xuICBsZXQgY2Fub25pY2FsS2V5OiBDaGVja3BvaW50S2V5IHwgbnVsbCA9IG51bGxcbiAgbGV0IGJlc3RUeENvdW50ID0gLTFcblxuICBmb3IgKGNvbnN0IFtrZXldIG9mIHlDaGVja3BvaW50LmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHsgZXBvY2gsIHR4Q291bnQgfSA9IHBhcnNlQ2hlY2twb2ludEtleShrZXkpXG4gICAgaWYgKGVwb2NoID09PSBmaW5hbGl6ZWRFcG9jaCAmJiB0eENvdW50ID4gYmVzdFR4Q291bnQpIHtcbiAgICAgIGNhbm9uaWNhbEtleSA9IGtleVxuICAgICAgYmVzdFR4Q291bnQgPSB0eENvdW50XG4gICAgfVxuICB9XG5cbiAgLy8gRGVsZXRlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjYW5vbmljYWwgY2hlY2twb2ludFxuICBmb3IgKGNvbnN0IGtleSBvZiB5Q2hlY2twb2ludC5rZXlzKCkpIHtcbiAgICBpZiAoa2V5ICE9PSBjYW5vbmljYWxLZXkpIHtcbiAgICAgIHlDaGVja3BvaW50LmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGRvIG5vdCBlZGl0IC5qcyBmaWxlcyBkaXJlY3RseSAtIGVkaXQgc3JjL2luZGV4LmpzdFxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghZXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0cnVlIGlmIGJvdGggTmFOLCBmYWxzZSBvdGhlcndpc2VcbiAgcmV0dXJuIGEhPT1hICYmIGIhPT1iO1xufTtcbiIsImV4cG9ydCBjb25zdCB1cmxBbHBoYWJldCA9XG4gICd1c2VhbmRvbS0yNlQxOTgzNDBQWDc1cHhKQUNLVkVSWU1JTkRCVVNIV09MRl9HUVpiZmdoamtscXZ3eXpyaWN0J1xuIiwiLyogQHRzLXNlbGYtdHlwZXM9XCIuL2luZGV4LmQudHNcIiAqL1xuaW1wb3J0IHsgdXJsQWxwaGFiZXQgYXMgc2NvcGVkVXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmV4cG9ydCB7IHVybEFscGhhYmV0IH0gZnJvbSAnLi91cmwtYWxwaGFiZXQvaW5kZXguanMnXG5leHBvcnQgbGV0IHJhbmRvbSA9IGJ5dGVzID0+IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKVxuZXhwb3J0IGxldCBjdXN0b21SYW5kb20gPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplLCBnZXRSYW5kb20pID0+IHtcbiAgbGV0IG1hc2sgPSAoMiA8PCBNYXRoLmxvZzIoYWxwaGFiZXQubGVuZ3RoIC0gMSkpIC0gMVxuICBsZXQgc3RlcCA9IC1+KCgxLjYgKiBtYXNrICogZGVmYXVsdFNpemUpIC8gYWxwaGFiZXQubGVuZ3RoKVxuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxldCBieXRlcyA9IGdldFJhbmRvbShzdGVwKVxuICAgICAgbGV0IGogPSBzdGVwIHwgMFxuICAgICAgd2hpbGUgKGotLSkge1xuICAgICAgICBpZCArPSBhbHBoYWJldFtieXRlc1tqXSAmIG1hc2tdIHx8ICcnXG4gICAgICAgIGlmIChpZC5sZW5ndGggPj0gc2l6ZSkgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5leHBvcnQgbGV0IGN1c3RvbUFscGhhYmV0ID0gKGFscGhhYmV0LCBzaXplID0gMjEpID0+XG4gIGN1c3RvbVJhbmRvbShhbHBoYWJldCwgc2l6ZSB8IDAsIHJhbmRvbSlcbmV4cG9ydCBsZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSAnJ1xuICBsZXQgYnl0ZXMgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KChzaXplIHw9IDApKSlcbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIGlkICs9IHNjb3BlZFVybEFscGhhYmV0W2J5dGVzW3NpemVdICYgNjNdXG4gIH1cbiAgcmV0dXJuIGlkXG59XG4iLCIndXNlIHN0cmljdCdcbm1vZHVsZS5leHBvcnRzID0gcmZkY1xuXG5mdW5jdGlvbiBjb3B5QnVmZmVyIChjdXIpIHtcbiAgaWYgKGN1ciBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShjdXIpXG4gIH1cblxuICByZXR1cm4gbmV3IGN1ci5jb25zdHJ1Y3RvcihjdXIuYnVmZmVyLnNsaWNlKCksIGN1ci5ieXRlT2Zmc2V0LCBjdXIubGVuZ3RoKVxufVxuXG5mdW5jdGlvbiByZmRjIChvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIGlmIChvcHRzLmNpcmNsZXMpIHJldHVybiByZmRjQ2lyY2xlcyhvcHRzKVxuXG4gIGNvbnN0IGNvbnN0cnVjdG9ySGFuZGxlcnMgPSBuZXcgTWFwKClcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoRGF0ZSwgKG8pID0+IG5ldyBEYXRlKG8pKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChNYXAsIChvLCBmbikgPT4gbmV3IE1hcChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KFNldCwgKG8sIGZuKSA9PiBuZXcgU2V0KGNsb25lQXJyYXkoQXJyYXkuZnJvbShvKSwgZm4pKSlcbiAgaWYgKG9wdHMuY29uc3RydWN0b3JIYW5kbGVycykge1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KGhhbmRsZXJbMF0sIGhhbmRsZXJbMV0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGhhbmRsZXIgPSBudWxsXG5cbiAgcmV0dXJuIG9wdHMucHJvdG8gPyBjbG9uZVByb3RvIDogY2xvbmVcblxuICBmdW5jdGlvbiBjbG9uZUFycmF5IChhLCBmbikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKVxuICAgIGNvbnN0IGEyID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IGtleXNbaV1cbiAgICAgIGNvbnN0IGN1ciA9IGFba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgYTJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBhMltrXSA9IGhhbmRsZXIoY3VyLCBmbilcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgYTJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGEyW2tdID0gZm4oY3VyKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTJcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lIChvKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JyB8fCBvID09PSBudWxsKSByZXR1cm4gb1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gY2xvbmVBcnJheShvLCBjbG9uZSlcbiAgICBpZiAoby5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoby5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihvLCBjbG9uZSlcbiAgICB9XG4gICAgY29uc3QgbzIgPSB7fVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobywgaykgPT09IGZhbHNlKSBjb250aW51ZVxuICAgICAgY29uc3QgY3VyID0gb1trXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBvMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIG8yW2tdID0gaGFuZGxlcihjdXIsIGNsb25lKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbzJba10gPSBjbG9uZShjdXIpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvMlxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVQcm90byAobykge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkgcmV0dXJuIG9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIGNsb25lQXJyYXkobywgY2xvbmVQcm90bylcbiAgICBpZiAoby5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoby5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihvLCBjbG9uZVByb3RvKVxuICAgIH1cbiAgICBjb25zdCBvMiA9IHt9XG4gICAgZm9yIChjb25zdCBrIGluIG8pIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZVByb3RvKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbzJba10gPSBjbG9uZVByb3RvKGN1cilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG8yXG4gIH1cbn1cblxuZnVuY3Rpb24gcmZkY0NpcmNsZXMgKG9wdHMpIHtcbiAgY29uc3QgcmVmcyA9IFtdXG4gIGNvbnN0IHJlZnNOZXcgPSBbXVxuXG4gIGNvbnN0IGNvbnN0cnVjdG9ySGFuZGxlcnMgPSBuZXcgTWFwKClcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoRGF0ZSwgKG8pID0+IG5ldyBEYXRlKG8pKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChNYXAsIChvLCBmbikgPT4gbmV3IE1hcChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KFNldCwgKG8sIGZuKSA9PiBuZXcgU2V0KGNsb25lQXJyYXkoQXJyYXkuZnJvbShvKSwgZm4pKSlcbiAgaWYgKG9wdHMuY29uc3RydWN0b3JIYW5kbGVycykge1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KGhhbmRsZXJbMF0sIGhhbmRsZXJbMV0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGhhbmRsZXIgPSBudWxsXG4gIHJldHVybiBvcHRzLnByb3RvID8gY2xvbmVQcm90byA6IGNsb25lXG5cbiAgZnVuY3Rpb24gY2xvbmVBcnJheSAoYSwgZm4pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSlcbiAgICBjb25zdCBhMiA9IG5ldyBBcnJheShrZXlzLmxlbmd0aClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICBjb25zdCBjdXIgPSBhW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIGEyW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgYTJba10gPSBoYW5kbGVyKGN1ciwgZm4pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIGEyW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHJlZnMuaW5kZXhPZihjdXIpXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBhMltrXSA9IHJlZnNOZXdbaW5kZXhdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYTJba10gPSBmbihjdXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGEyXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZSAobykge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkgcmV0dXJuIG9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIGNsb25lQXJyYXkobywgY2xvbmUpXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmUpXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICByZWZzLnB1c2gobylcbiAgICByZWZzTmV3LnB1c2gobzIpXG4gICAgZm9yIChjb25zdCBrIGluIG8pIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSA9PT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICBjb25zdCBjdXIgPSBvW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIG8yW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgbzJba10gPSBoYW5kbGVyKGN1ciwgY2xvbmUpXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIG8yW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpID0gcmVmcy5pbmRleE9mKGN1cilcbiAgICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgICAgbzJba10gPSByZWZzTmV3W2ldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbzJba10gPSBjbG9uZShjdXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmVmcy5wb3AoKVxuICAgIHJlZnNOZXcucG9wKClcbiAgICByZXR1cm4gbzJcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHJvdG8gKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lUHJvdG8pXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmVQcm90bylcbiAgICB9XG4gICAgY29uc3QgbzIgPSB7fVxuICAgIHJlZnMucHVzaChvKVxuICAgIHJlZnNOZXcucHVzaChvMilcbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgY29uc3QgY3VyID0gb1trXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBvMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIG8yW2tdID0gaGFuZGxlcihjdXIsIGNsb25lUHJvdG8pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIG8yW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpID0gcmVmcy5pbmRleE9mKGN1cilcbiAgICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgICAgbzJba10gPSByZWZzTmV3W2ldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbzJba10gPSBjbG9uZVByb3RvKGN1cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZWZzLnBvcCgpXG4gICAgcmVmc05ldy5wb3AoKVxuICAgIHJldHVybiBvMlxuICB9XG59XG4iLCJpbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCJcbmltcG9ydCByZmRjIGZyb20gXCJyZmRjXCJcbmltcG9ydCB0eXBlIHsgSlNPTlZhbHVlIH0gZnJvbSBcIi4vanNvblwiXG5cbmNvbnN0IGNsb25lID0gcmZkYyh7IHByb3RvOiB0cnVlIH0pXG5cbi8qKlxuICogRGVlcCBlcXVhbGl0eSBjaGVjayBmb3IgSlNPTlZhbHVlcy5cbiAqIFVzZWQgZm9yIGFkZFRvU2V0IC8gZGVsZXRlRnJvbVNldCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IEpTT05WYWx1ZSwgYjogSlNPTlZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbChhLCBiKVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRCB1c2luZyBuYW5vaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUlEKCk6IHN0cmluZyB7XG4gIHJldHVybiBuYW5vaWQoKVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdCAodHlwZW9mID09PSBcIm9iamVjdFwiICYmICE9PSBudWxsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxufVxuXG4vKipcbiAqIERlZXAgY2xvbmVzIGEgSlNPTi1zZXJpYWxpemFibGUgdmFsdWUuXG4gKiBPcHRpbWl6ZWQ6IHByaW1pdGl2ZXMgYXJlIHJldHVybmVkIGFzLWlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lPFQ+KHZhbHVlOiBUKTogVCB7XG4gIC8vIFByaW1pdGl2ZXMgZG9uJ3QgbmVlZCBjbG9uaW5nXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICByZXR1cm4gY2xvbmUodmFsdWUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxhenkgbWVtb2l6ZWQgZ2V0dGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF6eTxUPihmbjogKCkgPT4gVCk6ICgpID0+IFQge1xuICBsZXQgY29tcHV0ZWQgPSBmYWxzZVxuICBsZXQgdmFsdWU6IFRcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIWNvbXB1dGVkKSB7XG4gICAgICB2YWx1ZSA9IGZuKClcbiAgICAgIGNvbXB1dGVkID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcbmltcG9ydCB0eXBlIHsgSlNPTk9iamVjdCwgSlNPTlJlY29yZCwgSlNPTlZhbHVlLCBQYXRoIH0gZnJvbSBcIi4vanNvblwiXG5pbXBvcnQgdHlwZSB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBUeFJlY29yZCB9IGZyb20gXCIuL1R4UmVjb3JkXCJcbmltcG9ydCB7IGRlZXBFcXVhbCwgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiXG5cbi8qKlxuICogQSBkcmFmdCBjb250ZXh0IGZvciBjb3B5LW9uLXdyaXRlIGltbXV0YWJsZSB1cGRhdGVzLlxuICpcbiAqIFRoaXMgcHJvdmlkZXMgSW1tZXIvTXV0YXRpdmUtbGlrZSBzZW1hbnRpY3Mgd2l0aG91dCB0aGUgcHJveHkgb3ZlcmhlYWQ6XG4gKiAtIFRoZSBvcmlnaW5hbCBiYXNlIHN0YXRlIGlzIG5ldmVyIG11dGF0ZWRcbiAqIC0gT2JqZWN0cyBhcmUgY2xvbmVkIGxhemlseSBvbiBmaXJzdCBtdXRhdGlvbiAoY29weS1vbi13cml0ZSlcbiAqIC0gT25jZSBhbiBvYmplY3QgaXMgY2xvbmVkIChcIm93bmVkXCIpLCBpdCBjYW4gYmUgbXV0YXRlZCBkaXJlY3RseVxuICogLSBJZiBubyBjaGFuZ2VzIGFyZSBtYWRlLCB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGlzIHByZXNlcnZlZCAoc3RydWN0dXJhbCBzaGFyaW5nKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyYWZ0Q29udGV4dDxUIGV4dGVuZHMgSlNPTk9iamVjdD4ge1xuICAvKiogVGhlIGN1cnJlbnQgcm9vdCAobWF5IGJlIHRoZSBvcmlnaW5hbCBiYXNlIG9yIGEgY2xvbmVkIHZlcnNpb24pICovXG4gIHJvb3Q6IFRcbiAgLyoqIFRoZSBvcmlnaW5hbCBiYXNlIHN0YXRlIChuZXZlciBtdXRhdGVkKSAqL1xuICBiYXNlOiBUXG4gIC8qKiBTZXQgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjbG9uZWQgYW5kIGFyZSBzYWZlIHRvIG11dGF0ZSAqL1xuICBvd25lZE9iamVjdHM6IFdlYWtTZXQ8b2JqZWN0PlxuICAvKiogT3B0aW1pemF0aW9uOiBmYXN0IGNoZWNrIGlmIHJvb3QgaXMgYWxyZWFkeSBvd25lZCAqL1xuICBpc1Jvb3RPd25lZDogYm9vbGVhblxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgY29udGV4dCBmcm9tIGEgYmFzZSBzdGF0ZS5cbiAqIFRoZSBiYXNlIHN0YXRlIHdpbGwgbmV2ZXIgYmUgbXV0YXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURyYWZ0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihiYXNlOiBUKTogRHJhZnRDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIHtcbiAgICByb290OiBiYXNlLFxuICAgIGJhc2UsXG4gICAgb3duZWRPYmplY3RzOiBuZXcgU2V0KCksXG4gICAgaXNSb290T3duZWQ6IGZhbHNlLFxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBkcmFmdCB3YXMgbW9kaWZpZWQgKHJvb3QgIT09IGJhc2UpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEcmFmdE1vZGlmaWVkPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihjdHg6IERyYWZ0Q29udGV4dDxUPik6IGJvb2xlYW4ge1xuICByZXR1cm4gY3R4LnJvb3QgIT09IGN0eC5iYXNlXG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dDbG9uZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBUIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc2xpY2UoKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuICBjb25zdCBjbG9uZSA9IHt9IGFzIFRcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIDsoY2xvbmUgYXMgYW55KVtrZXldID0gKG9iaiBhcyBhbnkpW2tleV1cbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuLyoqXG4gKiBFbnN1cmVzIGFuIG9iamVjdCBpcyBvd25lZCAoY2xvbmVkIGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybnMgdGhlIG93bmVkIHZlcnNpb24uXG4gKiBBbHNvIHVwZGF0ZXMgdGhlIHBhcmVudCB0byBwb2ludCB0byB0aGUgY2xvbmVkIGNoaWxkLlxuICovXG5mdW5jdGlvbiBlbnN1cmVPd25lZDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxuICBwYXJlbnQ6IEpTT05PYmplY3QsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyLFxuICBjaGlsZDogSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdXG4pOiBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10ge1xuICBpZiAoY3R4Lm93bmVkT2JqZWN0cy5oYXMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIGNoaWxkXG4gIH1cbiAgY29uc3QgY2xvbmVkID0gc2hhbGxvd0Nsb25lKGNoaWxkKVxuICA7KHBhcmVudCBhcyBhbnkpW2tleV0gPSBjbG9uZWRcbiAgY3R4Lm93bmVkT2JqZWN0cy5hZGQoY2xvbmVkKVxuICByZXR1cm4gY2xvbmVkXG59XG5cbi8qKlxuICogRW5zdXJlcyBhbGwgb2JqZWN0cyBhbG9uZyB0aGUgcGF0aCBhcmUgb3duZWQgKGNsb25lZCBpZiBuZWNlc3NhcnkpLlxuICogUmV0dXJucyB0aGUgY29udGFpbmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBhdGguXG4gKiBUaHJvd3MgaWYgdGhlIHBhdGggaXMgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gZW5zdXJlT3duZWRQYXRoPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXG4gIHBhdGg6IFBhdGhcbik6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXSB7XG4gIC8vIEVuc3VyZSByb290IGlzIG93bmVkIGZpcnN0XG4gIGlmICghY3R4LmlzUm9vdE93bmVkKSB7XG4gICAgY3R4LnJvb3QgPSBzaGFsbG93Q2xvbmUoY3R4LnJvb3QgYXMgdW5rbm93biBhcyBvYmplY3QpIGFzIFRcbiAgICBjdHgub3duZWRPYmplY3RzLmFkZChjdHgucm9vdClcbiAgICBjdHguaXNSb290T3duZWQgPSB0cnVlXG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gY3R4LnJvb3RcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10gPSBjdHgucm9vdFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRoW2ldXG4gICAgY29uc3QgaXNBcnJheUluZGV4ID0gdHlwZW9mIHNlZ21lbnQgPT09IFwibnVtYmVyXCJcblxuICAgIC8vIFZhbGlkYXRlIGNvbnRhaW5lciB0eXBlXG4gICAgaWYgKGlzQXJyYXlJbmRleCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgICAgIGZhaWx1cmUoYEV4cGVjdGVkIGFycmF5IGF0IHBhdGggc2VnbWVudCAke3NlZ21lbnR9YClcbiAgICAgIH1cbiAgICAgIGlmIChzZWdtZW50IDwgMCB8fCBzZWdtZW50ID49IGN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAgIGZhaWx1cmUoYEluZGV4ICR7c2VnbWVudH0gb3V0IG9mIGJvdW5kc2ApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNPYmplY3QoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICBmYWlsdXJlKGBFeHBlY3RlZCBvYmplY3QgYXQgcGF0aCBzZWdtZW50IFwiJHtzZWdtZW50fVwiYClcbiAgICAgIH1cbiAgICAgIGlmICghKHNlZ21lbnQgaW4gY3VycmVudCkpIHtcbiAgICAgICAgZmFpbHVyZShgUHJvcGVydHkgXCIke3NlZ21lbnR9XCIgZG9lcyBub3QgZXhpc3RgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkOiBKU09OVmFsdWUgPSAoY3VycmVudCBhcyBhbnkpW3NlZ21lbnRdXG5cbiAgICAvLyBWYWxpZGF0ZSBjaGlsZCBpcyB0cmF2ZXJzYWJsZVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZhaWx1cmUoYENhbm5vdCB0cmF2ZXJzZSB0aHJvdWdoIHByaW1pdGl2ZSBhdCBwYXRoIHNlZ21lbnQgJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGNoaWxkIGlzIG93bmVkIGFuZCBjb250aW51ZVxuICAgIGN1cnJlbnQgPSBlbnN1cmVPd25lZChjdHgsIGN1cnJlbnQsIHNlZ21lbnQsIGNoaWxkIGFzIEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXSlcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbmdsZSBcInNldFwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZnRTZXQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcbiAgcGF0aDogUGF0aCxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBKU09OVmFsdWVcbik6IHZvaWQge1xuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgZmFpbHVyZShcInNldCByZXF1aXJlcyBvYmplY3QgY29udGFpbmVyXCIpXG4gIH1cbiAgOyhjb250YWluZXIgYXMgSlNPTlJlY29yZClba2V5XSA9IHZhbHVlXG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbmdsZSBcImRlbGV0ZVwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZnREZWxldGU8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcbiAgcGF0aDogUGF0aCxcbiAga2V5OiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgZmFpbHVyZShcImRlbGV0ZSByZXF1aXJlcyBvYmplY3QgY29udGFpbmVyXCIpXG4gIH1cbiAgZGVsZXRlIChjb250YWluZXIgYXMgSlNPTlJlY29yZClba2V5XVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJzcGxpY2VcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0U3BsaWNlPFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXG4gIHBhdGg6IFBhdGgsXG4gIGluZGV4OiBudW1iZXIsXG4gIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gIGluc2VydHM6IHJlYWRvbmx5IEpTT05WYWx1ZVtdXG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBmYWlsdXJlKFwic3BsaWNlIHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxuICB9XG4gIGNvbnN0IHNhZmVJbmRleCA9IE1hdGgubWluKGluZGV4LCBjb250YWluZXIubGVuZ3RoKVxuICBpZiAoaW5zZXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICBjb250YWluZXIuc3BsaWNlKHNhZmVJbmRleCwgZGVsZXRlQ291bnQpXG4gIH0gZWxzZSBpZiAoaW5zZXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb250YWluZXIuc3BsaWNlKHNhZmVJbmRleCwgZGVsZXRlQ291bnQsIGluc2VydHNbMF0pXG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnNwbGljZShzYWZlSW5kZXgsIGRlbGV0ZUNvdW50LCAuLi5pbnNlcnRzKVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbmdsZSBcImFkZFRvU2V0XCIgb3BlcmF0aW9uIHRvIHRoZSBkcmFmdCB3aXRoIGNvcHktb24td3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmFmdEFkZFRvU2V0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXG4gIHBhdGg6IFBhdGgsXG4gIHZhbHVlOiBKU09OVmFsdWVcbik6IHZvaWQge1xuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xuICAgIGZhaWx1cmUoXCJhZGRUb1NldCByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcbiAgfVxuICBpZiAoIWNvbnRhaW5lci5zb21lKChpdGVtKSA9PiBkZWVwRXF1YWwoaXRlbSwgdmFsdWUpKSkge1xuICAgIGNvbnRhaW5lci5wdXNoKHZhbHVlKVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbmdsZSBcImRlbGV0ZUZyb21TZXRcIiBvcGVyYXRpb24gdG8gdGhlIGRyYWZ0IHdpdGggY29weS1vbi13cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0RGVsZXRlRnJvbVNldDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxuICBwYXRoOiBQYXRoLFxuICB2YWx1ZTogSlNPTlZhbHVlXG4pOiB2b2lkIHtcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBmYWlsdXJlKFwiZGVsZXRlRnJvbVNldCByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcbiAgfVxuICAvLyBSZW1vdmUgYWxsIG1hdGNoaW5nIGl0ZW1zIChpdGVyYXRlIGJhY2t3YXJkcyB0byBhdm9pZCBpbmRleCBzaGlmdGluZylcbiAgZm9yIChsZXQgaSA9IGNvbnRhaW5lci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkZWVwRXF1YWwoY29udGFpbmVyW2ldLCB2YWx1ZSkpIHtcbiAgICAgIGNvbnRhaW5lci5zcGxpY2UoaSwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPcFRvRHJhZnQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KGN0eDogRHJhZnRDb250ZXh0PFQ+LCBvcDogT3ApOiB2b2lkIHtcbiAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgY2FzZSBcInNldFwiOlxuICAgICAgZHJhZnRTZXQoY3R4LCBvcC5wYXRoLCBvcC5rZXksIG9wLnZhbHVlKVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICBkcmFmdERlbGV0ZShjdHgsIG9wLnBhdGgsIG9wLmtleSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcInNwbGljZVwiOlxuICAgICAgZHJhZnRTcGxpY2UoY3R4LCBvcC5wYXRoLCBvcC5pbmRleCwgb3AuZGVsZXRlQ291bnQsIG9wLmluc2VydHMpXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJhZGRUb1NldFwiOlxuICAgICAgZHJhZnRBZGRUb1NldChjdHgsIG9wLnBhdGgsIG9wLnZhbHVlKVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiZGVsZXRlRnJvbVNldFwiOlxuICAgICAgZHJhZnREZWxldGVGcm9tU2V0KGN0eCwgb3AucGF0aCwgb3AudmFsdWUpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBmYWlsdXJlKGBVbmtub3duIG9wZXJhdGlvbiBraW5kOiAkeyhvcCBhcyBhbnkpLmtpbmR9YClcbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24gdG8gYSBiYXNlIHN0YXRlIGltbXV0YWJseS5cbiAqXG4gKiBLZXkgYmVuZWZpdHMgb3ZlciBNdXRhdGl2ZS9JbW1lcjpcbiAqIC0gTm8gcHJveHkgb3ZlcmhlYWQgLSBkaXJlY3Qgb2JqZWN0IGFjY2VzcyBhbmQgY29weS1vbi13cml0ZSBjbG9uaW5nXG4gKiAtIFN0cnVjdHVyYWwgc2hhcmluZyAtIHVuY2hhbmdlZCBzdWJ0cmVlcyBrZWVwIHRoZWlyIHJlZmVyZW5jZXNcbiAqIC0gWmVyby1jb3B5IG9uIGZhaWx1cmUgLSBpZiB2YWxpZGF0aW9uIGZhaWxzLCByZXR1cm5zIG9yaWdpbmFsIGJhc2UgdW5jaGFuZ2VkXG4gKlxuICogQHBhcmFtIGJhc2UgLSBUaGUgYmFzZSBzdGF0ZSAobmV2ZXIgbXV0YXRlZClcbiAqIEBwYXJhbSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byBhcHBseVxuICogQHBhcmFtIHZhbGlkYXRlRm4gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBUaGUgZmluYWwgc3RhdGUgKGlmIHZhbGlkKSBvciB0aGUgb3JpZ2luYWwgYmFzZSAoaWYgaW52YWxpZCBvciBlbXB0eSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VHhJbW11dGFibGU8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxuICBiYXNlOiBULFxuICB0eDogUGljazxUeFJlY29yZCwgXCJvcHNcIj4sXG4gIHZhbGlkYXRlRm4/OiBWYWxpZGF0ZUZuPFQ+XG4pOiBUIHtcbiAgaWYgKHR4Lm9wcy5sZW5ndGggPT09IDApIHJldHVybiBiYXNlXG5cbiAgY29uc3QgY3R4ID0gY3JlYXRlRHJhZnQoYmFzZSlcblxuICB0cnkge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdHgub3BzKSB7XG4gICAgICBhcHBseU9wVG9EcmFmdChjdHgsIG9wKVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZUZuICYmICF2YWxpZGF0ZUZuKGN0eC5yb290KSkge1xuICAgICAgcmV0dXJuIGJhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gY3R4LnJvb3RcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcbmltcG9ydCB7IEpTT05SZWNvcmQsIEpTT05WYWx1ZSwgUGF0aCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcblxuLyoqXG4gKiBSZWNvbmNpbGVzIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggdGhlIHRhcmdldCBzdGF0ZSBieSBjb21wdXRpbmcgYW5kIGVtaXR0aW5nXG4gKiB0aGUgbWluaW1hbCBzZXQgb2Ygb3BlcmF0aW9ucyBuZWVkZWQgdG8gdHJhbnNmb3JtIGN1cnJlbnRTdGF0ZSBpbnRvIHRhcmdldFN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlY29uY2lsZU9wcyhjdXJyZW50U3RhdGU6IEpTT05WYWx1ZSwgdGFyZ2V0U3RhdGU6IEpTT05WYWx1ZSk6IE9wW10ge1xuICBjb25zdCBvcHM6IE9wW10gPSBbXVxuICBkaWZmVmFsdWUoY3VycmVudFN0YXRlLCB0YXJnZXRTdGF0ZSwgW10sIG9wcylcbiAgcmV0dXJuIG9wc1xufVxuXG5mdW5jdGlvbiBkaWZmVmFsdWUoY3VycmVudDogSlNPTlZhbHVlLCB0YXJnZXQ6IEpTT05WYWx1ZSwgcGF0aDogUGF0aCwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIC8vIDEuIFJlZmVyZW5jZSBlcXVhbGl0eSAoc3RydWN0dXJhbCBzaGFyaW5nKVxuICBpZiAoY3VycmVudCA9PT0gdGFyZ2V0KSByZXR1cm5cblxuICAvLyAyLiBIYW5kbGUgcHJpbWl0aXZlcyBhbmQgbnVsbCBxdWlja2x5XG4gIGNvbnN0IGN1cnJlbnRUeXBlID0gdHlwZW9mIGN1cnJlbnRcbiAgY29uc3QgdGFyZ2V0VHlwZSA9IHR5cGVvZiB0YXJnZXRcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IG51bGwgfHwgY3VycmVudFR5cGUgIT09IFwib2JqZWN0XCIgfHwgdGFyZ2V0VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIC8vIEF0IGxlYXN0IG9uZSBpcyBwcmltaXRpdmUvbnVsbCwgb3IgdHlwZXMgZG9uJ3QgbWF0Y2hcbiAgICBlbWl0UmVwbGFjZShwYXRoLCB0YXJnZXQsIG9wcylcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEJvdGggYXJlIG9iamVjdHMgKG9iamVjdCBvciBhcnJheSlcbiAgY29uc3QgY3VycmVudElzQXJyYXkgPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpXG4gIGNvbnN0IHRhcmdldElzQXJyYXkgPSBBcnJheS5pc0FycmF5KHRhcmdldClcblxuICBpZiAoY3VycmVudElzQXJyYXkgIT09IHRhcmdldElzQXJyYXkpIHtcbiAgICAvLyBUeXBlIG1pc21hdGNoIChvbmUgYXJyYXksIG9uZSBvYmplY3QpXG4gICAgZW1pdFJlcGxhY2UocGF0aCwgdGFyZ2V0LCBvcHMpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoY3VycmVudElzQXJyYXkpIHtcbiAgICBkaWZmQXJyYXkoY3VycmVudCwgdGFyZ2V0IGFzIEpTT05WYWx1ZVtdLCBwYXRoLCBvcHMpXG4gIH0gZWxzZSB7XG4gICAgZGlmZk9iamVjdChjdXJyZW50IGFzIEpTT05SZWNvcmQsIHRhcmdldCBhcyBKU09OUmVjb3JkLCBwYXRoLCBvcHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZk9iamVjdChjdXJyZW50OiBKU09OUmVjb3JkLCB0YXJnZXQ6IEpTT05SZWNvcmQsIHBhdGg6IFBhdGgsIG9wczogT3BbXSk6IHZvaWQge1xuICAvLyAxLiBEZWxldGUga2V5cyBpbiBjdXJyZW50IGJ1dCBub3QgaW4gdGFyZ2V0XG4gIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihjdXJyZW50LCBrZXkpICYmICFPYmplY3QuaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgICAgb3BzLnB1c2goeyBraW5kOiBcImRlbGV0ZVwiLCBwYXRoLCBrZXkgfSlcbiAgICB9XG4gIH1cblxuICAvLyAyLiBBZGQvVXBkYXRlIGtleXMgaW4gdGFyZ2V0XG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV1cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihjdXJyZW50LCBrZXkpKSB7XG4gICAgICAgIG9wcy5wdXNoKHsga2luZDogXCJzZXRcIiwgcGF0aCwga2V5LCB2YWx1ZTogdGFyZ2V0VmFsIH0pXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRba2V5XSAhPT0gdGFyZ2V0VmFsKSB7XG4gICAgICAgIC8vIE9ubHkgcmVjdXJzZSBpZiB2YWx1ZXMgZGlmZmVyIChyZWZlcmVuY2UgY2hlY2sgZmlyc3QpXG4gICAgICAgIGRpZmZWYWx1ZShjdXJyZW50W2tleV0sIHRhcmdldFZhbCwgWy4uLnBhdGgsIGtleV0sIG9wcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkFycmF5KGN1cnJlbnQ6IEpTT05WYWx1ZVtdLCB0YXJnZXQ6IEpTT05WYWx1ZVtdLCBwYXRoOiBQYXRoLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudExlbiA9IGN1cnJlbnQubGVuZ3RoXG4gIGNvbnN0IHRhcmdldExlbiA9IHRhcmdldC5sZW5ndGhcbiAgY29uc3QgbWluTGVuID0gY3VycmVudExlbiA8IHRhcmdldExlbiA/IGN1cnJlbnRMZW4gOiB0YXJnZXRMZW5cblxuICAvLyBEaWZmIGNvbW1vbiBlbGVtZW50c1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkxlbjsgaSsrKSB7XG4gICAgaWYgKGN1cnJlbnRbaV0gIT09IHRhcmdldFtpXSkge1xuICAgICAgZGlmZlZhbHVlKGN1cnJlbnRbaV0sIHRhcmdldFtpXSwgWy4uLnBhdGgsIGldLCBvcHMpXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIGxlbmd0aCBkaWZmZXJlbmNlXG4gIGlmICh0YXJnZXRMZW4gPiBjdXJyZW50TGVuKSB7XG4gICAgb3BzLnB1c2goe1xuICAgICAga2luZDogXCJzcGxpY2VcIixcbiAgICAgIHBhdGgsXG4gICAgICBpbmRleDogY3VycmVudExlbixcbiAgICAgIGRlbGV0ZUNvdW50OiAwLFxuICAgICAgaW5zZXJ0czogdGFyZ2V0LnNsaWNlKGN1cnJlbnRMZW4pLFxuICAgIH0pXG4gIH0gZWxzZSBpZiAoY3VycmVudExlbiA+IHRhcmdldExlbikge1xuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoLFxuICAgICAgaW5kZXg6IHRhcmdldExlbixcbiAgICAgIGRlbGV0ZUNvdW50OiBjdXJyZW50TGVuIC0gdGFyZ2V0TGVuLFxuICAgICAgaW5zZXJ0czogW10sXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVwbGFjZShwYXRoOiBQYXRoLCB2YWx1ZTogSlNPTlZhbHVlLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gQ2Fubm90IHJlcGxhY2Ugcm9vdCBkaXJlY3RseSB2aWEgT3BzICh1bmxlc3Mgd2UgZGVmaW5lIGEgJ3Jvb3QnIG9wLCB3aGljaCB3ZSBkb24ndClcbiAgICAvLyBXZSBleHBlY3Qgcm9vdCB0byBiZSBoYW5kbGVkIGJ5IGRpZmZPYmplY3QgdXN1YWxseS5cbiAgICAvLyBJZiB3ZSBsYW5kIGhlcmUsIGl0IG1lYW5zIHJvb3QgdHlwZXMgbWlzbWF0Y2hlZCAoZS5nLiBPYmogLT4gQXJyYXkpLlxuICAgIGZhaWx1cmUoXCJTdGF0ZVN5bmNMb2c6IENhbm5vdCByZXBsYWNlIHJvb3Qgc3RhdGUgZGlyZWN0bHkgdmlhIE9wcy5cIilcbiAgfVxuXG4gIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICBjb25zdCBrZXlUb0NoZWNrID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG5cbiAgaWYgKHR5cGVvZiBrZXlUb0NoZWNrID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gUGFyZW50IGlzIE9iamVjdFxuICAgIG9wcy5wdXNoKHsga2luZDogXCJzZXRcIiwgcGF0aDogcGFyZW50UGF0aCwga2V5OiBrZXlUb0NoZWNrLCB2YWx1ZSB9KVxuICB9IGVsc2Uge1xuICAgIC8vIFBhcmVudCBpcyBBcnJheVxuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoOiBwYXJlbnRQYXRoLFxuICAgICAgaW5kZXg6IGtleVRvQ2hlY2ssXG4gICAgICBkZWxldGVDb3VudDogMSxcbiAgICAgIGluc2VydHM6IFt2YWx1ZV0sXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcblxuLyoqXG4gKiBQYXJzZWQgdHggdGltZXN0YW1wIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFR4VGltZXN0YW1wID0ge1xuICBlcG9jaDogbnVtYmVyXG4gIGNsb2NrOiBudW1iZXJcbiAgY2xpZW50SWQ6IHN0cmluZ1xuICB3YWxsQ2xvY2s6IG51bWJlclxufVxuXG4vKipcbiAqIFVuaXF1ZSB0eCBJRCAoQ29tcG9zaXRlIEtleSkuXG4gKi9cbmV4cG9ydCB0eXBlIFR4VGltZXN0YW1wS2V5ID0gc3RyaW5nXG5cbi8qKlxuICogQ29udmVydHMgYSB0aW1lc3RhbXAgb2JqZWN0IHRvIGEgVHJhbnNhY3Rpb25UaW1lc3RhbXBLZXkgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHhUaW1lc3RhbXBUb0tleSh0czogVHhUaW1lc3RhbXApOiBUeFRpbWVzdGFtcEtleSB7XG4gIHJldHVybiBgJHt0cy5lcG9jaH07JHt0cy5jbG9ja307JHt0cy5jbGllbnRJZH07JHt0cy53YWxsQ2xvY2t9YFxufVxuXG4vKipcbiAqIEhlbHBlciB0byBwYXJzZSB0eCB0aW1lc3RhbXAga2V5cy5cbiAqIFRocm93cyBpZiBrZXkgaXMgbWFsZm9ybWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUeFRpbWVzdGFtcEtleShrZXk6IFR4VGltZXN0YW1wS2V5KTogVHhUaW1lc3RhbXAge1xuICBjb25zdCBpMSA9IGtleS5pbmRleE9mKFwiO1wiKVxuICBjb25zdCBpMiA9IGtleS5pbmRleE9mKFwiO1wiLCBpMSArIDEpXG4gIGNvbnN0IGkzID0ga2V5LmluZGV4T2YoXCI7XCIsIGkyICsgMSlcblxuICBpZiAoaTEgPT09IC0xIHx8IGkyID09PSAtMSB8fCBpMyA9PT0gLTEpIHtcbiAgICBmYWlsdXJlKGBNYWxmb3JtZWQgdGltZXN0YW1wIGtleTogJHtrZXl9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXBvY2g6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKDAsIGkxKSwgMTApLFxuICAgIGNsb2NrOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZyhpMSArIDEsIGkyKSwgMTApLFxuICAgIGNsaWVudElkOiBrZXkuc3Vic3RyaW5nKGkyICsgMSwgaTMpLFxuICAgIHdhbGxDbG9jazogTnVtYmVyLnBhcnNlSW50KGtleS5zdWJzdHJpbmcoaTMgKyAxKSwgMTApLFxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHR4IHRpbWVzdGFtcHMgZm9yIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gKiBTb3J0IG9yZGVyOiBlcG9jaCAoYXNjKSDihpIgY2xvY2sgKGFzYykg4oaSIGNsaWVudElkIChhc2MpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVHhUaW1lc3RhbXBzKGE6IFR4VGltZXN0YW1wLCBiOiBUeFRpbWVzdGFtcCk6IG51bWJlciB7XG4gIGlmIChhLmVwb2NoICE9PSBiLmVwb2NoKSByZXR1cm4gYS5lcG9jaCAtIGIuZXBvY2hcbiAgaWYgKGEuY2xvY2sgIT09IGIuY2xvY2spIHJldHVybiBhLmNsb2NrIC0gYi5jbG9ja1xuICBpZiAoYS5jbGllbnRJZCA8IGIuY2xpZW50SWQpIHJldHVybiAtMVxuICBpZiAoYS5jbGllbnRJZCA+IGIuY2xpZW50SWQpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG4iLCJpbXBvcnQgdHlwZSAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBwYXJzZVR4VGltZXN0YW1wS2V5LCB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIEEgY2FjaGVkIHR4IGVudHJ5IHdpdGggbGF6eSBwYXJzaW5nIGFuZCBvcHRpb25hbCB0eCBjYWNoaW5nLlxuICogVGhlIHRpbWVzdGFtcCBpcyBwYXJzZWQgb24gZmlyc3QgYWNjZXNzIGFuZCBjYWNoZWQuXG4gKiBUaGUgdHggcmVjb3JkIGNhbiBiZSBmZXRjaGVkIGxhemlseSBhbmQgY2FjaGVkLlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVkVHhFbnRyeSB7XG4gIHByaXZhdGUgX3R4VGltZXN0YW1wPzogVHhUaW1lc3RhbXBcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUeFRpbWVzdGFtcEtleT86IFR4VGltZXN0YW1wS2V5IHwgbnVsbFxuICBwcml2YXRlIF9vcmlnaW5hbFR4VGltZXN0YW1wPzogVHhUaW1lc3RhbXAgfCBudWxsXG4gIHByaXZhdGUgX3R4UmVjb3JkPzogVHhSZWNvcmRcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0eFRpbWVzdGFtcEtleTogVHhUaW1lc3RhbXBLZXksXG4gICAgcHJpdmF0ZSByZWFkb25seSBfeVR4OiBZLk1hcDxUeFJlY29yZD5cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgdGltZXN0YW1wLCBsYXppbHkgcGFyc2luZyBhbmQgY2FjaGluZyBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICBnZXQgdHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAge1xuICAgIGlmICghdGhpcy5fdHhUaW1lc3RhbXApIHtcbiAgICAgIHRoaXMuX3R4VGltZXN0YW1wID0gcGFyc2VUeFRpbWVzdGFtcEtleSh0aGlzLnR4VGltZXN0YW1wS2V5KVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHhUaW1lc3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvcmlnaW5hbCB0eCB0aW1lc3RhbXAga2V5LCBsYXppbHkgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IG9yaWdpbmFsVHhUaW1lc3RhbXBLZXkoKTogVHhUaW1lc3RhbXBLZXkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0eCA9IHRoaXMudHhSZWNvcmRcbiAgICAgIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPSB0eC5vcmlnaW5hbFR4S2V5ID8/IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgb3JpZ2luYWwgdHggdGltZXN0YW1wLCBsYXppbHkgcGFyc2luZyBhbmQgY2FjaGluZyBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICBnZXQgb3JpZ2luYWxUeFRpbWVzdGFtcCgpOiBUeFRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICh0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMub3JpZ2luYWxUeFRpbWVzdGFtcEtleVxuICAgICAgdGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcCA9IGtleSA/IHBhcnNlVHhUaW1lc3RhbXBLZXkoa2V5KSA6IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2dpY2FsIChkZWR1cGxpY2F0ZWQpIHR4IHRpbWVzdGFtcCBrZXkuXG4gICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHR4IGtleSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgcGh5c2ljYWwga2V5LlxuICAgKi9cbiAgZ2V0IGRlZHVwVHhUaW1lc3RhbXBLZXkoKTogVHhUaW1lc3RhbXBLZXkge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPz8gdGhpcy50eFRpbWVzdGFtcEtleVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvZ2ljYWwgKGRlZHVwbGljYXRlZCkgcGFyc2VkIHR4IHRpbWVzdGFtcC5cbiAgICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgdHggdGltZXN0YW1wIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBwaHlzaWNhbCB0aW1lc3RhbXAuXG4gICAqL1xuICBnZXQgZGVkdXBUeFRpbWVzdGFtcCgpOiBUeFRpbWVzdGFtcCB7XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxUeFRpbWVzdGFtcCA/PyB0aGlzLnR4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHggcmVjb3JkLCBsYXppbHkgZmV0Y2hpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgdHggZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGdldCB0eFJlY29yZCgpOiBUeFJlY29yZCB7XG4gICAgaWYgKCF0aGlzLl90eFJlY29yZCkge1xuICAgICAgdGhpcy5fdHhSZWNvcmQgPSB0aGlzLl95VHguZ2V0KHRoaXMudHhUaW1lc3RhbXBLZXkpXG4gICAgICBpZiAoIXRoaXMuX3R4UmVjb3JkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoYFNvcnRlZFR4RW50cnk6IFR4UmVjb3JkIG5vdCBmb3VuZCBmb3Iga2V5ICR7dGhpcy50eFRpbWVzdGFtcEtleX1gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHhSZWNvcmRcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgdHlwZSBDaGVja3BvaW50UmVjb3JkLCB0eXBlIENsaWVudFdhdGVybWFya3MgfSBmcm9tIFwiLi9jaGVja3BvaW50c1wiXG5pbXBvcnQgeyBhcHBseVR4SW1tdXRhYmxlIH0gZnJvbSBcIi4vZHJhZnRcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AsIFZhbGlkYXRlRm4gfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcbmltcG9ydCB7IGNvbXB1dGVSZWNvbmNpbGVPcHMgfSBmcm9tIFwiLi9yZWNvbmNpbGVcIlxuaW1wb3J0IHsgU29ydGVkVHhFbnRyeSB9IGZyb20gXCIuL1NvcnRlZFR4RW50cnlcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBjb21wYXJlVHhUaW1lc3RhbXBzLCB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYSB0cmFuc2FjdGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBjaGVja3BvaW50IHdhdGVybWFya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zYWN0aW9uSW5DaGVja3BvaW50KHRzOiBUeFRpbWVzdGFtcCwgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyk6IGJvb2xlYW4ge1xuICBjb25zdCB3bSA9IHdhdGVybWFya3NbdHMuY2xpZW50SWRdXG4gIGlmICghd20pIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHMuY2xvY2sgPD0gd20ubWF4Q2xvY2tcbn1cblxuLyoqXG4gKiBTdGF0ZUNhbGN1bGF0b3IgZW5jYXBzdWxhdGVzIHRoZSBzb3J0ZWQgdHJhbnNhY3Rpb24gY2FjaGUgYW5kIHN0YXRlIGNhbGN1bGF0aW9uIGxvZ2ljLlxuICpcbiAqIEl0IG1haW50YWluczpcbiAqIC0gQSBzb3J0ZWQgYXJyYXkgb2YgdHJhbnNhY3Rpb24gZW50cmllc1xuICogLSBBIG1hcCBmb3IgTygxKSBsb29rdXBcbiAqIC0gQSB0cmFja2luZyBpbmRleCBpbmRpY2F0aW5nIHVwIHRvIHdoaWNoIHR4IHRoZSBzdGF0ZSBoYXMgYmVlbiBjYWxjdWxhdGVkXG4gKiAtIFRoZSBjYWNoZWQgY2FsY3VsYXRlZCBzdGF0ZVxuICogLSBUaGUgYmFzZSBjaGVja3BvaW50XG4gKlxuICogVGhlIHRyYWNraW5nIGluZGV4IGlzIGludmFsaWRhdGVkIChzZXQgdG8gbnVsbCkgd2hlbjpcbiAqIC0gQSB0cmFuc2FjdGlvbiBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIGFscmVhZHktY2FsY3VsYXRlZCBzbGljZVxuICogLSBBIHRyYW5zYWN0aW9uIGlzIGRlbGV0ZWQgZnJvbSB0aGUgYWxyZWFkeS1jYWxjdWxhdGVkIHNsaWNlXG4gKiAtIFRoZSBiYXNlIGNoZWNrcG9pbnQgY2hhbmdlc1xuICovXG5leHBvcnQgY2xhc3MgU3RhdGVDYWxjdWxhdG9yIHtcbiAgLyoqIFNvcnRlZCB0eCBjYWNoZSAoQUxMIGFjdGl2ZS9mdXR1cmUgdHhzLCBrZXB0IHNvcnRlZCBieSB0aW1lc3RhbXApICovXG4gIHByaXZhdGUgc29ydGVkVHhzOiBTb3J0ZWRUeEVudHJ5W10gPSBbXVxuXG4gIC8qKiBPKDEpIGV4aXN0ZW5jZSBjaGVjayBhbmQgbG9va3VwICovXG4gIHByaXZhdGUgc29ydGVkVHhzTWFwOiBNYXA8VHhUaW1lc3RhbXBLZXksIFNvcnRlZFR4RW50cnk+ID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIEluZGV4IG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGFwcGxpZWQgdG8gY2FjaGVkU3RhdGUuXG4gICAqIC0gbnVsbDogc3RhdGUgbmVlZHMgZnVsbCByZWNhbGN1bGF0aW9uIGZyb20gY2hlY2twb2ludFxuICAgKiAtIC0xOiBubyB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWQgeWV0IChzdGF0ZSA9PT0gY2hlY2twb2ludCBzdGF0ZSlcbiAgICogLSA+PSAwOiB0cmFuc2FjdGlvbnMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGluZGV4IGhhdmUgYmVlbiBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGxhc3RBcHBsaWVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgLyoqIFRoZSBjYWNoZWQgY2FsY3VsYXRlZCBzdGF0ZSAqL1xuICBwcml2YXRlIGNhY2hlZFN0YXRlOiBKU09OT2JqZWN0IHwgbnVsbCA9IG51bGxcblxuICAvKiogVGhlIGJhc2UgY2hlY2twb2ludCB0byBjYWxjdWxhdGUgc3RhdGUgZnJvbSAqL1xuICBwcml2YXRlIGJhc2VDaGVja3BvaW50OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogQXBwbGllZCBkZWR1cCBrZXlzIC0gdHJhY2tzIHdoaWNoIExPR0lDQUwgdHhzIGhhdmUgYmVlbiBhcHBsaWVkLlxuICAgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbFR4S2V5IChvciBwaHlzaWNhbCBrZXkgaWYgbm8gb3JpZ2luYWwpIGZvciBlYWNoIGFwcGxpZWQgdHguXG4gICAqIFVzZWQgdG8gcHJvcGVybHkgZGVkdXBsaWNhdGUgcmUtZW1pdHMuXG4gICAqL1xuICBwcml2YXRlIGFwcGxpZWRUeEtleXM6IFNldDxUeFRpbWVzdGFtcEtleT4gPSBuZXcgU2V0KClcblxuICAvKiogTWF4IGNsb2NrIHNlZW4gZnJvbSBhbnkgdHJhbnNhY3Rpb24gKGZvciBMYW1wb3J0IGNsb2NrIHVwZGF0ZXMpICovXG4gIHByaXZhdGUgbWF4U2VlbkNsb2NrID0gMFxuXG4gIC8qKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIChvcHRpb25hbCkgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZuPzogVmFsaWRhdGVGbjxKU09OT2JqZWN0PlxuXG4gIGNvbnN0cnVjdG9yKHZhbGlkYXRlRm4/OiBWYWxpZGF0ZUZuPEpTT05PYmplY3Q+KSB7XG4gICAgdGhpcy52YWxpZGF0ZUZuID0gdmFsaWRhdGVGblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJhc2UgY2hlY2twb2ludC4gSW52YWxpZGF0ZXMgY2FjaGVkIHN0YXRlIGlmIGNoZWNrcG9pbnQgY2hhbmdlZC5cbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hlY2twb2ludCBjaGFuZ2VkXG4gICAqL1xuICBzZXRCYXNlQ2hlY2twb2ludChjaGVja3BvaW50OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChjaGVja3BvaW50ID09PSB0aGlzLmJhc2VDaGVja3BvaW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLmJhc2VDaGVja3BvaW50ID0gY2hlY2twb2ludFxuICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGJhc2UgY2hlY2twb2ludC5cbiAgICovXG4gIGdldEJhc2VDaGVja3BvaW50KCk6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ2hlY2twb2ludFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgdHJhbnNhY3Rpb25zIGFuZCByZWJ1aWxkcyBmcm9tIHlUeCBtYXAuXG4gICAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjaGVja3BvaW50IGNoYW5nZXMgYW5kIHdlIG5lZWQgYSBmcmVzaCBzdGFydC5cbiAgICovXG4gIHJlYnVpbGRGcm9tWWpzKHlUeDogWS5NYXA8VHhSZWNvcmQ+KTogdm9pZCB7XG4gICAgdGhpcy5zb3J0ZWRUeHMgPSBbXVxuICAgIHRoaXMuc29ydGVkVHhzTWFwLmNsZWFyKClcblxuICAgIC8vIENvbGxlY3QgYWxsIGVudHJpZXMsIGJ1aWxkIHRoZSBtYXAgYW5kIG1heCBjbG9ja1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHlUeC5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IFNvcnRlZFR4RW50cnkoa2V5LCB5VHgpXG4gICAgICB0aGlzLnNvcnRlZFR4cy5wdXNoKGVudHJ5KVxuXG4gICAgICB0aGlzLnNvcnRlZFR4c01hcC5zZXQoZW50cnkudHhUaW1lc3RhbXBLZXksIGVudHJ5KVxuICAgICAgaWYgKGVudHJ5LnR4VGltZXN0YW1wLmNsb2NrID4gdGhpcy5tYXhTZWVuQ2xvY2spIHtcbiAgICAgICAgdGhpcy5tYXhTZWVuQ2xvY2sgPSBlbnRyeS50eFRpbWVzdGFtcC5jbG9ja1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgb25jZSAtIE8obiBsb2cgbilcbiAgICB0aGlzLnNvcnRlZFR4cy5zb3J0KChhLCBiKSA9PiBjb21wYXJlVHhUaW1lc3RhbXBzKGEudHhUaW1lc3RhbXAsIGIudHhUaW1lc3RhbXApKVxuXG4gICAgLy8gSW52YWxpZGF0ZSBjYWNoZWQgc3RhdGUgc2luY2Ugd2UgcmVidWlsdFxuICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0cyBhIHRyYW5zYWN0aW9uIGludG8gdGhlIHNvcnRlZCBjYWNoZS5cbiAgICogSW52YWxpZGF0ZXMgY2FjaGVkIHN0YXRlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBjYWxjdWxhdGVkIHNsaWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgY2F1c2VkIGludmFsaWRhdGlvbiAob3V0LW9mLW9yZGVyIGluc2VydClcbiAgICovXG4gIGluc2VydFR4KGtleTogVHhUaW1lc3RhbXBLZXksIHlUeDogWS5NYXA8VHhSZWNvcmQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc29ydGVkVHhzTWFwLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2UgLy8gQWxyZWFkeSBleGlzdHNcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeSA9IG5ldyBTb3J0ZWRUeEVudHJ5KGtleSwgeVR4KVxuICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcblxuICAgIC8vIFVwZGF0ZSBtYXggc2VlbiBjbG9jayBmb3IgTGFtcG9ydCBjbG9jayBtZWNoYW5pc21cbiAgICBpZiAodHMuY2xvY2sgPiB0aGlzLm1heFNlZW5DbG9jaykge1xuICAgICAgdGhpcy5tYXhTZWVuQ2xvY2sgPSB0cy5jbG9ja1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZFR4cyA9IHRoaXMuc29ydGVkVHhzXG5cbiAgICAvLyBGaW5kIGluc2VydGlvbiBwb3NpdGlvbiAoc2VhcmNoIGZyb20gZW5kIHNpbmNlIG5ldyB0eHMgdHlwaWNhbGx5IGhhdmUgaGlnaGVyIHRpbWVzdGFtcHMpXG4gICAgbGV0IGluc2VydEluZGV4ID0gc29ydGVkVHhzLmxlbmd0aCAvLyBEZWZhdWx0OiBhcHBlbmQgYXQgZW5kXG4gICAgZm9yIChsZXQgaSA9IHNvcnRlZFR4cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdUcyA9IHNvcnRlZFR4c1tpXS50eFRpbWVzdGFtcFxuICAgICAgaWYgKGNvbXBhcmVUeFRpbWVzdGFtcHModHMsIGV4aXN0aW5nVHMpID49IDApIHtcbiAgICAgICAgaW5zZXJ0SW5kZXggPSBpICsgMVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgaW5zZXJ0SW5kZXggPSAwIC8vIEluc2VydCBhdCBiZWdpbm5pbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgYXQgdGhlIGZvdW5kIHBvc2l0aW9uXG4gICAgc29ydGVkVHhzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgZW50cnkpXG4gICAgdGhpcy5zb3J0ZWRUeHNNYXAuc2V0KGtleSwgZW50cnkpXG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGludmFsaWRhdGVzIG91ciBjYWNoZWQgc3RhdGVcbiAgICAvLyBJZiB3ZSBpbnNlcnRlZCBiZWZvcmUgb3IgYXQgdGhlIGxhc3QgYXBwbGllZCBpbmRleCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZVxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggIT09IG51bGwgJiYgaW5zZXJ0SW5kZXggPD0gdGhpcy5sYXN0QXBwbGllZEluZGV4KSB7XG4gICAgICB0aGlzLmludmFsaWRhdGUoKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBzb3J0ZWQgY2FjaGUuXG4gICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVtb3ZlZFxuICAgKi9cbiAgcmVtb3ZlVHhzKGtleXM6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W10pOiBudW1iZXIge1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwXG4gICAgbGV0IG1pblJlbW92ZWRJbmRleCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuXG4gICAgLy8gQnVpbGQgc2V0IG9mIGtleXMgdG8gZGVsZXRlIGFuZCB0cmFjayB0aGVpciBpbmRpY2VzXG4gICAgY29uc3QgdG9EZWxldGUgPSBuZXcgU2V0PFR4VGltZXN0YW1wS2V5PigpXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnNvcnRlZFR4c01hcC5nZXQoa2V5KVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIHRoaXMuc29ydGVkVHhzTWFwLmRlbGV0ZShrZXkpXG4gICAgICAgIHRvRGVsZXRlLmFkZChrZXkpXG5cbiAgICAgICAgLy8gRmluZCBpbmRleCBmb3IgaW52YWxpZGF0aW9uIGNoZWNrXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zb3J0ZWRUeHMuaW5kZXhPZihlbnRyeSlcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCA8IG1pblJlbW92ZWRJbmRleCkge1xuICAgICAgICAgIG1pblJlbW92ZWRJbmRleCA9IGluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9EZWxldGUuc2l6ZSA9PT0gMCkgcmV0dXJuIDBcblxuICAgIC8vIFNpbmdsZSBmb3J3YXJkIHBhc3MgdGhyb3VnaCBzb3J0ZWRUeHMsIHJlbW92aW5nIG1hdGNoaW5nIGVudHJpZXNcbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChpIDwgc29ydGVkVHhzLmxlbmd0aCAmJiB0b0RlbGV0ZS5zaXplID4gMCkge1xuICAgICAgaWYgKHRvRGVsZXRlLmhhcyhzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBLZXkpKSB7XG4gICAgICAgIHRvRGVsZXRlLmRlbGV0ZShzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBLZXkpXG4gICAgICAgIHNvcnRlZFR4cy5zcGxpY2UoaSwgMSlcbiAgICAgICAgcmVtb3ZlZENvdW50KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrK1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaW52YWxpZGF0ZXMgb3VyIGNhY2hlZCBzdGF0ZVxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggIT09IG51bGwgJiYgbWluUmVtb3ZlZEluZGV4IDw9IHRoaXMubGFzdEFwcGxpZWRJbmRleCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlZENvdW50XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdHJhbnNhY3Rpb24ga2V5IGV4aXN0cyBpbiB0aGUgY2FjaGUuXG4gICAqL1xuICBoYXNUeChrZXk6IFR4VGltZXN0YW1wS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzTWFwLmhhcyhrZXkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHRyYW5zYWN0aW9uIGVudHJ5IGJ5IGtleS5cbiAgICovXG4gIGdldFR4KGtleTogVHhUaW1lc3RhbXBLZXkpOiBTb3J0ZWRUeEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNNYXAuZ2V0KGtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBzb3J0ZWQgdHJhbnNhY3Rpb24gZW50cmllcy5cbiAgICovXG4gIGdldFNvcnRlZFR4cygpOiByZWFkb25seSBTb3J0ZWRUeEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgZ2V0IHR4Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHMubGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdGF0ZSBuZWVkcyBmdWxsIHJlY2FsY3VsYXRpb24uXG4gICAqL1xuICBuZWVkc0Z1bGxSZWNhbGN1bGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPT09IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlcyB0aGUgY2FjaGVkIHN0YXRlLCBmb3JjaW5nIGEgZnVsbCByZWNhbGN1bGF0aW9uIG9uIG5leHQgY2FsY3VsYXRlU3RhdGUoKS5cbiAgICogTm90ZTogY2FjaGVkU3RhdGUgaXMga2VwdCBzbyBjb21wdXRlUmVjb25jaWxlT3BzIGNhbiBkaWZmIG9sZCB2cyBuZXcgc3RhdGUuXG4gICAqL1xuICBpbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlLCBhbG9uZyB3aXRoIGEgbGF6eSBnZXR0ZXIgZm9yIG9wcyB0aGF0IGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAqXG4gICAqIC0gSWYgbGFzdEFwcGxpZWRJbmRleCBpcyBudWxsOiBmdWxsIHJlY2FsY3VsYXRpb24gZnJvbSBjaGVja3BvaW50XG4gICAqIC0gSWYgbGFzdEFwcGxpZWRJbmRleCA+PSAtMTogaW5jcmVtZW50YWwgYXBwbHkgZnJvbSBsYXN0QXBwbGllZEluZGV4ICsgMVxuICAgKi9cbiAgY2FsY3VsYXRlU3RhdGUoKTogeyBzdGF0ZTogSlNPTk9iamVjdDsgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSB9IHtcbiAgICBjb25zdCBiYXNlU3RhdGU6IEpTT05PYmplY3QgPSB0aGlzLmJhc2VDaGVja3BvaW50Py5zdGF0ZSA/PyB7fVxuICAgIGNvbnN0IHdhdGVybWFya3MgPSB0aGlzLmJhc2VDaGVja3BvaW50Py53YXRlcm1hcmtzID8/IHt9XG4gICAgY29uc3QgaGFzV2F0ZXJtYXJrcyA9IE9iamVjdC5rZXlzKHdhdGVybWFya3MpLmxlbmd0aCA+IDBcblxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggPT09IG51bGwpIHtcbiAgICAgIC8vIFNMT1cgUEFUSDogRnVsbCByZWNhbGN1bGF0aW9uXG4gICAgICByZXR1cm4gdGhpcy5mdWxsUmVjYWxjdWxhdGlvbihiYXNlU3RhdGUsIHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MpXG4gICAgfVxuXG4gICAgLy8gRkFTVCBQQVRIOiBJbmNyZW1lbnRhbCBhcHBseVxuICAgIHJldHVybiB0aGlzLmluY3JlbWVudGFsQXBwbHkod2F0ZXJtYXJrcywgaGFzV2F0ZXJtYXJrcylcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIHJlY2FsY3VsYXRpb24gb2Ygc3RhdGUgZnJvbSB0aGUgYmFzZSBjaGVja3BvaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBmdWxsUmVjYWxjdWxhdGlvbihcbiAgICBiYXNlU3RhdGU6IEpTT05PYmplY3QsXG4gICAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyxcbiAgICBoYXNXYXRlcm1hcmtzOiBib29sZWFuXG4gICk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgY29uc3Qgb2xkU3RhdGUgPSB0aGlzLmNhY2hlZFN0YXRlID8/IHt9XG5cbiAgICAvLyBSZXNldCB0cmFja2luZyBmb3IgZnVsbCByZWNvbXB1dGVcbiAgICB0aGlzLmFwcGxpZWRUeEtleXMuY2xlYXIoKVxuICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IC0xXG4gICAgdGhpcy5jYWNoZWRTdGF0ZSA9IGJhc2VTdGF0ZVxuXG4gICAgLy8gRGVsZWdhdGUgdG8gaW5jcmVtZW50YWwgYXBwbHkgdG8gcmVwbGF5IGFsbCB0cmFuc2FjdGlvbnNcbiAgICAvLyBXZSBpZ25vcmUgdGhlIHJldHVybmVkIG9wcyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZSBvcGVyYXRpb25zIGFwcGxpZWQgZnJvbSB0aGUgYmFzZSBzdGF0ZSxcbiAgICAvLyB3aGVyZWFzIHdlIHdhbnQgdGhlIGRpZmYgZnJvbSB0aGUgKnByZXZpb3VzIGNhY2hlZCBzdGF0ZSouXG4gICAgLy8gV2UgcGFzcyByZXR1cm5PcHM9ZmFsc2UgdG8gYXZvaWQgY29sbGVjdGluZyBvcHMgZHVyaW5nIHJlcGxheS5cbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLmluY3JlbWVudGFsQXBwbHkod2F0ZXJtYXJrcywgaGFzV2F0ZXJtYXJrcywgZmFsc2UpXG5cbiAgICAvLyBMYXp5IGxvYWQgdGhlIHJlY29uY2lsaWF0aW9uIG9wcyAoZXhwZW5zaXZlIGRpZmYpXG4gICAgY29uc3QgZ2V0QXBwbGllZE9wcyA9IGxhenkoKCkgPT4gY29tcHV0ZVJlY29uY2lsZU9wcyhvbGRTdGF0ZSwgc3RhdGUpKVxuXG4gICAgcmV0dXJuIHsgc3RhdGUsIGdldEFwcGxpZWRPcHMgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudGFsIGFwcGx5IG9mIHRyYW5zYWN0aW9ucyBmcm9tIGxhc3RBcHBsaWVkSW5kZXggKyAxLlxuICAgKiBAcGFyYW0gcmV0dXJuT3BzIElmIHRydWUsIGNvbGxlY3RzIGFwcGxpZWQgdHJhbnNhY3Rpb25zICh0byBsYXp5IGNvbXB1dGUgb3BzKS4gSWYgZmFsc2UsIHNraXBzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGluY3JlbWVudGFsQXBwbHkoXG4gICAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyxcbiAgICBoYXNXYXRlcm1hcmtzOiBib29sZWFuLFxuICAgIHJldHVybk9wcyA9IHRydWVcbiAgKTogeyBzdGF0ZTogSlNPTk9iamVjdDsgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSB9IHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhY2hlZFN0YXRlIGFzIEpTT05PYmplY3RcbiAgICBjb25zdCBhcHBsaWVkVHhzOiBUeFJlY29yZFtdID0gW11cbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmxhc3RBcHBsaWVkSW5kZXghICsgMVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBzb3J0ZWRUeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc29ydGVkVHhzW2ldXG4gICAgICBjb25zdCBkZWR1cEtleSA9IGVudHJ5LmRlZHVwVHhUaW1lc3RhbXBLZXlcblxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGFwcGxpZWQgKGRlZHVwbGljYXRpb24pXG4gICAgICBpZiAodGhpcy5hcHBsaWVkVHhLZXlzLmhhcyhkZWR1cEtleSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBpbiBjaGVja3BvaW50XG4gICAgICBpZiAoaGFzV2F0ZXJtYXJrcykge1xuICAgICAgICBjb25zdCBkZWR1cFRzID0gZW50cnkuZGVkdXBUeFRpbWVzdGFtcFxuICAgICAgICBpZiAoaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludChkZWR1cFRzLCB3YXRlcm1hcmtzKSkge1xuICAgICAgICAgIHRoaXMuYXBwbGllZFR4S2V5cy5hZGQoZGVkdXBLZXkpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0eCA9IGVudHJ5LnR4UmVjb3JkXG5cbiAgICAgIC8vIEFwcGx5IHRyYW5zYWN0aW9uIDEtYnktMSB0byBhdm9pZCBkcmFmdCBjb250ZXh0IHBvbGx1dGlvbiBvbiB2YWxpZGF0aW9uIGZhaWx1cmVcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXBwbHlUeEltbXV0YWJsZShzdGF0ZSwgdHgsIHRoaXMudmFsaWRhdGVGbilcblxuICAgICAgaWYgKG5ld1N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlXG4gICAgICAgIGlmIChyZXR1cm5PcHMpIHtcbiAgICAgICAgICBhcHBsaWVkVHhzLnB1c2godHgpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBsaWVkVHhLZXlzLmFkZChkZWR1cEtleSlcbiAgICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IGlcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFzdEFwcGxpZWRJbmRleCB0byBlbmQgZXZlbiBpZiBhbGwgdHhzIHdlcmUgc2tpcHBlZFxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCByZS1wcm9jZXNzIHNraXBwZWQgdHhzIG9uIG5leHQgaW5jcmVtZW50YWwgYXBwbHlcbiAgICBpZiAoc29ydGVkVHhzLmxlbmd0aCA+IDAgJiYgdGhpcy5sYXN0QXBwbGllZEluZGV4ISA8IHNvcnRlZFR4cy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBzb3J0ZWRUeHMubGVuZ3RoIC0gMVxuICAgIH1cblxuICAgIHRoaXMuY2FjaGVkU3RhdGUgPSBzdGF0ZVxuXG4gICAgLy8gTGF6eSBnZXR0ZXIgZm9yIG9wcyAoZmxhdHRlbnMgYXBwbGllZCB0eHMpXG4gICAgY29uc3QgZ2V0QXBwbGllZE9wcyA9IGxhenkoKCkgPT4ge1xuICAgICAgY29uc3Qgb3BzOiBPcFtdID0gW11cbiAgICAgIGZvciAoY29uc3QgdHggb2YgYXBwbGllZFR4cykge1xuICAgICAgICBvcHMucHVzaCguLi50eC5vcHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3BzXG4gICAgfSlcblxuICAgIHJldHVybiB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtYXggc2VlbiBjbG9jayAoZm9yIExhbXBvcnQgY2xvY2sgdXBkYXRlcykuXG4gICAqL1xuICBnZXRNYXhTZWVuQ2xvY2soKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhTZWVuQ2xvY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGNhY2hlZCBzdGF0ZSB3aXRob3V0IHJlY2FsY3VsYXRpbmcuXG4gICAqIFJldHVybnMgbnVsbCBpZiBzdGF0ZSBoYXMgbmV2ZXIgYmVlbiBjYWxjdWxhdGVkLlxuICAgKi9cbiAgZ2V0Q2FjaGVkU3RhdGUoKTogSlNPTk9iamVjdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNhY2hlZFN0YXRlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBhcHBsaWVkIHRpbWVzdGFtcC5cbiAgICovXG4gIGdldExhc3RBcHBsaWVkVHMoKTogVHhUaW1lc3RhbXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsIHx8IHRoaXMubGFzdEFwcGxpZWRJbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c1t0aGlzLmxhc3RBcHBsaWVkSW5kZXhdPy50eFRpbWVzdGFtcCA/PyBudWxsXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBhcHBsaWVkIGluZGV4IChmb3IgZGVidWdnaW5nL3RyYWNraW5nKS5cbiAgICovXG4gIGdldExhc3RBcHBsaWVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEFwcGxpZWRJbmRleFxuICB9XG59XG4iLCJpbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5pbXBvcnQgeyBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBTdGF0ZUNhbGN1bGF0b3IgfSBmcm9tIFwiLi9TdGF0ZUNhbGN1bGF0b3JcIlxuXG4vKipcbiAqIENsaWVudC1zaWRlIHN0YXRlIGluY2x1ZGluZyBjbG9ja3MgYW5kIGNhbGN1bGF0b3IgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRTdGF0ZSB7XG4gIC8vIExhbXBvcnQgY2xvY2tzIChtb25vdG9uaWMsIG5ldmVyIHJlc2V0KVxuICBsb2NhbENsb2NrOiBudW1iZXJcblxuICAvLyBDYWNoZWQgZmluYWxpemVkIGVwb2NoIChudWxsID0gbm90IHlldCBpbml0aWFsaXplZCwgcmVjYWxjdWxhdGVkIG9ubHkgd2hlbiBjaGVja3BvaW50IG1hcCBjaGFuZ2VzKVxuICBjYWNoZWRGaW5hbGl6ZWRFcG9jaDogbnVtYmVyIHwgbnVsbFxuXG4gIC8vIFN0YXRlIGNhbGN1bGF0b3IgKG1hbmFnZXMgc29ydGVkIHR4IGNhY2hlLCBzdGF0ZSBjYWxjdWxhdGlvbiwgYW5kIGludmFsaWRhdGlvbilcbiAgc3RhdGVDYWxjdWxhdG9yOiBTdGF0ZUNhbGN1bGF0b3JcblxuICAvKipcbiAgICogVGltZXN0YW1wIHJldGVudGlvbiB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlclxufVxuXG4vKipcbiAqIEZhY3RvcnkgdG8gY3JlYXRlIGFuIGluaXRpYWwgQ2xpZW50U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudFN0YXRlKFxuICB2YWxpZGF0ZUZuOiBWYWxpZGF0ZUZuPEpTT05PYmplY3Q+IHwgdW5kZWZpbmVkLFxuICByZXRlbnRpb25XaW5kb3dNczogbnVtYmVyXG4pOiBDbGllbnRTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxDbG9jazogMCxcbiAgICBjYWNoZWRGaW5hbGl6ZWRFcG9jaDogbnVsbCwgLy8gV2lsbCBiZSByZWNhbGN1bGF0ZWQgb24gZmlyc3QgcnVuXG4gICAgc3RhdGVDYWxjdWxhdG9yOiBuZXcgU3RhdGVDYWxjdWxhdG9yKHZhbGlkYXRlRm4pLFxuICAgIHJldGVudGlvbldpbmRvd01zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgdHlwZSBDaGVja3BvaW50UmVjb3JkLCBwcnVuZUNoZWNrcG9pbnRzIH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50IH0gZnJvbSBcIi4vY2hlY2twb2ludFV0aWxzXCJcbmltcG9ydCB7IENsaWVudFN0YXRlIH0gZnJvbSBcIi4vY2xpZW50U3RhdGVcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQgfSBmcm9tIFwiLi9TdGF0ZUNhbGN1bGF0b3JcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5LCB0eFRpbWVzdGFtcFRvS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIENoYW5nZXMgdG8gdHJhbnNhY3Rpb24ga2V5cyBmcm9tIGEgWS5ZTWFwRXZlbnQuXG4gKiAtIGFkZGVkOiBrZXlzIHRoYXQgd2VyZSBhZGRlZFxuICogLSBkZWxldGVkOiBrZXlzIHRoYXQgd2VyZSBkZWxldGVkXG4gKi9cbmV4cG9ydCB0eXBlIFR4S2V5Q2hhbmdlcyA9IHtcbiAgYWRkZWQ6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W11cbiAgZGVsZXRlZDogcmVhZG9ubHkgVHhUaW1lc3RhbXBLZXlbXVxufVxuXG4vKipcbiAqIEFwcGVuZHMgYSBuZXcgdHJhbnNhY3Rpb24gdG8gdGhlIGxvZy5cbiAqXG4gKiBAcGFyYW0gb3JpZ2luYWxLZXkgLSBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGtleSBmb3IgcmUtZW1pdHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICBVc2VkIGJ5IHN5bmNMb2cgdG8gcHJlc2VydmUgdHJhbnNhY3Rpb25zIG1pc3NlZCBieSBjaGVja3BvaW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFR4KFxuICBvcHM6IHJlYWRvbmx5IE9wW10sXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICBhY3RpdmVFcG9jaDogbnVtYmVyLFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgb3JpZ2luYWxLZXk/OiBUeFRpbWVzdGFtcEtleVxuKTogVHhUaW1lc3RhbXBLZXkge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG5cbiAgLy8gMS4gQWR2YW5jZSBsb2dpY2FsIGNsb2NrIChMYW1wb3J0KSBiYXNlZCBvbiBhbGwgc2VlbiB0cmFmZmljXG4gIGNvbnN0IGNsb2NrID0gTWF0aC5tYXgoY2xpZW50U3RhdGUubG9jYWxDbG9jaywgY2FsYy5nZXRNYXhTZWVuQ2xvY2soKSkgKyAxXG4gIGNsaWVudFN0YXRlLmxvY2FsQ2xvY2sgPSBjbG9ja1xuXG4gIC8vIDIuIEdlbmVyYXRlIEtleSB3aXRoIFdhbGxDbG9jayBmb3IgZnV0dXJlIHBydW5pbmcgc2FmZXR5XG4gIGNvbnN0IHRzOiBUeFRpbWVzdGFtcCA9IHtcbiAgICBlcG9jaDogYWN0aXZlRXBvY2gsXG4gICAgY2xvY2ssXG4gICAgY2xpZW50SWQ6IG15Q2xpZW50SWQsXG4gICAgd2FsbENsb2NrOiBEYXRlLm5vdygpLFxuICB9XG4gIGNvbnN0IGtleSA9IHR4VGltZXN0YW1wVG9LZXkodHMpXG5cbiAgLy8gMy4gV3JpdGUgdG8gWWpzIChBdG9taWMpXG4gIGNvbnN0IHJlY29yZDogVHhSZWNvcmQgPSB7IG9wcywgb3JpZ2luYWxUeEtleTogb3JpZ2luYWxLZXkgfVxuICB5VHguc2V0KGtleSwgcmVjb3JkKVxuXG4gIHJldHVybiBrZXlcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIHRyYW5zYWN0aW9uIGxvZyB3aXRoIHRoZSBjdXJyZW50IGNoZWNrcG9pbnQuXG4gKiBSZS1lbWl0cyBtaXNzZWQgdHJhbnNhY3Rpb25zIGFuZCBwcnVuZXMgb2xkIG9uZXMuXG4gKlxuICogU2hvdWxkIGJlIGNhbGxlZCBCRUZPUkUgdXBkYXRlU3RhdGUgdG8gZW5zdXJlIGxvZyBpcyBjbGVhbiBhbmQgY29tcGxldGUuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgdHJhbnNhY3Rpb25zIHdlcmUgcmUtZW1pdHRlZCBvciBkZWxldGVkLCB3aGljaCBtYXkgaW52YWxpZGF0ZSBsYXN0QXBwbGllZEluZGV4XG4gKi9cbmZ1bmN0aW9uIHN5bmNMb2coXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgZmluYWxpemVkRXBvY2g6IG51bWJlcixcbiAgYmFzZUNQOiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCxcbiAgbmV3S2V5cz86IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W10gLy8ga2V5cyBhZGRlZCBpbiB0aGlzIHVwZGF0ZVxuKTogdm9pZCB7XG4gIGNvbnN0IGNhbGMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3JcbiAgY29uc3QgYWN0aXZlRXBvY2ggPSBmaW5hbGl6ZWRFcG9jaCArIDFcbiAgY29uc3Qgd2F0ZXJtYXJrcyA9IGJhc2VDUD8ud2F0ZXJtYXJrcyA/PyB7fVxuXG4gIC8vIERldGVybWluaXN0aWMgUmVmZXJlbmNlIFRpbWU6IFVzZSBzdG9yZWQgbWluV2FsbENsb2NrIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIDAgKG5vdGhpbmcgYW5jaWVudCkuXG4gIGNvbnN0IHJlZmVyZW5jZVRpbWUgPSBiYXNlQ1A/Lm1pbldhbGxDbG9jayA/PyAwXG5cbiAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBydW5lZFxuICBjb25zdCBzaG91bGRQcnVuZSA9ICh0czogVHhUaW1lc3RhbXAsIGRlZHVwVHM6IFR4VGltZXN0YW1wKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgaXNBbmNpZW50ID0gcmVmZXJlbmNlVGltZSAtIHRzLndhbGxDbG9jayA+IGNsaWVudFN0YXRlLnJldGVudGlvbldpbmRvd01zXG4gICAgaWYgKGlzQW5jaWVudCkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludChkZWR1cFRzLCB3YXRlcm1hcmtzKVxuICB9XG5cbiAgY29uc3QgdG9EZWxldGU6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICBjb25zdCB0b1JlRW1pdDogQXJyYXk8eyBvcmlnaW5hbEtleTogVHhUaW1lc3RhbXBLZXk7IHR4OiBUeFJlY29yZCB9PiA9IFtdXG5cbiAgLy8gMS4gSGVscGVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggZWFjaCB0cmFuc2FjdGlvblxuICBjb25zdCBwcm9jZXNzRW50cnkgPSAoZW50cnk6IFNvcnRlZFR4RW50cnkpOiBib29sZWFuID0+IHtcbiAgICBpZiAoc2hvdWxkUHJ1bmUoZW50cnkudHhUaW1lc3RhbXAsIGVudHJ5LmRlZHVwVHhUaW1lc3RhbXApKSB7XG4gICAgICB0b0RlbGV0ZS5wdXNoKGVudHJ5LnR4VGltZXN0YW1wS2V5KVxuICAgICAgcmV0dXJuIGZhbHNlIC8vIGRlbGV0ZWRcbiAgICB9XG5cbiAgICBpZiAoZW50cnkudHhUaW1lc3RhbXAuZXBvY2ggPD0gZmluYWxpemVkRXBvY2gpIHtcbiAgICAgIC8vIE5vdCBpbiBjaGVja3BvaW50IGFuZCBzdGlsbCBmcmVzaCAtIHJlLWVtaXQgaXQgdG8gdGhlIGFjdGl2ZSBlcG9jaFxuICAgICAgdG9SZUVtaXQucHVzaCh7IG9yaWdpbmFsS2V5OiBlbnRyeS5kZWR1cFR4VGltZXN0YW1wS2V5LCB0eDogZW50cnkudHhSZWNvcmQgfSlcbiAgICAgIHRvRGVsZXRlLnB1c2goZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gICAgICByZXR1cm4gZmFsc2UgLy8gcmUtZW1pdHRlZFxuICAgIH1cblxuICAgIHJldHVybiB0cnVlIC8vIGFjdGl2ZS9mcmVzaFxuICB9XG5cbiAgLy8gMi4gU2NhbiBsb2NhbCBjYWNoZSAoc29ydGVkVHhzKSB0byBpZGVudGlmeSBtaXNzaW5nL2FuY2llbnQgdHJhbnNhY3Rpb25zXG4gIGZvciAoY29uc3QgZW50cnkgb2YgY2FsYy5nZXRTb3J0ZWRUeHMoKSkge1xuICAgIGlmIChwcm9jZXNzRW50cnkoZW50cnkpKSB7XG4gICAgICAvLyBPcHRpbWl6YXRpb246IFBoeXNpY2FsIGtleXMgYXJlIHNvcnRlZC4gSWYgd2UgaGl0IHRoZSBhY3RpdmUvZnJlc2ggdGVycml0b3J5LCB3ZSBjYW4gc3RvcC5cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvY2Vzc0tleUJ5VGltZXN0YW1wS2V5ID0gKHR4VGltZXN0YW1wS2V5OiBUeFRpbWVzdGFtcEtleSk6IHZvaWQgPT4ge1xuICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBpdCBhY3R1YWxseSBleGlzdHMgaW4gWWpzIE1hcFxuICAgIGlmICh5VHguaGFzKHR4VGltZXN0YW1wS2V5KSkge1xuICAgICAgcHJvY2Vzc0VudHJ5KG5ldyBTb3J0ZWRUeEVudHJ5KHR4VGltZXN0YW1wS2V5LCB5VHgpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFNjYW4gTkVXIGtleXMgZnJvbSBZanMgdG8gaGFuZGxlIGluY29taW5nIHRyYW5zYWN0aW9ucyAoc3luYylcbiAgLy8gQW55IGNsaWVudCBjYW4gcmUtZW1pdCAtIGRlZHVwbGljYXRpb24gdmlhIG9yaWdpbmFsVHhLZXkgaGFuZGxlcyBkdXBsaWNhdGVzLlxuICBpZiAobmV3S2V5cykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG5ld0tleXMpIHtcbiAgICAgIHByb2Nlc3NLZXlCeVRpbWVzdGFtcEtleShrZXkpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmUtZW1pdCBtaXNzZWQgdHJhbnNhY3Rpb25zIEJFRk9SRSBwcnVuaW5nXG4gIGZvciAoY29uc3QgeyBvcmlnaW5hbEtleSwgdHggfSBvZiB0b1JlRW1pdCkge1xuICAgIGNvbnN0IG5ld0tleSA9IGFwcGVuZFR4KHR4Lm9wcywgeVR4LCBhY3RpdmVFcG9jaCwgbXlDbGllbnRJZCwgY2xpZW50U3RhdGUsIG9yaWdpbmFsS2V5KVxuICAgIGNhbGMuaW5zZXJ0VHgobmV3S2V5LCB5VHgpXG4gIH1cblxuICAvLyA1LiBQcnVuZSBvbGQvZmluYWxpemVkL3JlZHVuZGFudCB0cmFuc2FjdGlvbnMgZnJvbSBZanMgTWFwXG4gIGZvciAoY29uc3Qga2V5IG9mIHRvRGVsZXRlKSB7XG4gICAgeVR4LmRlbGV0ZShrZXkpXG4gIH1cbiAgY2FsYy5yZW1vdmVUeHModG9EZWxldGUpXG59XG5cbi8qKlxuICogVGhlIHByaW1hcnkgdXBkYXRlIGZ1bmN0aW9uIHRoYXQgbWFpbnRhaW5zIGN1cnJlbnQgc3RhdGUuXG4gKlxuICogQHBhcmFtIHR4Q2hhbmdlcyAtIENoYW5nZXMgZnJvbSBZLllNYXBFdmVudC4gSWYgdW5kZWZpbmVkIChmaXJzdCBydW4pLCBwZXJmb3JtcyBhIGZ1bGwgc2Nhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKFxuICBkb2M6IFkuRG9jLFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+LFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgdHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgfCB1bmRlZmluZWRcbik6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gIGNvbnN0IGNhbGMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3JcblxuICAvLyBBbHdheXMgY2FsY3VsYXRlIGZyZXNoIGZpbmFsaXplZCBlcG9jaCBhbmQgY2hlY2twb2ludCB0byBoYW5kbGUgc3luYyByYWNlIGNvbmRpdGlvbnNcbiAgY29uc3QgeyBmaW5hbGl6ZWRFcG9jaCwgY2hlY2twb2ludDogYmFzZUNQIH0gPSBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQpXG5cbiAgLy8gVXBkYXRlIHJlYWQtY2FjaGVcbiAgY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggPSBmaW5hbGl6ZWRFcG9jaFxuXG4gIC8vIFNldCBiYXNlIGNoZWNrcG9pbnQgKHRoaXMgaGFuZGxlcyBpbnZhbGlkYXRpb24gaWYgY2hlY2twb2ludCBjaGFuZ2VkKVxuICBjYWxjLnNldEJhc2VDaGVja3BvaW50KGJhc2VDUClcblxuICAvLyBUcmFjayBpZiB3ZSBuZWVkIHRvIHJlYnVpbGQgc29ydGVkIGNhY2hlIChmaXJzdCBydW4gb3IgbWlzc2luZyBkZWx0YSlcbiAgLy8gT3B0aW1pemF0aW9uOiBXZSBkb24ndCBuZWVkIHRvIHJlYnVpbGQganVzdCBiZWNhdXNlIGNoZWNrcG9pbnQgY2hhbmdlZCxcbiAgLy8gYXMgbG9uZyBhcyB3ZSBoYXZlIHR4Q2hhbmdlcyB0byBrZWVwIGNhY2hlIGluIHN5bmMuXG4gIGNvbnN0IG5lZWRzUmVidWlsZFNvcnRlZENhY2hlID0gY2FsYy5nZXRDYWNoZWRTdGF0ZSgpID09PSBudWxsIHx8ICF0eENoYW5nZXNcblxuICAvLyBSZWJ1aWxkIHNvcnRlZCBjYWNoZSBiZWZvcmUgc3luY0xvZyBpZiBuZWVkZWRcbiAgaWYgKG5lZWRzUmVidWlsZFNvcnRlZENhY2hlKSB7XG4gICAgY2FsYy5yZWJ1aWxkRnJvbVlqcyh5VHgpXG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgbm90IHJlYnVpbGRpbmcsIGltbWVkaWF0ZWx5IHByb2Nlc3MgZGVsZXRpb25zIHRvIGF2b2lkIFwiZ2hvc3RcIiB0cmFuc2FjdGlvbnNcbiAgICAvLyBpbiBzeW5jTG9nIChlLmcuIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGEgdHJhbnNhY3Rpb24gdGhhdCB3YXMganVzdCBkZWxldGVkKS5cbiAgICBjYWxjLnJlbW92ZVR4cyh0eENoYW5nZXMuZGVsZXRlZClcbiAgfVxuXG4gIC8vIFN5bmMgYW5kIHBydW5lIHdpdGhpbiB0cmFuc2FjdGlvblxuICBkb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIHN5bmNMb2coeVR4LCBteUNsaWVudElkLCBjbGllbnRTdGF0ZSwgZmluYWxpemVkRXBvY2gsIGJhc2VDUCwgdHhDaGFuZ2VzPy5hZGRlZClcblxuICAgIC8vIFNhZmUgdG8gdXNlIGxvY2FsIGZpbmFsaXplZEVwb2NoIGhlcmVcbiAgICBwcnVuZUNoZWNrcG9pbnRzKHlDaGVja3BvaW50LCBmaW5hbGl6ZWRFcG9jaClcbiAgfSlcblxuICBpZiAobmVlZHNSZWJ1aWxkU29ydGVkQ2FjaGUpIHtcbiAgICAvLyBGdWxsIHJlY29tcHV0ZSAoY2FsY3VsYXRvciBoYW5kbGVzIHRoaXMpXG4gICAgcmV0dXJuIGNhbGMuY2FsY3VsYXRlU3RhdGUoKVxuICB9XG5cbiAgLy8gSW5jcmVtZW50YWwgdXBkYXRlIHVzaW5nIG9ubHkgY2hhbmdlZCBrZXlzIChjYWxjdWxhdG9yIGhhbmRsZXMgdGhpcylcbiAgLy8gdHhDaGFuZ2VzIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QgaGVyZSBzaW5jZSAhdHhDaGFuZ2VzIGltcGxpZXMgbmVlZHNSZWJ1aWxkU29ydGVkQ2FjaGVcblxuICAvLyBVcGRhdGUgc29ydGVkIGNhY2hlIHdpdGggbmV3IGtleXMgZnJvbSB0eENoYW5nZXNcbiAgLy8gVGhpcyBtdXN0IGhhcHBlbiBhZnRlciBzeW5jTG9nIHdoaWNoIG1heSBoYXZlIGRlbGV0ZWQgc29tZSBvZiB0aGVzZSBrZXlzXG4gIGZvciAoY29uc3Qga2V5IG9mIHR4Q2hhbmdlcy5hZGRlZCkge1xuICAgIC8vIENSSVRJQ0FMOiBDaGVjayB5VHguaGFzKGtleSkhIHN5bmNMb2cgbWlnaHQgaGF2ZSBqdXN0IHBydW5lZCBpdC5cbiAgICBpZiAoeVR4LmhhcyhrZXkpICYmICFjYWxjLmhhc1R4KGtleSkpIHtcbiAgICAgIGNhbGMuaW5zZXJ0VHgoa2V5LCB5VHgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbGMuY2FsY3VsYXRlU3RhdGUoKVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IENoZWNrcG9pbnRSZWNvcmQsIGNyZWF0ZUNoZWNrcG9pbnQgfSBmcm9tIFwiLi9jaGVja3BvaW50c1wiXG5pbXBvcnQgeyBjcmVhdGVDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5cbmltcG9ydCB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5cbmltcG9ydCB7IGNvbXB1dGVSZWNvbmNpbGVPcHMgfSBmcm9tIFwiLi9yZWNvbmNpbGVcIlxuaW1wb3J0IHsgU29ydGVkVHhFbnRyeSB9IGZyb20gXCIuL1NvcnRlZFR4RW50cnlcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBhcHBlbmRUeCwgVHhLZXlDaGFuZ2VzLCB1cGRhdGVTdGF0ZSB9IGZyb20gXCIuL3R4TG9nXCJcbmltcG9ydCB7IFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuaW1wb3J0IHsgZ2VuZXJhdGVJRCB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGNvbnN0IGdldFNvcnRlZFR4c1N5bWJvbCA9IFN5bWJvbChcImdldFNvcnRlZFR4c1wiKVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlU3luY0xvZ09wdGlvbnM8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBEb2N1bWVudCB0byBiaW5kIHRvLlxuICAgKi9cbiAgeURvYzogWS5Eb2NcblxuICAvKipcbiAgICogTmFtZSBmb3IgdGhlIHR4cyBZLk1hcC5cbiAgICogRGVmYXVsdDogXCJzdGF0ZS1zeW5jLWxvZy10eFwiXG4gICAqL1xuICB5VHhNYXBOYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE5hbWUgZm9yIHRoZSBjaGVja3BvaW50IFkuTWFwLlxuICAgKiBEZWZhdWx0OiBcInN0YXRlLXN5bmMtbG9nLWNoZWNrcG9pbnRcIlxuICAgKi9cbiAgeUNoZWNrcG9pbnRNYXBOYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsaWVudC5cbiAgICogSWYgb21pdHRlZCwgYSByYW5kb20gVVVJRCAobmFub2lkKSB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogTk9URTogSWYgeW91IG5lZWQgdG8gcmVzdW1lIGEgc2Vzc2lvbiAoa2VlcCBsb2NhbCBjbG9jay93YXRlcm1hcmspLCB5b3UgTVVTVCBwcm92aWRlIGEgc3RhYmxlIElELlxuICAgKiBNVVNUIE5PVCBjb250YWluIHNlbWljb2xvbnMuXG4gICAqL1xuICBjbGllbnRJZD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gdGFnIGZvciBZLmpzIHR4cyBjcmVhdGVkIGJ5IHRoaXMgbGlicmFyeS5cbiAgICovXG4gIHlqc09yaWdpbj86IHVua25vd25cblxuICAvKipcbiAgICogT3B0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cbiAgICogUnVucyBhZnRlciBlYWNoIHR4J3Mgb3BzIGFyZSBhcHBsaWVkLlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGUgdHggaXMgcmVqZWN0ZWQgKHN0YXRlIHJldmVydHMpLlxuICAgKiBNVVNUIGJlIGRldGVybWluaXN0aWMgYW5kIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBjbGllbnRzLlxuICAgKi9cbiAgdmFsaWRhdGU/OiAoc3RhdGU6IFN0YXRlKSA9PiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCByZXRlbnRpb24gd2luZG93IGluIG1pbGxpc2Vjb25kcy5cbiAgICogVHhzIG9sZGVyIHRoYW4gdGhpcyB3aW5kb3cgYXJlIGNvbnNpZGVyZWQgXCJBbmNpZW50XCIgYW5kIHBydW5lZC5cbiAgICpcbiAgICogRGVmYXVsdDogSW5maW5pdHkgKE5vIHBydW5pbmcpLlxuICAgKiBSZWNvbW1lbmRlZDogMTQgZGF5cyAoMTIwOTYwMDAwMCBtcykuXG4gICAqL1xuICByZXRlbnRpb25XaW5kb3dNczogbnVtYmVyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVTeW5jTG9nQ29udHJvbGxlcjxTdGF0ZSBleHRlbmRzIEpTT05PYmplY3Q+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBTdGF0ZVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHN0YXRlIGNoYW5nZXMuXG4gICAqL1xuICBzdWJzY3JpYmUoY2FsbGJhY2s6IChuZXdTdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHZvaWQpOiAoKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbmV3IHR4IChsaXN0IG9mIG9wZXJhdGlvbnMpIHRvIHRoZSBsb2cuXG4gICAqL1xuICBlbWl0KG9wczogT3BbXSk6IHZvaWRcblxuICAvKipcbiAgICogUmVjb25jaWxlcyB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIHRoZSB0YXJnZXQgc3RhdGUuXG4gICAqL1xuICByZWNvbmNpbGVTdGF0ZSh0YXJnZXRTdGF0ZTogU3RhdGUpOiB2b2lkXG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IHRyaWdnZXJzIGVwb2NoIGNvbXBhY3Rpb24gKENoZWNrcG9pbnRpbmcpLlxuICAgKi9cbiAgY29tcGFjdCgpOiB2b2lkXG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBvYnNlcnZlcnMgYW5kIHJlbGVhc2VzIG1lbW9yeS5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZFxuXG4gIC8vIC0tLSBPYnNlcnZhYmlsaXR5ICYgU3RhdHMgLS0tXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWN0aXZlIGVwb2NoIG51bWJlci5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoKCk6IG51bWJlclxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHhzIGN1cnJlbnRseSBpbiB0aGUgYWN0aXZlIGVwb2NoLlxuICAgKi9cbiAgZ2V0QWN0aXZlRXBvY2hUeENvdW50KCk6IG51bWJlclxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3YWxsQ2xvY2sgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0eCBpbiB0aGUgYWN0aXZlIGVwb2NoLlxuICAgKi9cbiAgZ2V0QWN0aXZlRXBvY2hTdGFydFRpbWUoKTogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9nIGlzIGNvbXBsZXRlbHkgZW1wdHkuXG4gICAqL1xuICBpc0xvZ0VtcHR5KCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogSW50ZXJuYWwvVGVzdGluZzogUmV0dXJucyBhbGwgdHhzIGN1cnJlbnRseSBpbiB0aGUgbG9nLCBzb3J0ZWQuXG4gICAqL1xuICBbZ2V0U29ydGVkVHhzU3ltYm9sXSgpOiByZWFkb25seSBTb3J0ZWRUeEVudHJ5W11cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU3RhdGVTeW5jTG9nIGNvbnRyb2xsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0ZVN5bmNMb2c8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgb3B0aW9uczogU3RhdGVTeW5jTG9nT3B0aW9uczxTdGF0ZT5cbik6IFN0YXRlU3luY0xvZ0NvbnRyb2xsZXI8U3RhdGU+IHtcbiAgY29uc3Qge1xuICAgIHlEb2MsXG4gICAgeVR4TWFwTmFtZSA9IFwic3RhdGUtc3luYy1sb2ctdHhcIixcbiAgICB5Q2hlY2twb2ludE1hcE5hbWUgPSBcInN0YXRlLXN5bmMtbG9nLWNoZWNrcG9pbnRcIixcbiAgICBjbGllbnRJZCA9IGdlbmVyYXRlSUQoKSxcbiAgICB5anNPcmlnaW4sXG4gICAgdmFsaWRhdGUsXG4gICAgcmV0ZW50aW9uV2luZG93TXMsXG4gIH0gPSBvcHRpb25zXG5cbiAgaWYgKGNsaWVudElkLmluY2x1ZGVzKFwiO1wiKSkge1xuICAgIGZhaWx1cmUoYGNsaWVudElkIE1VU1QgTk9UIGNvbnRhaW4gc2VtaWNvbG9uczogJHtjbGllbnRJZH1gKVxuICB9XG5cbiAgY29uc3QgeVR4ID0geURvYy5nZXRNYXA8VHhSZWNvcmQ+KHlUeE1hcE5hbWUpXG4gIGNvbnN0IHlDaGVja3BvaW50ID0geURvYy5nZXRNYXA8Q2hlY2twb2ludFJlY29yZD4oeUNoZWNrcG9pbnRNYXBOYW1lKVxuXG4gIC8vIENhc3QgdmFsaWRhdGUgdG8gYmFzaWMgdHlwZSB0byBtYXRjaCBpbnRlcm5hbCBDbGllbnRTdGF0ZVxuICBjb25zdCBjbGllbnRTdGF0ZSA9IGNyZWF0ZUNsaWVudFN0YXRlKFxuICAgIHZhbGlkYXRlIGFzIHVua25vd24gYXMgVmFsaWRhdGVGbjxKU09OT2JqZWN0PixcbiAgICByZXRlbnRpb25XaW5kb3dNcyA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgKVxuXG4gIC8vIExpc3RlbmVyc1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KHN0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4gdm9pZD4oKVxuXG4gIGNvbnN0IG5vdGlmeVN1YnNjcmliZXJzID0gKHN0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIHN1YnNjcmliZXJzKSB7XG4gICAgICBzdWIoc3RhdGUsIGdldEFwcGxpZWRPcHMpXG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIHRvIGV4dHJhY3Qga2V5IGNoYW5nZXMgZnJvbSBZTWFwRXZlbnRcbiAgY29uc3QgZXh0cmFjdFR4Q2hhbmdlcyA9IChldmVudDogWS5ZTWFwRXZlbnQ8VHhSZWNvcmQ+KTogVHhLZXlDaGFuZ2VzID0+IHtcbiAgICBjb25zdCBhZGRlZDogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG4gICAgY29uc3QgZGVsZXRlZDogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoYW5nZV0gb2YgZXZlbnQuY2hhbmdlcy5rZXlzKSB7XG4gICAgICBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJhZGRcIikge1xuICAgICAgICBhZGRlZC5wdXNoKGtleSlcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJkZWxldGVcIikge1xuICAgICAgICBkZWxldGVkLnB1c2goa2V5KVxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuYWN0aW9uID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIGRlbGV0ZWQucHVzaChrZXkpXG4gICAgICAgIGFkZGVkLnB1c2goa2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGFkZGVkLCBkZWxldGVkIH1cbiAgfVxuXG4gIC8vIEVtcHR5IHR4Q2hhbmdlcyBvYmplY3QgZm9yIGNoZWNrcG9pbnQgb2JzZXJ2ZXIgKG5vIHR4IGtleXMgY2hhbmdlZClcbiAgY29uc3QgZW1wdHlUeENoYW5nZXM6IFR4S2V5Q2hhbmdlcyA9IHsgYWRkZWQ6IFtdLCBkZWxldGVkOiBbXSB9XG5cbiAgLy8gVXBkYXRlIExvZ2ljIHdpdGggaW5jcmVtZW50YWwgY2hhbmdlc1xuICBjb25zdCBydW5VcGRhdGUgPSAodHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgfCB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH0gPSB1cGRhdGVTdGF0ZShcbiAgICAgIHlEb2MsXG4gICAgICB5VHgsXG4gICAgICB5Q2hlY2twb2ludCxcbiAgICAgIGNsaWVudElkLFxuICAgICAgY2xpZW50U3RhdGUsXG4gICAgICB0eENoYW5nZXNcbiAgICApXG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoc3RhdGUgYXMgU3RhdGUsIGdldEFwcGxpZWRPcHMpXG4gIH1cblxuICAvLyBUeCBvYnNlcnZlclxuICBjb25zdCB0eE9ic2VydmVyID0gKGV2ZW50OiBZLllNYXBFdmVudDxUeFJlY29yZD4sIF90cmFuc2FjdGlvbjogWS5UcmFuc2FjdGlvbikgPT4ge1xuICAgIGNvbnN0IHR4Q2hhbmdlcyA9IGV4dHJhY3RUeENoYW5nZXMoZXZlbnQpXG4gICAgcnVuVXBkYXRlKHR4Q2hhbmdlcylcbiAgfVxuXG4gIC8vIENoZWNrcG9pbnQgb2JzZXJ2ZXJcbiAgY29uc3QgY2hlY2twb2ludE9ic2VydmVyID0gKFxuICAgIF9ldmVudDogWS5ZTWFwRXZlbnQ8Q2hlY2twb2ludFJlY29yZD4sXG4gICAgX3RyYW5zYWN0aW9uOiBZLlRyYW5zYWN0aW9uXG4gICkgPT4ge1xuICAgIHJ1blVwZGF0ZShlbXB0eVR4Q2hhbmdlcylcbiAgfVxuXG4gIHlDaGVja3BvaW50Lm9ic2VydmUoY2hlY2twb2ludE9ic2VydmVyKVxuICB5VHgub2JzZXJ2ZSh0eE9ic2VydmVyKVxuXG4gIC8vIEluaXRpYWwgcnVuIChmdWxsIHJlY29tcHV0ZSwgdHJlYXQgYXMgY2hlY2twb2ludCBjaGFuZ2UgdG8gaW5pdGlhbGl6ZSBlcG9jaCBjYWNoZSlcbiAgcnVuVXBkYXRlKHVuZGVmaW5lZClcblxuICAvLyBUcmFjayBkaXNwb3NhbCBzdGF0ZVxuICBsZXQgZGlzcG9zZWQgPSBmYWxzZVxuXG4gIGNvbnN0IGFzc2VydE5vdERpc3Bvc2VkID0gKCkgPT4ge1xuICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgZmFpbHVyZShcIlN0YXRlU3luY0xvZyBoYXMgYmVlbiBkaXNwb3NlZCBhbmQgY2Fubm90IGJlIHVzZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRBY3RpdmVFcG9jaEludGVybmFsID0gKCkgPT4ge1xuICAgIGlmIChjbGllbnRTdGF0ZS5jYWNoZWRGaW5hbGl6ZWRFcG9jaCA9PT0gbnVsbCkge1xuICAgICAgZmFpbHVyZShcImNhY2hlZEZpbmFsaXplZEVwb2NoIGlzIG51bGwgLSB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGFmdGVyIGluaXRpYWxpemF0aW9uXCIpXG4gICAgfVxuICAgIHJldHVybiBjbGllbnRTdGF0ZS5jYWNoZWRGaW5hbGl6ZWRFcG9jaCArIDFcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0U3RhdGUoKTogU3RhdGUge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIChjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0Q2FjaGVkU3RhdGUoKSA/PyB7fSkgYXMgU3RhdGVcbiAgICB9LFxuXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiAobmV3U3RhdGU6IFN0YXRlLCBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBzdWJzY3JpYmVycy5hZGQoY2FsbGJhY2spXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoY2FsbGJhY2spXG4gICAgICB9XG4gICAgfSxcblxuICAgIGVtaXQob3BzOiBPcFtdKTogdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICB5RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlRXBvY2ggPSBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICAgICAgYXBwZW5kVHgob3BzLCB5VHgsIGFjdGl2ZUVwb2NoLCBjbGllbnRJZCwgY2xpZW50U3RhdGUpXG4gICAgICB9LCB5anNPcmlnaW4pXG4gICAgfSxcblxuICAgIHJlY29uY2lsZVN0YXRlKHRhcmdldFN0YXRlOiBTdGF0ZSk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gKGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRDYWNoZWRTdGF0ZSgpID8/IHt9KSBhcyBTdGF0ZVxuICAgICAgY29uc3Qgb3BzID0gY29tcHV0ZVJlY29uY2lsZU9wcyhjdXJyZW50U3RhdGUsIHRhcmdldFN0YXRlKVxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZW1pdChvcHMpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBhY3QoKTogdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICB5RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlRXBvY2ggPSBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldENhY2hlZFN0YXRlKCkgPz8ge31cbiAgICAgICAgY3JlYXRlQ2hlY2twb2ludCh5VHgsIHlDaGVja3BvaW50LCBjbGllbnRTdGF0ZSwgYWN0aXZlRXBvY2gsIGN1cnJlbnRTdGF0ZSwgY2xpZW50SWQpXG4gICAgICB9LCB5anNPcmlnaW4pXG4gICAgfSxcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICBpZiAoZGlzcG9zZWQpIHJldHVybiAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBuby1vcFxuICAgICAgZGlzcG9zZWQgPSB0cnVlXG4gICAgICB5VHgudW5vYnNlcnZlKHR4T2JzZXJ2ZXIpXG4gICAgICB5Q2hlY2twb2ludC51bm9ic2VydmUoY2hlY2twb2ludE9ic2VydmVyKVxuICAgICAgc3Vic2NyaWJlcnMuY2xlYXIoKVxuICAgIH0sXG5cbiAgICBnZXRBY3RpdmVFcG9jaCgpOiBudW1iZXIge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgIH0sXG5cbiAgICBnZXRBY3RpdmVFcG9jaFR4Q291bnQoKTogbnVtYmVyIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICBsZXQgY291bnQgPSAwXG4gICAgICAvLyBPbmx5IGN1cnJlbnQgb3IgZnV0dXJlIGVwb2NocyBleGlzdCBpbiBzb3J0ZWRUeHMgKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQgZHVyaW5nIHVwZGF0ZVN0YXRlKS5cbiAgICAgIC8vIEZ1dHVyZSBlcG9jaHMgYXBwZWFyIGlmIHdlIHJlY2VpdmUgdHhzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBjaGVja3BvaW50LlxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKCkpIHtcbiAgICAgICAgY29uc3QgdHMgPSBlbnRyeS50eFRpbWVzdGFtcFxuICAgICAgICBpZiAodHMuZXBvY2ggPT09IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgY291bnQrK1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmVwb2NoID4gYWN0aXZlRXBvY2gpIHtcbiAgICAgICAgICBicmVhayAvLyBPcHRpbWl6YXRpb246IHNvcnRlZCBvcmRlciBtZWFucyB3ZSBjYW4gc3RvcCBlYXJseVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY291bnRcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2hTdGFydFRpbWUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAvLyBPbmx5IGN1cnJlbnQgb3IgZnV0dXJlIGVwb2NocyBleGlzdCBpbiBzb3J0ZWRUeHMgKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQgZHVyaW5nIHVwZGF0ZVN0YXRlKS5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpKSB7XG4gICAgICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKHRzLmVwb2NoID09PSBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIHJldHVybiB0cy53YWxsQ2xvY2tcbiAgICAgICAgfSBlbHNlIGlmICh0cy5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgYnJlYWsgLy8gT3B0aW1pemF0aW9uOiBzb3J0ZWQgb3JkZXIgbWVhbnMgd2UgY2FuIHN0b3AgZWFybHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBpc0xvZ0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIHlUeC5zaXplID09PSAwICYmIHlDaGVja3BvaW50LnNpemUgPT09IDBcbiAgICB9LFxuXG4gICAgW2dldFNvcnRlZFR4c1N5bWJvbF0oKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKClcbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxyXG5pbXBvcnQgeyBKU09OT2JqZWN0LCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi9qc29uXCJcclxuaW1wb3J0IHsgZGVlcENsb25lLCBkZWVwRXF1YWwsIGlzT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIFN1cHBvcnRlZCBvcGVyYXRpb25zLlxyXG4gKiBBcHBsaWVkIHNlcXVlbnRpYWxseSB3aXRoaW4gYSB0eC5cclxuICovXHJcbmV4cG9ydCB0eXBlIE9wID1cclxuICB8IHsga2luZDogXCJzZXRcIjsgcGF0aDogUGF0aDsga2V5OiBzdHJpbmc7IHZhbHVlOiBKU09OVmFsdWUgfVxyXG4gIHwgeyBraW5kOiBcImRlbGV0ZVwiOyBwYXRoOiBQYXRoOyBrZXk6IHN0cmluZyB9XHJcbiAgfCB7IGtpbmQ6IFwic3BsaWNlXCI7IHBhdGg6IFBhdGg7IGluZGV4OiBudW1iZXI7IGRlbGV0ZUNvdW50OiBudW1iZXI7IGluc2VydHM6IEpTT05WYWx1ZVtdIH1cclxuICB8IHsga2luZDogXCJhZGRUb1NldFwiOyBwYXRoOiBQYXRoOyB2YWx1ZTogSlNPTlZhbHVlIH1cclxuICB8IHsga2luZDogXCJkZWxldGVGcm9tU2V0XCI7IHBhdGg6IFBhdGg7IHZhbHVlOiBKU09OVmFsdWUgfVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gdHlwZS5cclxuICpcclxuICogUnVsZXM6XHJcbiAqIC0gVmFsaWRhdGlvbiBNVVNUIGRlcGVuZCBvbmx5IG9uIGNhbmRpZGF0ZVN0YXRlIChhbmQgZGV0ZXJtaW5pc3RpYyBjb2RlKS5cclxuICogLSBWYWxpZGF0aW9uIHJ1bnMgb25jZSBwZXIgdHgsIGFmdGVyIGFsbCBvcHMgYXBwbHkuXHJcbiAqIC0gSWYgdmFsaWRhdGlvbiBmYWlscywgdGhlIHggaXMgcmVqZWN0ZWQgKHN0YXRlIHJldmVydHMgdG8gcHJldmlvdXMpLlxyXG4gKiAtIElmIG5vIHZhbGlkYXRvciBpcyBwcm92aWRlZCwgdmFsaWRhdGlvbiBkZWZhdWx0cyB0byB0cnVlLlxyXG4gKlxyXG4gKiBJTVBPUlRBTlQ6IFZhbGlkYXRpb24gb3V0Y29tZSBpcyAqKmRlcml2ZWQgbG9jYWwgc3RhdGUqKiBhbmQgTVVTVCBOT1QgYmUgcmVwbGljYXRlZC5cclxuICogQWxsIGNsaWVudHMgTVVTVCB1c2UgdGhlIHNhbWUgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgY29uc2lzdGVuY3kuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBWYWxpZGF0ZUZuPFN0YXRlIGV4dGVuZHMgSlNPTk9iamVjdD4gPSAoY2FuZGlkYXRlU3RhdGU6IFN0YXRlKSA9PiBib29sZWFuXHJcblxyXG4vKipcclxuICogUmVzb2x2ZXMgYSBwYXRoIHdpdGhpbiB0aGUgc3RhdGUuXHJcbiAqIFRocm93cyBpZiBhbnkgc2VnbWVudCBpcyBtaXNzaW5nIG9yIGhhcyB3cm9uZyB0eXBlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgoc3RhdGU6IEpTT05PYmplY3QsIHBhdGg6IFBhdGgpOiBKU09OVmFsdWUge1xyXG4gIGxldCBjdXJyZW50OiBKU09OVmFsdWUgPSBzdGF0ZVxyXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XHJcbiAgICBpZiAodHlwZW9mIHNlZ21lbnQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKCFpc09iamVjdChjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgb2JqZWN0IGF0IHBhdGggc2VnbWVudCBcIiR7c2VnbWVudH1cImApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCEoc2VnbWVudCBpbiBjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYFByb3BlcnR5IFwiJHtzZWdtZW50fVwiIGRvZXMgbm90IGV4aXN0YClcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtzZWdtZW50XVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgYXJyYXkgYXQgcGF0aCBzZWdtZW50ICR7c2VnbWVudH1gKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWdtZW50IDwgMCB8fCBzZWdtZW50ID49IGN1cnJlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgZmFpbHVyZShgSW5kZXggJHtzZWdtZW50fSBvdXQgb2YgYm91bmRzYClcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtzZWdtZW50XVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3VycmVudFxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBvcGVyYXRpb24uXHJcbiAqIChSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZm9yIHN0YW5kYXJkIEpTT04tcGF0Y2ggYmVoYXZpb3IpXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseU9wKHN0YXRlOiBKU09OT2JqZWN0LCBvcDogT3AsIGNsb25lVmFsdWVzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgLy8gU3BlY2lhbCBjYXNlOiBpZiBwYXRoIGlzIGVtcHR5LCB3ZSBjYW4ndCByZXNvbHZlIFwiY29udGFpbmVyXCIuXHJcbiAgLy8gVGhlIGNhbGxlciBtdXN0IGhhbmRsZSByb290LWxldmVsIHJlcGxhY2VtZW50IGlmIG5lY2Vzc2FyeSwgYnV0XHJcbiAgLy8gc3RhbmRhcmQgT3BzIHVzdWFsbHkgYWN0IE9OIGEgY29udGFpbmVyLlxyXG4gIC8vIEV4Y2VwdGlvbjogaWYgd2UgYWN0IG9uIHJvb3QsIGhhbmRsZSBleHBsaWNpdGx5IG9yIGFzc3VtZSBwYXRoIGxlbmd0aCA+IDAuXHJcbiAgLy8gRm9yIHRoaXMgc3BlYywgT3BzIG1vZGlmeSAqZmllbGRzKiBvciAqaW5kaWNlcyouXHJcbiAgLy8gSWYgcGF0aCBpcyBlbXB0eSwgaXQgbWVhbnMgd2UgYXJlIGFjdGluZyBPTiB0aGUgcm9vdCBvYmplY3QgaXRzZWxmP1xyXG4gIC8vIFRoZSBzcGVjJ3MgXCJzZXRcIiBleGFtcGxlOiBjb250YWluZXJbb3Aua2V5XSA9IG9wLnZhbHVlLlxyXG4gIC8vIFRoaXMgaW1wbGllcyB3ZSByZXNvbHZlIHBhdGggdG8gZ2V0IHRoZSBQQVJFTlQgY29udGFpbmVyLlxyXG5cclxuICBjb25zdCBjb250YWluZXIgPSByZXNvbHZlUGF0aChzdGF0ZSwgb3AucGF0aClcclxuXHJcbiAgc3dpdGNoIChvcC5raW5kKSB7XHJcbiAgICBjYXNlIFwic2V0XCI6XHJcbiAgICAgIGlmICghaXNPYmplY3QoY29udGFpbmVyKSB8fCBBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwic2V0IHJlcXVpcmVzIG9iamVjdCBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICA7KGNvbnRhaW5lciBhcyBhbnkpW29wLmtleV0gPSBjbG9uZVZhbHVlcyA/IGRlZXBDbG9uZShvcC52YWx1ZSkgOiBvcC52YWx1ZVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGNhc2UgXCJkZWxldGVcIjpcclxuICAgICAgaWYgKCFpc09iamVjdChjb250YWluZXIpIHx8IEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgIGZhaWx1cmUoXCJkZWxldGUgcmVxdWlyZXMgb2JqZWN0IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIGRlbGV0ZSAoY29udGFpbmVyIGFzIGFueSlbb3Aua2V5XVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGNhc2UgXCJzcGxpY2VcIjoge1xyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgIGZhaWx1cmUoXCJzcGxpY2UgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc2FmZUluZGV4ID0gTWF0aC5taW4ob3AuaW5kZXgsIGNvbnRhaW5lci5sZW5ndGgpXHJcbiAgICAgIGNvbnRhaW5lci5zcGxpY2UoXHJcbiAgICAgICAgc2FmZUluZGV4LFxyXG4gICAgICAgIG9wLmRlbGV0ZUNvdW50LFxyXG4gICAgICAgIC4uLihjbG9uZVZhbHVlcyA/IG9wLmluc2VydHMubWFwKCh2KSA9PiBkZWVwQ2xvbmUodikpIDogb3AuaW5zZXJ0cylcclxuICAgICAgKVxyXG4gICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgXCJhZGRUb1NldFwiOlxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgIGZhaWx1cmUoXCJhZGRUb1NldCByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRhaW5lci5zb21lKChpdGVtKSA9PiBkZWVwRXF1YWwoaXRlbSwgb3AudmFsdWUpKSkge1xyXG4gICAgICAgIGNvbnRhaW5lci5wdXNoKGNsb25lVmFsdWVzID8gZGVlcENsb25lKG9wLnZhbHVlKSA6IG9wLnZhbHVlKVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgY2FzZSBcImRlbGV0ZUZyb21TZXRcIjpcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwiZGVsZXRlRnJvbVNldCByZXF1aXJlcyBhcnJheSBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICAvLyBSZW1vdmUgYWxsIG1hdGNoaW5nIGl0ZW1zIHVzaW5nIHNwbGljZSAoZnJvbSBlbmQgdG8gYXZvaWQgaW5kZXggc2hpZnRpbmcpXHJcbiAgICAgIGZvciAobGV0IGkgPSBjb250YWluZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBpZiAoZGVlcEVxdWFsKGNvbnRhaW5lcltpXSwgb3AudmFsdWUpKSB7XHJcbiAgICAgICAgICBjb250YWluZXIuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrXHJcblxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgdGhyb3cgZmFpbHVyZShgVW5rbm93biBvcGVyYXRpb24ga2luZDogJHsob3AgYXMgYW55KS5raW5kfWApXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgYXBwbHlPcHMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5T3BzT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBkZWVwIGNsb25lIHZhbHVlcyBiZWZvcmUgaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgdGFyZ2V0LlxyXG4gICAqIC0gYHRydWVgIChkZWZhdWx0KTogVmFsdWVzIGFyZSBjbG9uZWQgdG8gcHJldmVudCBhbGlhc2luZyBiZXR3ZWVuIHRoZSBvcHMgYW5kIHRhcmdldC5cclxuICAgKiAtIGBmYWxzZWA6IFZhbHVlcyBhcmUgdXNlZCBkaXJlY3RseSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLiBPbmx5IHVzZSB0aGlzIGlmIHlvdVxyXG4gICAqICAgZ3VhcmFudGVlIHRoZSBvcCB2YWx1ZXMgd29uJ3QgYmUgbXV0YXRlZCBhZnRlciBhcHBsaWNhdGlvbi5cclxuICAgKi9cclxuICBjbG9uZVZhbHVlcz86IGJvb2xlYW5cclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gYSBtdXRhYmxlIHRhcmdldCBvYmplY3QuXHJcbiAqIFVzZSB0aGlzIHRvIHN5bmNocm9uaXplIGFuIGV4dGVybmFsIG11dGFibGUgc3RhdGUgKGUuZy4sIE1vYlggc3RvcmUpXHJcbiAqIHdpdGggdGhlIG9wZXJhdGlvbnMgcmVjZWl2ZWQgdmlhIHN1YnNjcmliZSgpLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3BzIC0gVGhlIGxpc3Qgb2Ygb3BlcmF0aW9ucyB0byBhcHBseS5cclxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBtdXRhYmxlIG9iamVjdCB0byBtb2RpZnkuXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgZm9yIGNvbnRyb2xsaW5nIGNsb25pbmcgYmVoYXZpb3IuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPcHMob3BzOiByZWFkb25seSBPcFtdLCB0YXJnZXQ6IEpTT05PYmplY3QsIG9wdGlvbnM/OiBBcHBseU9wc09wdGlvbnMpOiB2b2lkIHtcclxuICBjb25zdCBjbG9uZVZhbHVlcyA9IG9wdGlvbnM/LmNsb25lVmFsdWVzID8/IHRydWVcclxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xyXG4gICAgYXBwbHlPcCh0YXJnZXQsIG9wLCBjbG9uZVZhbHVlcylcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbImVxdWFsIiwic2NvcGVkVXJsQWxwaGFiZXQiLCJyZmRjIiwiaGFuZGxlciIsImNsb25lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWU8sV0FBUywrQkFBK0IsYUFHN0M7QUFDQSxRQUFJLFdBQVc7QUFDZixRQUFJLE9BQWdDO0FBQ3BDLFFBQUksY0FBYztBQUNsQixRQUFJLGVBQWU7QUFFbkIsZUFBVyxDQUFDLEtBQUssRUFBRSxLQUFLLFlBQVksV0FBVztBQUM3QyxZQUFNLEVBQUUsT0FBTyxhQUFhLG1CQUFtQixHQUFHO0FBRWxELFVBQUksUUFBUSxVQUFVO0FBRXBCLG1CQUFXO0FBQ1gsZUFBTztBQUNQLHNCQUFjLEdBQUc7QUFDakIsdUJBQWU7QUFBQSxNQUNqQixXQUFXLFVBQVUsVUFBVTtBQUk3QixZQUFJLEdBQUcsVUFBVSxlQUFnQixHQUFHLFlBQVksZUFBZSxXQUFXLGNBQWU7QUFDdkYsaUJBQU87QUFDUCx3QkFBYyxHQUFHO0FBQ2pCLHlCQUFlO0FBQUEsUUFDakI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFdBQU8sRUFBRSxnQkFBZ0IsVUFBVSxZQUFZLEtBQUE7QUFBQSxFQUNqRDtBQUFBLEVDM0NPLE1BQU0sMEJBQTBCLE1BQU07QUFBQSxJQUMzQyxZQUFZLEtBQWE7QUFDdkIsWUFBTSxHQUFHO0FBR1QsYUFBTyxlQUFlLE1BQU0sa0JBQWtCLFNBQVM7QUFBQSxJQUN6RDtBQUFBLEVBQ0Y7QUFFTyxXQUFTLFFBQVEsU0FBd0I7QUFDOUMsVUFBTSxJQUFJLGtCQUFrQixPQUFPO0FBQUEsRUFDckM7QUN5Q0EsV0FBUyx1QkFBdUIsTUFBd0M7QUFDdEUsV0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJ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QztBQUVFLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxjQUFjLFVBQVUsR0FBRyxLQUFLLElBQUksR0FBRztBQUNyRTtBQUFBLE1BRUYsS0FBSztBQUNILFlBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQ3BELGtCQUFRLGtDQUFrQztBQUFBLFFBQzVDO0FBRUEsZUFBUSxVQUFrQixHQUFHLEdBQUc7QUFDaEM7QUFBQSxNQUVGLEtBQUssVUFBVTtBQUNiLFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLGlDQUFpQztBQUFBLFFBQzNDO0FBQ0EsY0FBTSxZQUFZLEtBQUssSUFBSSxHQUFHLE9BQU8sVUFBVSxNQUFNO0FBQ3JELGtCQUFVO0FBQUEsVUFDUjtBQUFBLFVBQ0EsR0FBRztBQUFBLFVBQ0gsR0FBSSxjQUFjLEdBQUcsUUFBUSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUc7QUFBQSxRQUFBO0FBRTdEO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSztBQUNILFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLG1DQUFtQztBQUFBLFFBQzdDO0FBQ0EsWUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLFNBQVMsVUFBVSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUc7QUFDeEQsb0JBQVUsS0FBSyxjQUFjLFVBQVUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUEsUUFDN0Q7QUFDQTtBQUFBLE1BRUYsS0FBSztBQUNILFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLHdDQUF3QztBQUFBLFFBQ2xEO0FBRUEsaUJBQVMsSUFBSSxVQUFVLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM5QyxjQUFJLFVBQVUsVUFBVSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUc7QUFDckMsc0JBQVUsT0FBTyxHQUFHLENBQUM7QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFDQTtBQUFBLE1BRUY7QUFDRSxjQUFNLFFBQVEsMkJBQTRCLEdBQVcsSUFBSSxFQUFFO0FBQUEsSUFBQTtBQUFBLEVBRWpFO0FBd0JPLFdBQVMsU0FBUyxLQUFvQixRQUFvQixTQUFpQzs7QUFDaEcsVUFBTSxlQUFjLHdDQUFTLGdCQUFULFlBQXdCO0FBQzVDLGVBQVcsTUFBTSxLQUFLO0FBQ3BCLGNBQVEsUUFBUSxJQUFJLFdBQVc7QUFBQSxJQUNqQztBQUFBLEVBQ0Y7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlszLDQsNSw2XX0=
|
|
2136
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtc3luYy1sb2cudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvY3JlYXRlT3BzL2NvbnN0YW50LnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9pbnRlcmZhY2UudHMiLCIuLi9zcmMvY3JlYXRlT3BzL3V0aWxzLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9jdXJyZW50LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtZGVlcC1lcXVhbEAzLjEuMy9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL25hbm9pZEA1LjEuNi9ub2RlX21vZHVsZXMvbmFub2lkL3VybC1hbHBoYWJldC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjYvbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JmZGNAMS40LjEvbm9kZV9tb2R1bGVzL3JmZGMvaW5kZXguanMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvY3JlYXRlT3BzL3B1c2hPcC50cyIsIi4uL3NyYy9jcmVhdGVPcHMvZHJhZnQudHMiLCIuLi9zcmMvY3JlYXRlT3BzL2RyYWZ0aWZ5LnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9jcmVhdGVPcHMudHMiLCIuLi9zcmMvY3JlYXRlT3BzL29yaWdpbmFsLnRzIiwiLi4vc3JjL2NyZWF0ZU9wcy9zZXRIZWxwZXJzLnRzIiwiLi4vc3JjL2NoZWNrcG9pbnRVdGlscy50cyIsIi4uL3NyYy9jaGVja3BvaW50cy50cyIsIi4uL3NyYy9kcmFmdC50cyIsIi4uL3NyYy9yZWNvbmNpbGUudHMiLCIuLi9zcmMvdHhUaW1lc3RhbXAudHMiLCIuLi9zcmMvU29ydGVkVHhFbnRyeS50cyIsIi4uL3NyYy9TdGF0ZUNhbGN1bGF0b3IudHMiLCIuLi9zcmMvY2xpZW50U3RhdGUudHMiLCIuLi9zcmMvdHhMb2cudHMiLCIuLi9zcmMvY3JlYXRlU3RhdGVTeW5jTG9nLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFN0YXRlU3luY0xvZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKG1zZylcblxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkgZm9yIGJldHRlciBpbnN0YW5jZW9mIHN1cHBvcnRcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU3RhdGVTeW5jTG9nRXJyb3IucHJvdG90eXBlKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFN0YXRlU3luY0xvZ0Vycm9yKG1lc3NhZ2UpXG59XG4iLCIvKipcclxuICogQ29uc3RhbnRzIGZvciBjcmVhdGVPcHMuXHJcbiAqIFNpbXBsaWZpZWQgZnJvbSBvcmlnaW5hbCBzb3VyY2UgLSByZW1vdmVkIGRhdGFUeXBlcyAobWFyayBmZWF0dXJlKS5cclxuICovXHJcblxyXG4vLyBTeW1ib2wgdG8gaWRlbnRpZnkgcHJveHkgZHJhZnRzIC0gYWNjZXNzaWJsZSBmb3IgM3JkIHBhcnR5XHJcbmV4cG9ydCBjb25zdCBQUk9YWV9EUkFGVCA9IFN5bWJvbC5mb3IoXCJfX0NSRUFURU9QU19QUk9YWV9EUkFGVF9fXCIpXHJcblxyXG4vLyBTeW1ib2wgaXRlcmF0b3JcclxuZXhwb3J0IGNvbnN0IGl0ZXJhdG9yU3ltYm9sOiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID0gU3ltYm9sLml0ZXJhdG9yXHJcbiIsIi8qKlxyXG4gKiBjcmVhdGVPcHMgaW50ZXJmYWNlIHR5cGVzLlxyXG4gKiBTaW1wbGlmaWVkIGZyb20gbXV0YXRpdmUgLSByZW1vdmVkIHBhdGNoZXMsIGF1dG9GcmVlemUsIHN0cmljdCBtb2RlLCBtYXJrLCBNYXAvU2V0IHN1cHBvcnQuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHR5cGUgeyBKU09OUHJpbWl0aXZlLCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi4vanNvblwiXHJcbmltcG9ydCB0eXBlIHsgT3AgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiXHJcblxyXG5leHBvcnQgdHlwZSB7IE9wLCBQYXRoLCBKU09OVmFsdWUgfVxyXG5cclxuZXhwb3J0IGVudW0gRHJhZnRUeXBlIHtcclxuICBPYmplY3QgPSAwLFxyXG4gIEFycmF5ID0gMSxcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmFsaXRpZXMgLSBzaGFyZWQgc3RhdGUgZm9yIHRoZSBkcmFmdCB0cmVlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXRpZXMge1xyXG4gIC8qKiBGaW5hbGl6YXRpb24gY2FsbGJhY2tzIChmb3IgdW53cmFwcGluZyBjaGlsZCBkcmFmdHMpICovXHJcbiAgZHJhZnQ6ICgoKSA9PiB2b2lkKVtdXHJcbiAgLyoqIFJldm9rZSBmdW5jdGlvbnMgZm9yIGFsbCBwcm94aWVzICovXHJcbiAgcmV2b2tlOiAoKCkgPT4gdm9pZClbXVxyXG4gIC8qKiBTZXQgb2YgaGFuZGxlZCBvYmplY3RzIChmb3IgY3ljbGUgZGV0ZWN0aW9uKSAqL1xyXG4gIGhhbmRsZWRTZXQ6IFdlYWtTZXQ8b2JqZWN0PlxyXG4gIC8qKiBDYWNoZSBvZiBjcmVhdGVkIGRyYWZ0cyAqL1xyXG4gIGRyYWZ0c0NhY2hlOiBXZWFrU2V0PG9iamVjdD5cclxuICAvKiogTGlzdCBvZiBvcGVyYXRpb25zIHBlcmZvcm1lZCBpbiB0aGlzIGRyYWZ0IHNlc3Npb24gKGVhZ2VyIGxvZ2dpbmcpICovXHJcbiAgb3BzOiBPcFtdXHJcbiAgLyoqIFJvb3QgZHJhZnQgb2YgdGhlIHRyZWUgKHNldCB3aGVuIGNyZWF0aW5nIHRoZSByb290IGRyYWZ0KSAqL1xyXG4gIHJvb3REcmFmdDogUHJveHlEcmFmdCB8IG51bGxcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVybmFsIHByb3h5IGRyYWZ0IHN0YXRlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5RHJhZnQ8VCA9IGFueT4ge1xyXG4gIC8qKiBUeXBlIG9mIHRoZSBkcmFmdCAoT2JqZWN0IG9yIEFycmF5KSAqL1xyXG4gIHR5cGU6IERyYWZ0VHlwZVxyXG4gIC8qKiBXaGV0aGVyIHRoaXMgZHJhZnQgaGFzIGJlZW4gbXV0YXRlZCAqL1xyXG4gIG9wZXJhdGVkPzogYm9vbGVhblxyXG4gIC8qKiBXaGV0aGVyIGZpbmFsaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgKi9cclxuICBmaW5hbGl6ZWQ6IGJvb2xlYW5cclxuICAvKiogVGhlIG9yaWdpbmFsICh1bm1vZGlmaWVkKSB2YWx1ZSAqL1xyXG4gIG9yaWdpbmFsOiBUXHJcbiAgLyoqIFRoZSBzaGFsbG93IGNvcHkgKGNyZWF0ZWQgb24gZmlyc3QgbXV0YXRpb24pICovXHJcbiAgY29weTogVCB8IG51bGxcclxuICAvKiogVGhlIHByb3h5IGluc3RhbmNlICovXHJcbiAgcHJveHk6IFQgfCBudWxsXHJcbiAgLyoqIEZpbmFsaXRpZXMgY29udGFpbmVyIChzaGFyZWQgYWNyb3NzIGRyYWZ0IHRyZWUpICovXHJcbiAgZmluYWxpdGllczogRmluYWxpdGllc1xyXG4gIC8qKiBQYXJlbnQgZHJhZnQgKGZvciBwYXRoIHRyYWNraW5nKSAqL1xyXG4gIHBhcmVudD86IFByb3h5RHJhZnQgfCBudWxsXHJcbiAgLyoqIEtleSBpbiBwYXJlbnQgKi9cclxuICBrZXk/OiBzdHJpbmcgfCBudW1iZXJcclxuICAvKiogVHJhY2sgd2hpY2gga2V5cyBoYXZlIGJlZW4gYXNzaWduZWQgKGtleSAtPiB0cnVlPWFzc2lnbmVkLCBmYWxzZT1kZWxldGVkKSAqL1xyXG4gIGFzc2lnbmVkTWFwPzogTWFwPFByb3BlcnR5S2V5LCBib29sZWFuPlxyXG4gIC8qKiBDb3VudCBvZiBwb3NpdGlvbnMgdGhpcyBkcmFmdCBleGlzdHMgYXQgKGZvciBhbGlhc2luZyBvcHRpbWl6YXRpb24pICovXHJcbiAgYWxpYXNDb3VudDogbnVtYmVyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXN1bHQgb2YgY3JlYXRlT3BzXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9wc1Jlc3VsdDxUPiB7XHJcbiAgLyoqIFRoZSBuZXcgaW1tdXRhYmxlIHN0YXRlICovXHJcbiAgbmV4dFN0YXRlOiBUXHJcbiAgLyoqIFRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZSBwZXJmb3JtZWQgKi9cclxuICBvcHM6IE9wW11cclxufVxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBUeXBlIFV0aWxpdGllc1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKiogUHJpbWl0aXZlIHR5cGVzIHRoYXQgZG9uJ3QgbmVlZCBkcmFmdGluZyAqL1xyXG50eXBlIFByaW1pdGl2ZSA9IEpTT05QcmltaXRpdmVcclxuXHJcbi8qKlxyXG4gKiBEcmFmdCB0eXBlIC0gbWFrZXMgYWxsIHByb3BlcnRpZXMgbXV0YWJsZSBmb3IgZWRpdGluZ1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgRHJhZnQ8VD4gPSBUIGV4dGVuZHMgUHJpbWl0aXZlXHJcbiAgPyBUXHJcbiAgOiBUIGV4dGVuZHMgb2JqZWN0XHJcbiAgICA/IHsgLXJlYWRvbmx5IFtLIGluIGtleW9mIFRdOiBEcmFmdDxUW0tdPiB9XHJcbiAgICA6IFRcclxuXHJcbi8qKlxyXG4gKiBJbW11dGFibGUgdHlwZSAtIG1ha2VzIGFsbCBwcm9wZXJ0aWVzIHJlYWRvbmx5XHJcbiAqL1xyXG5leHBvcnQgdHlwZSBJbW11dGFibGU8VD4gPSBUIGV4dGVuZHMgUHJpbWl0aXZlXHJcbiAgPyBUXHJcbiAgOiBUIGV4dGVuZHMgb2JqZWN0XHJcbiAgICA/IHsgcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IEltbXV0YWJsZTxUW0tdPiB9XHJcbiAgICA6IFRcclxuIiwiLyoqXHJcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm94eSBkcmFmdHMuXHJcbiAqIEFkYXB0ZWQgZnJvbSBtdXRhdGl2ZSAtIHJlbW92ZWQgTWFwL1NldCBzdXBwb3J0LCBtYXJrLCBkZWVwRnJlZXplLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vZXJyb3JcIlxyXG5pbXBvcnQgeyBQUk9YWV9EUkFGVCB9IGZyb20gXCIuL2NvbnN0YW50XCJcclxuaW1wb3J0IHsgRHJhZnRUeXBlLCB0eXBlIFByb3h5RHJhZnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIlxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBDb3JlIERyYWZ0IFV0aWxpdGllc1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBsYXRlc3QgdmFsdWUgKGNvcHkgaWYgZXhpc3RzLCBvdGhlcndpc2Ugb3JpZ2luYWwpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGF0ZXN0PFQ+KHByb3h5RHJhZnQ6IFByb3h5RHJhZnQ8VD4pOiBUIHtcclxuICByZXR1cm4gKHByb3h5RHJhZnQuY29weSA/PyBwcm94eURyYWZ0Lm9yaWdpbmFsKSBhcyBUXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBkcmFmdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnQodGFyZ2V0OiB1bmtub3duKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuICEhZ2V0UHJveHlEcmFmdCh0YXJnZXQpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIFByb3h5RHJhZnQgZnJvbSBhIGRyYWZ0IHZhbHVlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJveHlEcmFmdDxUPih2YWx1ZTogdW5rbm93bik6IFByb3h5RHJhZnQ8VD4gfCBudWxsIHtcclxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbFxyXG4gIHJldHVybiAodmFsdWUgYXMgeyBbUFJPWFlfRFJBRlRdPzogUHJveHlEcmFmdDxUPiB9KVtQUk9YWV9EUkFGVF0gPz8gbnVsbFxyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBhY3R1YWwgdmFsdWUgZnJvbSBhIGRyYWZ0IChjb3B5IG9yIG9yaWdpbmFsKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBUKTogVCB7XHJcbiAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQodmFsdWUpXHJcbiAgcmV0dXJuIHByb3h5RHJhZnQgPyAoKHByb3h5RHJhZnQuY29weSA/PyBwcm94eURyYWZ0Lm9yaWdpbmFsKSBhcyBUKSA6IHZhbHVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGRyYWZ0YWJsZSAocGxhaW4gb2JqZWN0IG9yIGFycmF5KVxyXG4gKiBXZSBvbmx5IHN1cHBvcnQgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIC0gbm8gTWFwLCBTZXQsIERhdGUsIGV0Yy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XHJcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGVcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgZHJhZnQgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGUodGFyZ2V0OiB1bmtub3duKTogRHJhZnRUeXBlIHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gRHJhZnRUeXBlLkFycmF5IDogRHJhZnRUeXBlLk9iamVjdFxyXG59XHJcblxyXG4vKipcclxuICogR2V0IGEgdmFsdWUgYnkga2V5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0KHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XHJcbiAgcmV0dXJuICh0YXJnZXQgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XVxyXG59XHJcblxyXG4vKipcclxuICogU2V0IGEgdmFsdWUgYnkga2V5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0KHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gIDsodGFyZ2V0IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzIChvd24gcHJvcGVydHkpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGFzKHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24odGFyZ2V0LCBrZXkgYXMgc3RyaW5nKVxyXG59XHJcblxyXG4vKipcclxuICogUGVlayBhdCBhIHZhbHVlICh0aHJvdWdoIGRyYWZ0cylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwZWVrKHRhcmdldDogb2JqZWN0LCBrZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XHJcbiAgY29uc3Qgc3RhdGUgPSBnZXRQcm94eURyYWZ0KHRhcmdldClcclxuICBjb25zdCBzb3VyY2UgPSBzdGF0ZSA/IGxhdGVzdChzdGF0ZSkgOiB0YXJnZXRcclxuICByZXR1cm4gKHNvdXJjZSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTYW1lVmFsdWUgY29tcGFyaXNvbiAoaGFuZGxlcyAtMCBhbmQgTmFOKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRXF1YWwoeDogdW5rbm93biwgeTogdW5rbm93bik6IGJvb2xlYW4ge1xyXG4gIGlmICh4ID09PSB5KSB7XHJcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8gKHggYXMgbnVtYmVyKSA9PT0gMSAvICh5IGFzIG51bWJlcilcclxuICB9XHJcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1NlbGZDb21wYXJlOiBOYU4gY2hlY2sgcGF0dGVybiAoTmFOICE9PSBOYU4pXHJcbiAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geVxyXG59XHJcblxyXG4vKipcclxuICogUmV2b2tlIGFsbCBwcm94aWVzIGluIGEgZHJhZnQgdHJlZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJldm9rZVByb3h5KHByb3h5RHJhZnQ6IFByb3h5RHJhZnQgfCBudWxsKTogdm9pZCB7XHJcbiAgaWYgKCFwcm94eURyYWZ0KSByZXR1cm5cclxuICB3aGlsZSAocHJveHlEcmFmdC5maW5hbGl0aWVzLnJldm9rZS5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCByZXZva2UgPSBwcm94eURyYWZ0LmZpbmFsaXRpZXMucmV2b2tlLnBvcCgpIVxyXG4gICAgcmV2b2tlKClcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIHBhdGggZnJvbSByb290IHRvIHRoaXMgZHJhZnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKFxyXG4gIHRhcmdldDogUHJveHlEcmFmdCxcclxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW11cclxuKTogKHN0cmluZyB8IG51bWJlcilbXSB8IG51bGwge1xyXG4gIGlmIChPYmplY3QuaGFzT3duKHRhcmdldCwgXCJrZXlcIikgJiYgdGFyZ2V0LmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IHN0aWxsIGhhcyB0aGlzIGRyYWZ0IGF0IHRoaXMga2V5XHJcbiAgICBjb25zdCBwYXJlbnRDb3B5ID0gdGFyZ2V0LnBhcmVudD8uY29weVxyXG4gICAgaWYgKHBhcmVudENvcHkpIHtcclxuICAgICAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQoZ2V0KHBhcmVudENvcHkgYXMgb2JqZWN0LCB0YXJnZXQua2V5KSlcclxuICAgICAgaWYgKHByb3h5RHJhZnQgIT09IG51bGwgJiYgcHJveHlEcmFmdC5vcmlnaW5hbCAhPT0gdGFyZ2V0Lm9yaWdpbmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcGF0aC5wdXNoKHRhcmdldC5rZXkpXHJcbiAgfVxyXG4gIGlmICh0YXJnZXQucGFyZW50KSB7XHJcbiAgICByZXR1cm4gZ2V0UGF0aCh0YXJnZXQucGFyZW50LCBwYXRoKVxyXG4gIH1cclxuICAvLyB0YXJnZXQgaXMgcm9vdCBkcmFmdFxyXG4gIHBhdGgucmV2ZXJzZSgpXHJcbiAgcmV0dXJuIHBhdGhcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgcGF0aCBmcm9tIHJvb3QgdG8gdGhpcyBkcmFmdCwgb3IgdGhyb3cgaWYgbm90IGF2YWlsYWJsZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGhPclRocm93KHRhcmdldDogUHJveHlEcmFmdCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xyXG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKHRhcmdldClcclxuICBpZiAoIXBhdGgpIHtcclxuICAgIHRocm93IGZhaWx1cmUoXCJDYW5ub3QgZGV0ZXJtaW5lIHBhdGggZm9yIG9wZXJhdGlvblwiKVxyXG4gIH1cclxuICByZXR1cm4gcGF0aFxyXG59XHJcblxyXG4vKipcclxuICogRmluZCBhbGwgcGF0aHMgdG8gYSBnaXZlbiBkcmFmdCBieSBzZWFyY2hpbmcgdGhlIHRyZWUuXHJcbiAqIFRoaXMgaGFuZGxlcyBhbGlhc2luZyB3aGVyZSB0aGUgc2FtZSBkcmFmdCBleGlzdHMgYXQgbXVsdGlwbGUgcG9zaXRpb25zLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFBhdGhzRm9yRHJhZnQoXHJcbiAgcm9vdERyYWZ0OiBQcm94eURyYWZ0LFxyXG4gIHRhcmdldERyYWZ0OiBQcm94eURyYWZ0XHJcbik6IChzdHJpbmcgfCBudW1iZXIpW11bXSB7XHJcbiAgY29uc3QgcmVzdWx0OiAoc3RyaW5nIHwgbnVtYmVyKVtdW10gPSBbXVxyXG5cclxuICBmdW5jdGlvbiBzZWFyY2goY3VycmVudDogUHJveHlEcmFmdCwgY3VycmVudFBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcclxuICAgIGlmIChjdXJyZW50ID09PSB0YXJnZXREcmFmdCkge1xyXG4gICAgICByZXN1bHQucHVzaChbLi4uY3VycmVudFBhdGhdKVxyXG4gICAgICAvLyBEb24ndCByZXR1cm4gLSB0aGUgc2FtZSBkcmFmdCBjb3VsZCBiZSBuZXN0ZWQgaW5zaWRlIGl0c2VsZiAodW5saWtlbHkgYnV0IHBvc3NpYmxlKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChjdXJyZW50KSBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPlxyXG4gICAgaWYgKCFzb3VyY2UgfHwgdHlwZW9mIHNvdXJjZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuXHJcblxyXG4gICAgY29uc3Qga2V5czogKHN0cmluZyB8IG51bWJlcilbXSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxyXG4gICAgICA/IEFycmF5LmZyb20oeyBsZW5ndGg6IHNvdXJjZS5sZW5ndGggfSwgKF8sIGkpID0+IGkpXHJcbiAgICAgIDogT2JqZWN0LmtleXMoc291cmNlKVxyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XVxyXG4gICAgICBjb25zdCBjaGlsZERyYWZ0ID0gZ2V0UHJveHlEcmFmdCh2YWx1ZSlcclxuICAgICAgaWYgKGNoaWxkRHJhZnQpIHtcclxuICAgICAgICBzZWFyY2goY2hpbGREcmFmdCwgWy4uLmN1cnJlbnRQYXRoLCBrZXldKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2gocm9vdERyYWZ0LCBbXSlcclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZyb20gdGhlIHByb3RvdHlwZSBjaGFpblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NyaXB0b3IodGFyZ2V0OiBvYmplY3QsIGtleTogUHJvcGVydHlLZXkpOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xyXG4gIGlmIChrZXkgaW4gdGFyZ2V0KSB7XHJcbiAgICBsZXQgcHJvdG90eXBlID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXHJcbiAgICB3aGlsZSAocHJvdG90eXBlKSB7XHJcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSlcclxuICAgICAgaWYgKGRlc2NyaXB0b3IpIHJldHVybiBkZXNjcmlwdG9yXHJcbiAgICAgIHByb3RvdHlwZSA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdW5kZWZpbmVkXHJcbn1cclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gQ29weSBVdGlsaXRpZXNcclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuY29uc3QgcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBzaGFsbG93IGNvcHkgb2YgYW4gb2JqZWN0IG9yIGFycmF5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VD4ob3JpZ2luYWw6IFQpOiBUIHtcclxuICBpZiAoQXJyYXkuaXNBcnJheShvcmlnaW5hbCkpIHtcclxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmNhbGwob3JpZ2luYWwpIGFzIFRcclxuICB9XHJcbiAgLy8gUGxhaW4gb2JqZWN0IC0gdXNlIG9wdGltaXplZCBjb3B5XHJcbiAgY29uc3QgY29weTogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7fVxyXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9yaWdpbmFsIGFzIG9iamVjdCkpIHtcclxuICAgIGNvcHlba2V5XSA9IChvcmlnaW5hbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XVxyXG4gIH1cclxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9yaWdpbmFsIGFzIG9iamVjdCkpIHtcclxuICAgIGlmIChwcm9wSXNFbnVtLmNhbGwob3JpZ2luYWwsIGtleSkpIHtcclxuICAgICAgY29weVtrZXldID0gKG9yaWdpbmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtrZXldXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjb3B5IGFzIFRcclxufVxyXG5cclxuLyoqXHJcbiAqIEVuc3VyZSBhIGRyYWZ0IGhhcyBhIHNoYWxsb3cgY29weVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVNoYWxsb3dDb3B5KHRhcmdldDogUHJveHlEcmFmdCk6IHZvaWQge1xyXG4gIGlmICh0YXJnZXQuY29weSkgcmV0dXJuXHJcbiAgdGFyZ2V0LmNvcHkgPSBzaGFsbG93Q29weSh0YXJnZXQub3JpZ2luYWwpXHJcbiAgdGFyZ2V0LmFzc2lnbmVkTWFwID0gdGFyZ2V0LmFzc2lnbmVkTWFwID8/IG5ldyBNYXAoKVxyXG59XHJcblxyXG4vKipcclxuICogRGVlcCBjbG9uZSBhIHZhbHVlLCB1bndyYXBwaW5nIGFueSBkcmFmdHNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmU8VD4odGFyZ2V0OiBUKTogVCB7XHJcbiAgaWYgKCFpc0RyYWZ0YWJsZSh0YXJnZXQpKSB7XHJcbiAgICByZXR1cm4gaXNEcmFmdCh0YXJnZXQpID8gKGdldFZhbHVlKHRhcmdldCBhcyBvYmplY3QpIGFzIFQpIDogdGFyZ2V0XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcclxuICAgIHJldHVybiB0YXJnZXQubWFwKGRlZXBDbG9uZSkgYXMgVFxyXG4gIH1cclxuICBjb25zdCBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XHJcbiAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XHJcbiAgICBpZiAoaGFzKHRhcmdldCwga2V5KSkge1xyXG4gICAgICBjb3B5W2tleV0gPSBkZWVwQ2xvbmUoKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSlcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGNvcHkgYXMgVFxyXG59XHJcblxyXG4vKipcclxuICogQ2xvbmUgaWYgdGhlIHZhbHVlIGlzIGEgZHJhZnQsIG90aGVyd2lzZSByZXR1cm4gYXMtaXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUlmTmVlZGVkPFQ+KHRhcmdldDogVCk6IFQge1xyXG4gIHJldHVybiBpc0RyYWZ0KHRhcmdldCkgPyBkZWVwQ2xvbmUodGFyZ2V0KSA6IHRhcmdldFxyXG59XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIERyYWZ0IFN0YXRlIFV0aWxpdGllc1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKipcclxuICogTWFyayBhIGRyYWZ0IGFzIGNoYW5nZWQgKG9wZXJhdGVkKVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHRhcmdldDogUHJveHlEcmFmdCk6IHZvaWQge1xyXG4gIGlmICghdGFyZ2V0Lm9wZXJhdGVkKSB7XHJcbiAgICB0YXJnZXQub3BlcmF0ZWQgPSB0cnVlXHJcbiAgICBpZiAodGFyZ2V0LnBhcmVudCkge1xyXG4gICAgICBtYXJrQ2hhbmdlZCh0YXJnZXQucGFyZW50KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEl0ZXJhdGUgb3ZlciBvYmplY3QvYXJyYXkgZW50cmllc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2g8VCBleHRlbmRzIG9iamVjdD4oXHJcbiAgdGFyZ2V0OiBULFxyXG4gIGNhbGxiYWNrOiAoa2V5OiBQcm9wZXJ0eUtleSwgdmFsdWU6IHVua25vd24sIHRhcmdldDogVCkgPT4gdm9pZFxyXG4pOiB2b2lkIHtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjYWxsYmFjayhpLCB0YXJnZXRbaV0sIHRhcmdldClcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKHRhcmdldCkpIHtcclxuICAgICAgY2FsbGJhY2soa2V5LCAodGFyZ2V0IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0sIHRhcmdldClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gRmluYWxpemF0aW9uIFV0aWxpdGllc1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vKipcclxuICogSGFuZGxlIG5lc3RlZCB2YWx1ZXMgZHVyaW5nIGZpbmFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVZhbHVlKHRhcmdldDogdW5rbm93biwgaGFuZGxlZFNldDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XHJcbiAgaWYgKFxyXG4gICAgIWlzRHJhZnRhYmxlKHRhcmdldCkgfHxcclxuICAgIGlzRHJhZnQodGFyZ2V0KSB8fFxyXG4gICAgaGFuZGxlZFNldC5oYXModGFyZ2V0IGFzIG9iamVjdCkgfHxcclxuICAgIE9iamVjdC5pc0Zyb3plbih0YXJnZXQpXHJcbiAgKSB7XHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGhhbmRsZWRTZXQuYWRkKHRhcmdldCBhcyBvYmplY3QpXHJcblxyXG4gIGZvckVhY2godGFyZ2V0IGFzIG9iamVjdCwgKGtleSwgdmFsdWUpID0+IHtcclxuICAgIGlmIChpc0RyYWZ0KHZhbHVlKSkge1xyXG4gICAgICBjb25zdCBwcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdCh2YWx1ZSkhXHJcbiAgICAgIGVuc3VyZVNoYWxsb3dDb3B5KHByb3h5RHJhZnQpXHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9XHJcbiAgICAgICAgcHJveHlEcmFmdC5hc3NpZ25lZE1hcD8uc2l6ZSB8fCBwcm94eURyYWZ0Lm9wZXJhdGVkID8gcHJveHlEcmFmdC5jb3B5IDogcHJveHlEcmFmdC5vcmlnaW5hbFxyXG4gICAgICBzZXQodGFyZ2V0IGFzIG9iamVjdCwga2V5LCB1cGRhdGVkVmFsdWUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBoYW5kbGVWYWx1ZSh2YWx1ZSwgaGFuZGxlZFNldClcclxuICAgIH1cclxuICB9KVxyXG59XHJcbiIsIi8qKlxyXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSBhIGRyYWZ0IChzbmFwc2hvdCkuXHJcbiAqIEFkYXB0ZWQgZnJvbSBtdXRhdGl2ZSAtIHNpbXBsaWZpZWQgZm9yIHBsYWluIG9iamVjdHMvYXJyYXlzIG9ubHkuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHR5cGUgeyBEcmFmdCB9IGZyb20gXCIuL2ludGVyZmFjZVwiXHJcbmltcG9ydCB7XHJcbiAgZm9yRWFjaCxcclxuICBnZXQsXHJcbiAgZ2V0UHJveHlEcmFmdCxcclxuICBpc0RyYWZ0LFxyXG4gIGlzRHJhZnRhYmxlLFxyXG4gIGlzRXF1YWwsXHJcbiAgc2V0LFxyXG4gIHNoYWxsb3dDb3B5LFxyXG59IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBHZXQgY3VycmVudCBzdGF0ZSBmcm9tIGEgdmFsdWUgKGhhbmRsZXMgbmVzdGVkIGRyYWZ0cylcclxuICovXHJcbmZ1bmN0aW9uIGdldEN1cnJlbnQ8VD4odGFyZ2V0OiBUKTogVCB7XHJcbiAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQodGFyZ2V0KVxyXG5cclxuICAvLyBOb3QgZHJhZnRhYmxlIC0gcmV0dXJuIGFzLWlzXHJcbiAgaWYgKCFpc0RyYWZ0YWJsZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0XHJcblxyXG4gIC8vIERyYWZ0IHRoYXQgaGFzbid0IGJlZW4gbW9kaWZpZWQgLSByZXR1cm4gb3JpZ2luYWxcclxuICBpZiAocHJveHlEcmFmdCAmJiAhcHJveHlEcmFmdC5vcGVyYXRlZCkge1xyXG4gICAgcmV0dXJuIHByb3h5RHJhZnQub3JpZ2luYWwgYXMgVFxyXG4gIH1cclxuXHJcbiAgbGV0IGN1cnJlbnRWYWx1ZTogVCB8IHVuZGVmaW5lZFxyXG5cclxuICBmdW5jdGlvbiBlbnN1cmVTaGFsbG93Q29weUxvY2FsKCkge1xyXG4gICAgY3VycmVudFZhbHVlID0gc2hhbGxvd0NvcHkodGFyZ2V0KVxyXG4gIH1cclxuXHJcbiAgaWYgKHByb3h5RHJhZnQpIHtcclxuICAgIC8vIEl0J3MgYSBkcmFmdCAtIGNyZWF0ZSBhIHNoYWxsb3cgY29weSBlYWdlcmx5XHJcbiAgICBwcm94eURyYWZ0LmZpbmFsaXplZCA9IHRydWVcclxuICAgIHRyeSB7XHJcbiAgICAgIGVuc3VyZVNoYWxsb3dDb3B5TG9jYWwoKVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgcHJveHlEcmFmdC5maW5hbGl6ZWQgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBOb3QgYSBkcmFmdCAtIHVzZSB0YXJnZXQgZGlyZWN0bHksIGNvcHkgbGF6aWx5IGlmIG5lZWRlZFxyXG4gICAgY3VycmVudFZhbHVlID0gdGFyZ2V0XHJcbiAgfVxyXG5cclxuICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGNoaWxkcmVuXHJcbiAgZm9yRWFjaChjdXJyZW50VmFsdWUgYXMgb2JqZWN0LCAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgaWYgKHByb3h5RHJhZnQgJiYgaXNFcXVhbChnZXQocHJveHlEcmFmdC5vcmlnaW5hbCBhcyBvYmplY3QsIGtleSksIHZhbHVlKSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gZ2V0Q3VycmVudCh2YWx1ZSlcclxuICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcclxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgZW5zdXJlU2hhbGxvd0NvcHlMb2NhbCgpXHJcbiAgICAgIH1cclxuICAgICAgc2V0KGN1cnJlbnRWYWx1ZSBhcyBvYmplY3QsIGtleSwgbmV3VmFsdWUpXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIGN1cnJlbnRWYWx1ZSBhcyBUXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBgY3VycmVudChkcmFmdClgIHRvIGdldCBjdXJyZW50IHN0YXRlIGluIHRoZSBkcmFmdCBtdXRhdGlvbiBmdW5jdGlvbi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHNcclxuICogY29uc3QgeyBuZXh0U3RhdGUsIG9wcyB9ID0gY3JlYXRlT3BzKGJhc2VTdGF0ZSwgKGRyYWZ0KSA9PiB7XHJcbiAqICAgZHJhZnQuZm9vLmJhciA9ICduZXcgdmFsdWUnO1xyXG4gKiAgIGNvbnNvbGUubG9nKGN1cnJlbnQoZHJhZnQuZm9vKSk7IC8vIHsgYmFyOiAnbmV3IHZhbHVlJyB9XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW50PFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogRHJhZnQ8VD4pOiBUXHJcbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW50PFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogVCB8IERyYWZ0PFQ+KTogVCB7XHJcbiAgaWYgKCFpc0RyYWZ0KHRhcmdldCkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgY3VycmVudCgpIGlzIG9ubHkgdXNlZCBmb3IgRHJhZnQsIHBhcmFtZXRlcjogJHt0YXJnZXR9YClcclxuICB9XHJcbiAgcmV0dXJuIGdldEN1cnJlbnQodGFyZ2V0KSBhcyBUXHJcbn1cclxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBkbyBub3QgZWRpdCAuanMgZmlsZXMgZGlyZWN0bHkgLSBlZGl0IHNyYy9pbmRleC5qc3RcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YpIHJldHVybiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7XG4gICAgaWYgKGEudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHJldHVybiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIWVxdWFsKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBib3RoIE5hTiwgZmFsc2Ugb3RoZXJ3aXNlXG4gIHJldHVybiBhIT09YSAmJiBiIT09Yjtcbn07XG4iLCJleHBvcnQgY29uc3QgdXJsQWxwaGFiZXQgPVxuICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcbiIsIi8qIEB0cy1zZWxmLXR5cGVzPVwiLi9pbmRleC5kLnRzXCIgKi9cbmltcG9ydCB7IHVybEFscGhhYmV0IGFzIHNjb3BlZFVybEFscGhhYmV0IH0gZnJvbSAnLi91cmwtYWxwaGFiZXQvaW5kZXguanMnXG5leHBvcnQgeyB1cmxBbHBoYWJldCB9IGZyb20gJy4vdXJsLWFscGhhYmV0L2luZGV4LmpzJ1xuZXhwb3J0IGxldCByYW5kb20gPSBieXRlcyA9PiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzKSlcbmV4cG9ydCBsZXQgY3VzdG9tUmFuZG9tID0gKGFscGhhYmV0LCBkZWZhdWx0U2l6ZSwgZ2V0UmFuZG9tKSA9PiB7XG4gIGxldCBtYXNrID0gKDIgPDwgTWF0aC5sb2cyKGFscGhhYmV0Lmxlbmd0aCAtIDEpKSAtIDFcbiAgbGV0IHN0ZXAgPSAtfigoMS42ICogbWFzayAqIGRlZmF1bHRTaXplKSAvIGFscGhhYmV0Lmxlbmd0aClcbiAgcmV0dXJuIChzaXplID0gZGVmYXVsdFNpemUpID0+IHtcbiAgICBsZXQgaWQgPSAnJ1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBsZXQgYnl0ZXMgPSBnZXRSYW5kb20oc3RlcClcbiAgICAgIGxldCBqID0gc3RlcCB8IDBcbiAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgaWQgKz0gYWxwaGFiZXRbYnl0ZXNbal0gJiBtYXNrXSB8fCAnJ1xuICAgICAgICBpZiAoaWQubGVuZ3RoID49IHNpemUpIHJldHVybiBpZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZXhwb3J0IGxldCBjdXN0b21BbHBoYWJldCA9IChhbHBoYWJldCwgc2l6ZSA9IDIxKSA9PlxuICBjdXN0b21SYW5kb20oYWxwaGFiZXQsIHNpemUgfCAwLCByYW5kb20pXG5leHBvcnQgbGV0IG5hbm9pZCA9IChzaXplID0gMjEpID0+IHtcbiAgbGV0IGlkID0gJydcbiAgbGV0IGJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgoc2l6ZSB8PSAwKSkpXG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBpZCArPSBzY29wZWRVcmxBbHBoYWJldFtieXRlc1tzaXplXSAmIDYzXVxuICB9XG4gIHJldHVybiBpZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IHJmZGNcblxuZnVuY3Rpb24gY29weUJ1ZmZlciAoY3VyKSB7XG4gIGlmIChjdXIgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY3VyKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBjdXIuY29uc3RydWN0b3IoY3VyLmJ1ZmZlci5zbGljZSgpLCBjdXIuYnl0ZU9mZnNldCwgY3VyLmxlbmd0aClcbn1cblxuZnVuY3Rpb24gcmZkYyAob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICBpZiAob3B0cy5jaXJjbGVzKSByZXR1cm4gcmZkY0NpcmNsZXMob3B0cylcblxuICBjb25zdCBjb25zdHJ1Y3RvckhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KERhdGUsIChvKSA9PiBuZXcgRGF0ZShvKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoTWFwLCAobywgZm4pID0+IG5ldyBNYXAoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChTZXQsIChvLCBmbikgPT4gbmV3IFNldChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGlmIChvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygb3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChoYW5kbGVyWzBdLCBoYW5kbGVyWzFdKVxuICAgIH1cbiAgfVxuXG4gIGxldCBoYW5kbGVyID0gbnVsbFxuXG4gIHJldHVybiBvcHRzLnByb3RvID8gY2xvbmVQcm90byA6IGNsb25lXG5cbiAgZnVuY3Rpb24gY2xvbmVBcnJheSAoYSwgZm4pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSlcbiAgICBjb25zdCBhMiA9IG5ldyBBcnJheShrZXlzLmxlbmd0aClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBrZXlzW2ldXG4gICAgICBjb25zdCBjdXIgPSBhW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIGEyW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgYTJba10gPSBoYW5kbGVyKGN1ciwgZm4pXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjdXIpKSB7XG4gICAgICAgIGEyW2tdID0gY29weUJ1ZmZlcihjdXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhMltrXSA9IGZuKGN1cilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGEyXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZSAobykge1xuICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcgfHwgbyA9PT0gbnVsbCkgcmV0dXJuIG9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvKSkgcmV0dXJuIGNsb25lQXJyYXkobywgY2xvbmUpXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmUpXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspID09PSBmYWxzZSkgY29udGludWVcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZSlcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8yW2tdID0gY2xvbmUoY3VyKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbzJcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb25lUHJvdG8gKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lUHJvdG8pXG4gICAgaWYgKG8uY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KG8uY29uc3RydWN0b3IpKSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXIobywgY2xvbmVQcm90bylcbiAgICB9XG4gICAgY29uc3QgbzIgPSB7fVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBjb25zdCBjdXIgPSBvW2tdXG4gICAgICBpZiAodHlwZW9mIGN1ciAhPT0gJ29iamVjdCcgfHwgY3VyID09PSBudWxsKSB7XG4gICAgICAgIG8yW2tdID0gY3VyXG4gICAgICB9IGVsc2UgaWYgKGN1ci5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIChoYW5kbGVyID0gY29uc3RydWN0b3JIYW5kbGVycy5nZXQoY3VyLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgICAgbzJba10gPSBoYW5kbGVyKGN1ciwgY2xvbmVQcm90bylcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGN1cikpIHtcbiAgICAgICAgbzJba10gPSBjb3B5QnVmZmVyKGN1cilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG8yW2tdID0gY2xvbmVQcm90byhjdXIpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvMlxuICB9XG59XG5cbmZ1bmN0aW9uIHJmZGNDaXJjbGVzIChvcHRzKSB7XG4gIGNvbnN0IHJlZnMgPSBbXVxuICBjb25zdCByZWZzTmV3ID0gW11cblxuICBjb25zdCBjb25zdHJ1Y3RvckhhbmRsZXJzID0gbmV3IE1hcCgpXG4gIGNvbnN0cnVjdG9ySGFuZGxlcnMuc2V0KERhdGUsIChvKSA9PiBuZXcgRGF0ZShvKSlcbiAgY29uc3RydWN0b3JIYW5kbGVycy5zZXQoTWFwLCAobywgZm4pID0+IG5ldyBNYXAoY2xvbmVBcnJheShBcnJheS5mcm9tKG8pLCBmbikpKVxuICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChTZXQsIChvLCBmbikgPT4gbmV3IFNldChjbG9uZUFycmF5KEFycmF5LmZyb20obyksIGZuKSkpXG4gIGlmIChvcHRzLmNvbnN0cnVjdG9ySGFuZGxlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygb3B0cy5jb25zdHJ1Y3RvckhhbmRsZXJzKSB7XG4gICAgICBjb25zdHJ1Y3RvckhhbmRsZXJzLnNldChoYW5kbGVyWzBdLCBoYW5kbGVyWzFdKVxuICAgIH1cbiAgfVxuXG4gIGxldCBoYW5kbGVyID0gbnVsbFxuICByZXR1cm4gb3B0cy5wcm90byA/IGNsb25lUHJvdG8gOiBjbG9uZVxuXG4gIGZ1bmN0aW9uIGNsb25lQXJyYXkgKGEsIGZuKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpXG4gICAgY29uc3QgYTIgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0ga2V5c1tpXVxuICAgICAgY29uc3QgY3VyID0gYVtrXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBhMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIGEyW2tdID0gaGFuZGxlcihjdXIsIGZuKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBhMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSByZWZzLmluZGV4T2YoY3VyKVxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgYTJba10gPSByZWZzTmV3W2luZGV4XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGEyW2tdID0gZm4oY3VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhMlxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmUgKG8pIHtcbiAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnIHx8IG8gPT09IG51bGwpIHJldHVybiBvXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHJldHVybiBjbG9uZUFycmF5KG8sIGNsb25lKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lKVxuICAgIH1cbiAgICBjb25zdCBvMiA9IHt9XG4gICAgcmVmcy5wdXNoKG8pXG4gICAgcmVmc05ldy5wdXNoKG8yKVxuICAgIGZvciAoY29uc3QgayBpbiBvKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobywgaykgPT09IGZhbHNlKSBjb250aW51ZVxuICAgICAgY29uc3QgY3VyID0gb1trXVxuICAgICAgaWYgKHR5cGVvZiBjdXIgIT09ICdvYmplY3QnIHx8IGN1ciA9PT0gbnVsbCkge1xuICAgICAgICBvMltrXSA9IGN1clxuICAgICAgfSBlbHNlIGlmIChjdXIuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiAoaGFuZGxlciA9IGNvbnN0cnVjdG9ySGFuZGxlcnMuZ2V0KGN1ci5jb25zdHJ1Y3RvcikpKSB7XG4gICAgICAgIG8yW2tdID0gaGFuZGxlcihjdXIsIGNsb25lKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaSA9IHJlZnMuaW5kZXhPZihjdXIpXG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgIG8yW2tdID0gcmVmc05ld1tpXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8yW2tdID0gY2xvbmUoY3VyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlZnMucG9wKClcbiAgICByZWZzTmV3LnBvcCgpXG4gICAgcmV0dXJuIG8yXG4gIH1cblxuICBmdW5jdGlvbiBjbG9uZVByb3RvIChvKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JyB8fCBvID09PSBudWxsKSByZXR1cm4gb1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pKSByZXR1cm4gY2xvbmVBcnJheShvLCBjbG9uZVByb3RvKVxuICAgIGlmIChvLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChvLmNvbnN0cnVjdG9yKSkpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKG8sIGNsb25lUHJvdG8pXG4gICAgfVxuICAgIGNvbnN0IG8yID0ge31cbiAgICByZWZzLnB1c2gobylcbiAgICByZWZzTmV3LnB1c2gobzIpXG4gICAgZm9yIChjb25zdCBrIGluIG8pIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9ba11cbiAgICAgIGlmICh0eXBlb2YgY3VyICE9PSAnb2JqZWN0JyB8fCBjdXIgPT09IG51bGwpIHtcbiAgICAgICAgbzJba10gPSBjdXJcbiAgICAgIH0gZWxzZSBpZiAoY3VyLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgKGhhbmRsZXIgPSBjb25zdHJ1Y3RvckhhbmRsZXJzLmdldChjdXIuY29uc3RydWN0b3IpKSkge1xuICAgICAgICBvMltrXSA9IGhhbmRsZXIoY3VyLCBjbG9uZVByb3RvKVxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY3VyKSkge1xuICAgICAgICBvMltrXSA9IGNvcHlCdWZmZXIoY3VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaSA9IHJlZnMuaW5kZXhPZihjdXIpXG4gICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgIG8yW2tdID0gcmVmc05ld1tpXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8yW2tdID0gY2xvbmVQcm90byhjdXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmVmcy5wb3AoKVxuICAgIHJlZnNOZXcucG9wKClcbiAgICByZXR1cm4gbzJcbiAgfVxufVxuIiwiaW1wb3J0IGVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWxcIlxyXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCJcclxuaW1wb3J0IHJmZGMgZnJvbSBcInJmZGNcIlxyXG5pbXBvcnQgdHlwZSB7IEpTT05WYWx1ZSB9IGZyb20gXCIuL2pzb25cIlxyXG5cclxuY29uc3QgY2xvbmUgPSByZmRjKHsgcHJvdG86IHRydWUgfSlcclxuXHJcbi8qKlxyXG4gKiBEZWVwIGVxdWFsaXR5IGNoZWNrIGZvciBKU09OVmFsdWVzLlxyXG4gKiBVc2VkIGZvciBhZGRUb1NldCAvIGRlbGV0ZUZyb21TZXQgb3BlcmF0aW9ucy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogSlNPTlZhbHVlLCBiOiBKU09OVmFsdWUpOiBib29sZWFuIHtcclxuICByZXR1cm4gZXF1YWwoYSwgYilcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRCB1c2luZyBuYW5vaWQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJRCgpOiBzdHJpbmcge1xyXG4gIHJldHVybiBuYW5vaWQoKVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gb2JqZWN0ICh0eXBlb2YgPT09IFwib2JqZWN0XCIgJiYgIT09IG51bGwpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcclxuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWVwIGNsb25lcyBhIEpTT04tc2VyaWFsaXphYmxlIHZhbHVlLlxyXG4gKiBPcHRpbWl6ZWQ6IHByaW1pdGl2ZXMgYXJlIHJldHVybmVkIGFzLWlzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZTxUPih2YWx1ZTogVCk6IFQge1xyXG4gIC8vIFByaW1pdGl2ZXMgZG9uJ3QgbmVlZCBjbG9uaW5nXHJcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG4gIHJldHVybiBjbG9uZSh2YWx1ZSlcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBsYXp5IG1lbW9pemVkIGdldHRlci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsYXp5PFQ+KGZuOiAoKSA9PiBUKTogKCkgPT4gVCB7XHJcbiAgbGV0IGNvbXB1dGVkID0gZmFsc2VcclxuICBsZXQgdmFsdWU6IFRcclxuICByZXR1cm4gKCkgPT4ge1xyXG4gICAgaWYgKCFjb21wdXRlZCkge1xyXG4gICAgICB2YWx1ZSA9IGZuKClcclxuICAgICAgY29tcHV0ZWQgPSB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBub24tbmVnYXRpdmUgaW50ZWdlciBhcnJheSBpbmRleC5cclxuICogUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBpZiB2YWxpZCwgb3IgbnVsbCBpZiBpbnZhbGlkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJyYXlJbmRleChrZXk6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xyXG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KVxyXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDwgMCkge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcbiAgcmV0dXJuIG5cclxufVxyXG4iLCIvKipcclxuICogRWFnZXIgb3AgZ2VuZXJhdGlvbiAtIG9wcyBhcmUgcHVzaGVkIGltbWVkaWF0ZWx5IHdoZW4gbXV0YXRpb25zIGhhcHBlbi5cclxuICpcclxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIHB1c2hPcCBmdW5jdGlvbiB0aGF0IHJlY29yZHMgb3BlcmF0aW9ucyBhdCBtdXRhdGlvbiB0aW1lLFxyXG4gKiByYXRoZXIgdGhhbiBkaWZmaW5nIGF0IGZpbmFsaXphdGlvbiB0aW1lLlxyXG4gKlxyXG4gKiBXaGVuIGEgZHJhZnQgZXhpc3RzIGF0IG11bHRpcGxlIHBvc2l0aW9ucyAoYWxpYXNpbmcpLCBvcHMgYXJlIGVtaXR0ZWQgZm9yIEFMTCBwb3NpdGlvbnNcclxuICogdG8gZW5zdXJlIGNvbnNpc3RlbmN5IHdoZW4gYXBwbGllZC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL2Vycm9yXCJcclxuaW1wb3J0IHR5cGUgeyBPcCwgUHJveHlEcmFmdCB9IGZyb20gXCIuL2ludGVyZmFjZVwiXHJcbmltcG9ydCB7IGdldEFsbFBhdGhzRm9yRHJhZnQgfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG4vKipcclxuICogUHVzaCBhbiBvcGVyYXRpb24gdG8gdGhlIG9wcyBsb2cuXHJcbiAqIFZhbHVlcyBzaG91bGQgYWxyZWFkeSBiZSBjbG9uZWQgYnkgdGhlIGNhbGxlciB0byBhdm9pZCBhbGlhc2luZyBpc3N1ZXMuXHJcbiAqXHJcbiAqIFdoZW4gdGhlIHRhcmdldCBkcmFmdCBleGlzdHMgYXQgbXVsdGlwbGUgcG9zaXRpb25zIChkdWUgdG8gYWxpYXNpbmcpLFxyXG4gKiB0aGlzIGZ1bmN0aW9uIGVtaXRzIG9wcyBmb3IgYWxsIHBvc2l0aW9ucyB0byBtYWludGFpbiBjb25zaXN0ZW5jeS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwdXNoT3AocHJveHlEcmFmdDogUHJveHlEcmFmdCwgb3A6IE9wKTogdm9pZCB7XHJcbiAgY29uc3Qgcm9vdERyYWZ0ID0gcHJveHlEcmFmdC5maW5hbGl0aWVzLnJvb3REcmFmdFxyXG4gIGlmICghcm9vdERyYWZ0KSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKFwicm9vdERyYWZ0IGlzIG5vdCBzZXQgLSBjYW5ub3QgZW1pdCBvcFwiKVxyXG4gIH1cclxuXHJcbiAgLy8gRmFzdCBwYXRoOiBubyBhbGlhc2luZywganVzdCBlbWl0IHRoZSBzaW5nbGUgb3BcclxuICBpZiAocHJveHlEcmFmdC5hbGlhc0NvdW50IDw9IDEpIHtcclxuICAgIHByb3h5RHJhZnQuZmluYWxpdGllcy5vcHMucHVzaChvcClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgLy8gU2xvdyBwYXRoOiBkcmFmdCBleGlzdHMgYXQgbXVsdGlwbGUgcG9zaXRpb25zLCBmaW5kIGFsbCBwYXRoc1xyXG4gIGNvbnN0IGFsbFBhdGhzID0gZ2V0QWxsUGF0aHNGb3JEcmFmdChyb290RHJhZnQsIHByb3h5RHJhZnQpXHJcblxyXG4gIC8vIEVtaXQgdGhlIG9wIGZvciBlYWNoIHBhdGggd2hlcmUgdGhpcyBkcmFmdCBleGlzdHNcclxuICBmb3IgKGNvbnN0IHBhdGggb2YgYWxsUGF0aHMpIHtcclxuICAgIGNvbnN0IGFkanVzdGVkT3AgPSB7IC4uLm9wLCBwYXRoIH1cclxuICAgIHByb3h5RHJhZnQuZmluYWxpdGllcy5vcHMucHVzaChhZGp1c3RlZE9wKVxyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogUHJveHkgZHJhZnQgaW1wbGVtZW50YXRpb24uXHJcbiAqIEFkYXB0ZWQgZnJvbSBtdXRhdGl2ZSAtIHJlbW92ZWQgTWFwL1NldC91bnNhZmUvbWFyayBzdXBwb3J0LlxyXG4gKiBNb2RpZmllZCB0byB1c2UgZWFnZXIgb3AgbG9nZ2luZyAtIG9wcyBhcmUgcHVzaGVkIGltbWVkaWF0ZWx5IHdoZW4gbXV0YXRpb25zIGhhcHBlbi5cclxuICovXHJcblxyXG5pbXBvcnQgeyBwYXJzZUFycmF5SW5kZXggfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBQUk9YWV9EUkFGVCB9IGZyb20gXCIuL2NvbnN0YW50XCJcclxuaW1wb3J0IHsgRHJhZnRUeXBlLCB0eXBlIEZpbmFsaXRpZXMsIHR5cGUgSlNPTlZhbHVlLCB0eXBlIE9wLCB0eXBlIFByb3h5RHJhZnQgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIlxyXG5pbXBvcnQgeyBwdXNoT3AgfSBmcm9tIFwiLi9wdXNoT3BcIlxyXG5pbXBvcnQge1xyXG4gIGRlZXBDbG9uZSxcclxuICBlbnN1cmVTaGFsbG93Q29weSxcclxuICBnZXQsXHJcbiAgZ2V0RGVzY3JpcHRvcixcclxuICBnZXRQYXRoT3JUaHJvdyxcclxuICBnZXRQcm94eURyYWZ0LFxyXG4gIGdldFR5cGUsXHJcbiAgZ2V0VmFsdWUsXHJcbiAgaGFuZGxlVmFsdWUsXHJcbiAgaGFzLFxyXG4gIGlzRHJhZnQsXHJcbiAgaXNEcmFmdGFibGUsXHJcbiAgaXNFcXVhbCxcclxuICBsYXRlc3QsXHJcbiAgbWFya0NoYW5nZWQsXHJcbiAgcGVlayxcclxuICByZXZva2VQcm94eSxcclxuICBzZXQsXHJcbn0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLy8gTm90ZTogZ2V0VmFsdWUgaXMgdXNlZCBpbiBmaW5hbGl6ZURyYWZ0LCBkZWVwQ2xvbmUgdXNlcyBpdCBpbnRlcm5hbGx5IGZvciBkcmFmdHNcclxuXHJcbi8qKlxyXG4gKiBJbmNyZW1lbnQgYWxpYXNDb3VudCBmb3IgYSBkcmFmdCAoaWYgdGhlIHZhbHVlIGlzIGEgZHJhZnQpLlxyXG4gKi9cclxuZnVuY3Rpb24gaW5jQWxpYXNDb3VudCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gIGNvbnN0IGRyYWZ0ID0gZ2V0UHJveHlEcmFmdCh2YWx1ZSlcclxuICBpZiAoZHJhZnQpIGRyYWZ0LmFsaWFzQ291bnQrK1xyXG59XHJcblxyXG4vKipcclxuICogRGVjcmVtZW50IGFsaWFzQ291bnQgZm9yIGEgZHJhZnQgKGlmIHRoZSB2YWx1ZSBpcyBhIGRyYWZ0KS5cclxuICovXHJcbmZ1bmN0aW9uIGRlY0FsaWFzQ291bnQodmFsdWU6IHVua25vd24pOiB2b2lkIHtcclxuICBjb25zdCBkcmFmdCA9IGdldFByb3h5RHJhZnQodmFsdWUpXHJcbiAgaWYgKGRyYWZ0KSBkcmFmdC5hbGlhc0NvdW50LS1cclxufVxyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhbiBhcnJheSBpbmRleCBsaWtlIG5hdGl2ZSBhcnJheSBtZXRob2RzIGRvLlxyXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIGluZGljZXMgYW5kIGNsYW1wcyB0byBbMCwgbGVuXS5cclxuICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IHRvIG5vcm1hbGl6ZSAoY2FuIGJlIG5lZ2F0aXZlIG9yIHVuZGVmaW5lZClcclxuICogQHBhcmFtIGxlbiAtIFRoZSBhcnJheSBsZW5ndGhcclxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFZhbHVlIHRvIHVzZSBpZiBpbmRleCBpcyB1bmRlZmluZWQgKHR5cGljYWxseSAwIG9yIGxlbilcclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4KGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsIGxlbjogbnVtYmVyLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWVcclxuICByZXR1cm4gaW5kZXggPCAwID8gTWF0aC5tYXgobGVuICsgaW5kZXgsIDApIDogTWF0aC5taW4oaW5kZXgsIGxlbilcclxufVxyXG5cclxuLyoqXHJcbiAqIEFycmF5IG1ldGhvZHMgdGhhdCBtdXRhdGUgdGhlIGFycmF5IGFuZCBuZWVkIHRvIGJlIGludGVyY2VwdGVkIGZvciBlYWdlciBvcCBsb2dnaW5nLlxyXG4gKi9cclxuY29uc3QgTVVUQVRJTkdfQVJSQVlfTUVUSE9EUyA9IG5ldyBTZXQoW1xyXG4gIFwicHVzaFwiLFxyXG4gIFwicG9wXCIsXHJcbiAgXCJzaGlmdFwiLFxyXG4gIFwidW5zaGlmdFwiLFxyXG4gIFwic3BsaWNlXCIsXHJcbiAgXCJzb3J0XCIsXHJcbiAgXCJyZXZlcnNlXCIsXHJcbiAgXCJmaWxsXCIsXHJcbiAgXCJjb3B5V2l0aGluXCIsXHJcbl0pXHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgd3JhcHBlZCBhcnJheSBtZXRob2QgdGhhdCBsb2dzIG9wcyBlYWdlcmx5LlxyXG4gKiBAcGFyYW0gcHJveHlEcmFmdCAtIFRoZSBQcm94eURyYWZ0IGZvciB0aGUgYXJyYXkgKHVzZWQgZm9yIG9wcyBhbmQgc3RhdGUpXHJcbiAqIEBwYXJhbSBwcm94eVJlZiAtIFRoZSBhY3R1YWwgcHJveHkgKHVzZWQgdG8gYWNjZXNzIGVsZW1lbnRzIGFzIGRyYWZ0cylcclxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyB3cmFwcGVkXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVBcnJheU1ldGhvZFdyYXBwZXIoXHJcbiAgcHJveHlEcmFmdDogUHJveHlEcmFmdCxcclxuICBwcm94eVJlZjogdW5rbm93bixcclxuICBtZXRob2Q6IHN0cmluZ1xyXG4pOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IHVua25vd25bXSwgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XHJcbiAgICBlbnN1cmVTaGFsbG93Q29weShwcm94eURyYWZ0KVxyXG4gICAgbWFya0NoYW5nZWQocHJveHlEcmFmdClcclxuXHJcbiAgICBjb25zdCBhcnIgPSBwcm94eURyYWZ0LmNvcHkgYXMgdW5rbm93bltdXHJcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IGFyci5sZW5ndGhcclxuICAgIGNvbnN0IHByb3h5ID0gcHJveHlSZWYgYXMgdW5rbm93bltdXHJcblxyXG4gICAgc3dpdGNoIChtZXRob2QpIHtcclxuICAgICAgY2FzZSBcInB1c2hcIjoge1xyXG4gICAgICAgIC8vIHB1c2goaXRlbXMuLi4pIC0+IHNwbGljZSBhdCBlbmRcclxuICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdHMgYmVpbmcgaW5zZXJ0ZWRcclxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICBpbmNBbGlhc0NvdW50KGFyZylcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3RvcmUgcmF3IHZhbHVlcyBpbiBhcnJheSAocHJlc2VydmluZyBhbGlhc2luZyBpbiB0aGUgZHJhZnQpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXJyLnB1c2goLi4uYXJncylcclxuICAgICAgICAvLyBDbG9uZSBmb3IgdGhlIG9wIChjYXB0dXJlIHZhbHVlIGF0IHRoaXMgbW9tZW50KVxyXG4gICAgICAgIHB1c2hPcChwcm94eURyYWZ0LCB7XHJcbiAgICAgICAgICBraW5kOiBcInNwbGljZVwiLFxyXG4gICAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3cocHJveHlEcmFmdCksXHJcbiAgICAgICAgICBpbmRleDogb3JpZ2luYWxMZW5ndGgsXHJcbiAgICAgICAgICBkZWxldGVDb3VudDogMCxcclxuICAgICAgICAgIGluc2VydHM6IGFyZ3MubWFwKGRlZXBDbG9uZSkgYXMgSlNPTlZhbHVlW10sXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJwb3BcIjoge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIGFyci5wb3AoKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgdGhyb3VnaCB0aGUgcHJveHkgdG8gZW5zdXJlIGl0J3MgYSBkcmFmdCBpZiBkcmFmdGFibGVcclxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHByb3h5W29yaWdpbmFsTGVuZ3RoIC0gMV1cclxuICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdCBiZWluZyByZW1vdmVkXHJcbiAgICAgICAgZGVjQWxpYXNDb3VudChhcnJbb3JpZ2luYWxMZW5ndGggLSAxXSlcclxuICAgICAgICAvLyBOb3cgcGVyZm9ybSB0aGUgYWN0dWFsIG11dGF0aW9uXHJcbiAgICAgICAgYXJyLnBvcCgpXHJcbiAgICAgICAgcHVzaE9wKHByb3h5RHJhZnQsIHtcclxuICAgICAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXHJcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyhwcm94eURyYWZ0KSxcclxuICAgICAgICAgIGluZGV4OiBvcmlnaW5hbExlbmd0aCAtIDEsXHJcbiAgICAgICAgICBkZWxldGVDb3VudDogMSxcclxuICAgICAgICAgIGluc2VydHM6IFtdLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJzaGlmdFwiOiB7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gYXJyLnNoaWZ0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IHRocm91Z2ggdGhlIHByb3h5IHRvIGVuc3VyZSBpdCdzIGEgZHJhZnQgaWYgZHJhZnRhYmxlXHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBwcm94eVswXVxyXG4gICAgICAgIC8vIFRyYWNrIGFsaWFzQ291bnQgZm9yIGRyYWZ0IGJlaW5nIHJlbW92ZWRcclxuICAgICAgICBkZWNBbGlhc0NvdW50KGFyclswXSlcclxuICAgICAgICAvLyBOb3cgcGVyZm9ybSB0aGUgYWN0dWFsIG11dGF0aW9uXHJcbiAgICAgICAgYXJyLnNoaWZ0KClcclxuICAgICAgICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAgICAgICAga2luZDogXCJzcGxpY2VcIixcclxuICAgICAgICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgICBkZWxldGVDb3VudDogMSxcclxuICAgICAgICAgIGluc2VydHM6IFtdLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJ1bnNoaWZ0XCI6IHtcclxuICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdHMgYmVpbmcgaW5zZXJ0ZWRcclxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XHJcbiAgICAgICAgICBpbmNBbGlhc0NvdW50KGFyZylcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3RvcmUgcmF3IHZhbHVlcyBpbiBhcnJheSAocHJlc2VydmluZyBhbGlhc2luZyBpbiB0aGUgZHJhZnQpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXJyLnVuc2hpZnQoLi4uYXJncylcclxuICAgICAgICAvLyBDbG9uZSBmb3IgdGhlIG9wIChjYXB0dXJlIHZhbHVlIGF0IHRoaXMgbW9tZW50KVxyXG4gICAgICAgIHB1c2hPcChwcm94eURyYWZ0LCB7XHJcbiAgICAgICAgICBraW5kOiBcInNwbGljZVwiLFxyXG4gICAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3cocHJveHlEcmFmdCksXHJcbiAgICAgICAgICBpbmRleDogMCxcclxuICAgICAgICAgIGRlbGV0ZUNvdW50OiAwLFxyXG4gICAgICAgICAgaW5zZXJ0czogYXJncy5tYXAoZGVlcENsb25lKSBhcyBKU09OVmFsdWVbXSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBcInNwbGljZVwiOiB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhcmdzWzBdIGFzIG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUNvdW50QXJnID0gYXJnc1sxXSBhcyBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICAgICBjb25zdCBpbnNlcnRzID0gYXJncy5zbGljZSgyKVxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpemUgc3RhcnQgaW5kZXggdG8gZ2V0IGVsZW1lbnRzIHRocm91Z2ggcHJveHlcclxuICAgICAgICBjb25zdCBpbmRleCA9XHJcbiAgICAgICAgICBzdGFydCA9PT0gdW5kZWZpbmVkID8gMCA6IHN0YXJ0IDwgMCA/IE1hdGgubWF4KG9yaWdpbmFsTGVuZ3RoICsgc3RhcnQsIDApIDogc3RhcnRcclxuICAgICAgICBjb25zdCBkZWxldGVDb3VudCA9IGRlbGV0ZUNvdW50QXJnID8/IG9yaWdpbmFsTGVuZ3RoIC0gaW5kZXhcclxuXHJcbiAgICAgICAgLy8gR2V0IGVsZW1lbnRzIHRocm91Z2ggcHJveHkgdG8gZW5zdXJlIHRoZXkncmUgZHJhZnRzIGlmIGRyYWZ0YWJsZVxyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlczogdW5rbm93bltdID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGV0ZUNvdW50ICYmIGluZGV4ICsgaSA8IG9yaWdpbmFsTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHJldHVyblZhbHVlcy5wdXNoKHByb3h5W2luZGV4ICsgaV0pXHJcbiAgICAgICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGZvciBkcmFmdHMgYmVpbmcgcmVtb3ZlZFxyXG4gICAgICAgICAgZGVjQWxpYXNDb3VudChhcnJbaW5kZXggKyBpXSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYWNrIGFsaWFzQ291bnQgZm9yIGRyYWZ0cyBiZWluZyBpbnNlcnRlZFxyXG4gICAgICAgIGZvciAoY29uc3QgaW5zZXJ0IG9mIGluc2VydHMpIHtcclxuICAgICAgICAgIGluY0FsaWFzQ291bnQoaW5zZXJ0KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTdG9yZSByYXcgdmFsdWVzIGluIGFycmF5IChwcmVzZXJ2aW5nIGFsaWFzaW5nIGluIHRoZSBkcmFmdClcclxuICAgICAgICA7KGFyci5zcGxpY2UgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bltdKSguLi5hcmdzKVxyXG5cclxuICAgICAgICAvLyBDbG9uZSBmb3IgdGhlIG9wIChjYXB0dXJlIHZhbHVlIGF0IHRoaXMgbW9tZW50KVxyXG4gICAgICAgIHB1c2hPcChwcm94eURyYWZ0LCB7XHJcbiAgICAgICAgICBraW5kOiBcInNwbGljZVwiLFxyXG4gICAgICAgICAgcGF0aDogZ2V0UGF0aE9yVGhyb3cocHJveHlEcmFmdCksXHJcbiAgICAgICAgICBpbmRleDogc3RhcnQgPz8gMCxcclxuICAgICAgICAgIGRlbGV0ZUNvdW50OiBkZWxldGVDb3VudEFyZyA/PyBvcmlnaW5hbExlbmd0aCxcclxuICAgICAgICAgIGluc2VydHM6IGluc2VydHMubWFwKGRlZXBDbG9uZSkgYXMgSlNPTlZhbHVlW10sXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVzXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJmaWxsXCI6IHtcclxuICAgICAgICBjb25zdCBmaWxsVmFsdWUgPSBhcmdzWzBdXHJcbiAgICAgICAgY29uc3Qgc3RhcnRBcmcgPSBhcmdzWzFdIGFzIG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICAgICAgIGNvbnN0IGVuZEFyZyA9IGFyZ3NbMl0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9yaWdpbmFsTGVuZ3RoXHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBub3JtYWxpemVJbmRleChzdGFydEFyZywgbGVuLCAwKVxyXG4gICAgICAgIGNvbnN0IGVuZCA9IG5vcm1hbGl6ZUluZGV4KGVuZEFyZywgbGVuLCBsZW4pXHJcblxyXG4gICAgICAgIC8vIFVzZSBwcm94eSBzcGxpY2UgdG8gcmVwbGFjZSB0aGUgcmFuZ2UgKGhhbmRsZXMgYWxpYXNDb3VudCBhbmQgZ2VuZXJhdGVzIHNwbGljZSBvcClcclxuICAgICAgICBjb25zdCBmaWxsQ291bnQgPSBlbmQgLSBzdGFydFxyXG4gICAgICAgIGlmIChmaWxsQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWxsVmFsdWVzID0gQXJyYXkoZmlsbENvdW50KS5maWxsKGZpbGxWYWx1ZSlcclxuICAgICAgICAgIHByb3h5LnNwbGljZShzdGFydCwgZmlsbENvdW50LCAuLi5maWxsVmFsdWVzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3h5XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJzb3J0XCI6IHtcclxuICAgICAgICBjb25zdCBjb21wYXJlRm4gPSBhcmdzWzBdIGFzICgoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vIFNvcnQgYSBjb3B5IHRvIGdldCB0aGUgc29ydGVkIG9yZGVyLCB0aGVuIHVzZSBwcm94eSBzcGxpY2VcclxuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uYXJyXS5zb3J0KGNvbXBhcmVGbilcclxuICAgICAgICBpZiAob3JpZ2luYWxMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwcm94eS5zcGxpY2UoMCwgb3JpZ2luYWxMZW5ndGgsIC4uLnNvcnRlZClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3h5XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgXCJyZXZlcnNlXCI6IHtcclxuICAgICAgICAvLyBSZXZlcnNlIGEgY29weSB0byBnZXQgdGhlIHJldmVyc2VkIG9yZGVyLCB0aGVuIHVzZSBwcm94eSBzcGxpY2VcclxuICAgICAgICBjb25zdCByZXZlcnNlZCA9IFsuLi5hcnJdLnJldmVyc2UoKVxyXG4gICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHByb3h5LnNwbGljZSgwLCBvcmlnaW5hbExlbmd0aCwgLi4ucmV2ZXJzZWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm94eVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFwiY29weVdpdGhpblwiOiB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0QXJnID0gYXJnc1swXSBhcyBudW1iZXJcclxuICAgICAgICBjb25zdCBzdGFydEFyZyA9IGFyZ3NbMV0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkXHJcbiAgICAgICAgY29uc3QgZW5kQXJnID0gYXJnc1syXSBhcyBudW1iZXIgfCB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgY29uc3QgbGVuID0gb3JpZ2luYWxMZW5ndGhcclxuICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBub3JtYWxpemVJbmRleCh0YXJnZXRBcmcsIGxlbiwgMClcclxuICAgICAgICBjb25zdCBzdGFydElkeCA9IG5vcm1hbGl6ZUluZGV4KHN0YXJ0QXJnLCBsZW4sIDApXHJcbiAgICAgICAgY29uc3QgZW5kSWR4ID0gbm9ybWFsaXplSW5kZXgoZW5kQXJnLCBsZW4sIGxlbilcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtYW55IGVsZW1lbnRzIHdpbGwgYmUgY29waWVkXHJcbiAgICAgICAgY29uc3QgY29weUNvdW50ID0gTWF0aC5taW4oZW5kSWR4IC0gc3RhcnRJZHgsIGxlbiAtIHRhcmdldElkeClcclxuXHJcbiAgICAgICAgaWYgKGNvcHlDb3VudCA+IDApIHtcclxuICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGNvcGllZCAoZnJvbSB0aGUgc291cmNlIHJhbmdlKVxyXG4gICAgICAgICAgY29uc3QgZWxlbWVudHNUb0NvcHkgPSBhcnIuc2xpY2Uoc3RhcnRJZHgsIHN0YXJ0SWR4ICsgY29weUNvdW50KVxyXG4gICAgICAgICAgLy8gVXNlIHByb3h5IHNwbGljZSB0byByZXBsYWNlIGp1c3QgdGhlIGFmZmVjdGVkIHJhbmdlXHJcbiAgICAgICAgICBwcm94eS5zcGxpY2UodGFyZ2V0SWR4LCBjb3B5Q291bnQsIC4uLmVsZW1lbnRzVG9Db3B5KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb3h5XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIChhcnIgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duPilbbWV0aG9kXSguLi5hcmdzKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFByb3h5IGhhbmRsZXIgZm9yIGRyYWZ0c1xyXG4gKi9cclxuY29uc3QgcHJveHlIYW5kbGVyOiBQcm94eUhhbmRsZXI8UHJveHlEcmFmdD4gPSB7XHJcbiAgZ2V0KHRhcmdldDogUHJveHlEcmFmdCwga2V5OiBQcm9wZXJ0eUtleSwgcmVjZWl2ZXI6IHVua25vd24pIHtcclxuICAgIC8vIFJldHVybiBjYWNoZWQgZHJhZnQgaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCBjb3B5ID0gdGFyZ2V0LmNvcHk/LltrZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldC5jb3B5XVxyXG4gICAgaWYgKGNvcHkgJiYgdGFyZ2V0LmZpbmFsaXRpZXMuZHJhZnRzQ2FjaGUuaGFzKGNvcHkgYXMgb2JqZWN0KSkge1xyXG4gICAgICByZXR1cm4gY29weVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgUHJveHlEcmFmdCBpdHNlbGYgd2hlbiBhY2Nlc3NpbmcgdGhlIHN5bWJvbFxyXG4gICAgaWYgKGtleSA9PT0gUFJPWFlfRFJBRlQpIHJldHVybiB0YXJnZXRcclxuXHJcbiAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3QodGFyZ2V0KVxyXG5cclxuICAgIC8vIEludGVyY2VwdCBtdXRhdGluZyBhcnJheSBtZXRob2RzIGZvciBlYWdlciBvcCBsb2dnaW5nXHJcbiAgICBpZiAoXHJcbiAgICAgIHRhcmdldC50eXBlID09PSBEcmFmdFR5cGUuQXJyYXkgJiZcclxuICAgICAgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiAmJlxyXG4gICAgICBNVVRBVElOR19BUlJBWV9NRVRIT0RTLmhhcyhrZXkpXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSAoc291cmNlIGFzIHVua25vd25bXSlba2V5IGFzIGtleW9mIHVua25vd25bXV1cclxuICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbE1ldGhvZCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFycmF5TWV0aG9kV3JhcHBlcih0YXJnZXQsIHJlY2VpdmVyLCBrZXkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IC0gY2hlY2sgcHJvdG90eXBlIGNoYWluXHJcbiAgICBpZiAoIWhhcyhzb3VyY2UsIGtleSkpIHtcclxuICAgICAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3Ioc291cmNlLCBrZXkpXHJcbiAgICAgIHJldHVybiBkZXNjID8gKFwidmFsdWVcIiBpbiBkZXNjID8gZGVzYy52YWx1ZSA6IGRlc2MuZ2V0Py5jYWxsKHRhcmdldC5wcm94eSkpIDogdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSAoc291cmNlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV1cclxuXHJcbiAgICAvLyBBbHJlYWR5IGZpbmFsaXplZCBvciBub3QgZHJhZnRhYmxlIC0gcmV0dXJuIGFzLWlzXHJcbiAgICBpZiAodGFyZ2V0LmZpbmFsaXplZCB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHZhbHVlIGlzIHNhbWUgYXMgb3JpZ2luYWwsIGNyZWF0ZSBhIG5lc3RlZCBkcmFmdFxyXG4gICAgaWYgKHZhbHVlID09PSBwZWVrKHRhcmdldC5vcmlnaW5hbCwga2V5KSkge1xyXG4gICAgICBlbnN1cmVTaGFsbG93Q29weSh0YXJnZXQpXHJcbiAgICAgIGNvbnN0IG5lc3RlZEtleSA9IHRhcmdldC50eXBlID09PSBEcmFmdFR5cGUuQXJyYXkgPyBOdW1iZXIoa2V5KSA6IGtleVxyXG4gICAgICA7KHRhcmdldC5jb3B5IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVEcmFmdCh7XHJcbiAgICAgICAgb3JpZ2luYWw6ICh0YXJnZXQub3JpZ2luYWwgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XSBhcyBvYmplY3QsXHJcbiAgICAgICAgcGFyZW50RHJhZnQ6IHRhcmdldCxcclxuICAgICAgICBrZXk6IG5lc3RlZEtleSBhcyBzdHJpbmcgfCBudW1iZXIsXHJcbiAgICAgICAgZmluYWxpdGllczogdGFyZ2V0LmZpbmFsaXRpZXMsXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiAodGFyZ2V0LmNvcHkgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENhY2hlIGRyYWZ0cyB0aGF0IHdlcmUgYXNzaWduZWRcclxuICAgIGlmIChpc0RyYWZ0KHZhbHVlKSkge1xyXG4gICAgICB0YXJnZXQuZmluYWxpdGllcy5kcmFmdHNDYWNoZS5hZGQodmFsdWUgYXMgb2JqZWN0KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZVxyXG4gIH0sXHJcblxyXG4gIHNldCh0YXJnZXQ6IFByb3h5RHJhZnQsIGtleTogUHJvcGVydHlLZXksIHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgc3ltYm9sIHByb3BlcnRpZXMgb24gZHJhZnRzYClcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgYXJyYXlzLCBjb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUga2V5XHJcbiAgICBsZXQgb3BLZXk6IHN0cmluZyB8IG51bWJlciA9IGtleSBhcyBzdHJpbmcgfCBudW1iZXJcclxuICAgIGlmICh0YXJnZXQudHlwZSA9PT0gRHJhZnRUeXBlLkFycmF5KSB7XHJcbiAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICBvcEtleSA9IFwibGVuZ3RoXCJcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBudW1LZXkgPSB0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiID8ga2V5IDogcGFyc2VBcnJheUluZGV4KGtleSBhcyBzdHJpbmcpXHJcbiAgICAgICAgaWYgKG51bUtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHN1cHBvcnRzIHNldHRpbmcgYXJyYXkgaW5kaWNlcyBhbmQgdGhlICdsZW5ndGgnIHByb3BlcnR5LmApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9wS2V5ID0gbnVtS2V5XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBzcGFyc2UgYXJyYXkgY3JlYXRpb25cclxuICAgICAgICBjb25zdCBzb3VyY2UgPSBsYXRlc3QodGFyZ2V0KSBhcyB1bmtub3duW11cclxuICAgICAgICBpZiAobnVtS2V5ID4gc291cmNlLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICBgQ2Fubm90IGNyZWF0ZSBzcGFyc2UgYXJyYXkuIEluZGV4ICR7bnVtS2V5fSBpcyBvdXQgb2YgYm91bmRzIGZvciBhcnJheSBvZiBsZW5ndGggJHtzb3VyY2UubGVuZ3RofS5gXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIHNldHRlciBmcm9tIHByb3RvdHlwZVxyXG4gICAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3IobGF0ZXN0KHRhcmdldCksIGtleSlcclxuICAgIGlmIChkZXNjPy5zZXQpIHtcclxuICAgICAgZGVzYy5zZXQuY2FsbCh0YXJnZXQucHJveHksIHZhbHVlKVxyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSBwZWVrKGxhdGVzdCh0YXJnZXQpLCBrZXkpXHJcbiAgICBjb25zdCBjdXJyZW50UHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQoY3VycmVudClcclxuXHJcbiAgICAvLyBJZiBhc3NpZ25pbmcgb3JpZ2luYWwgZHJhZnRhYmxlIHZhbHVlIGJhY2sgdG8gaXRzIGRyYWZ0LCBqdXN0IG1hcmsgYXMgbm90IGFzc2lnbmVkXHJcbiAgICBpZiAoY3VycmVudFByb3h5RHJhZnQgJiYgaXNFcXVhbChjdXJyZW50UHJveHlEcmFmdC5vcmlnaW5hbCwgdmFsdWUpKSB7XHJcbiAgICAgIDsodGFyZ2V0LmNvcHkgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlXHJcbiAgICAgIHRhcmdldC5hc3NpZ25lZE1hcCA9IHRhcmdldC5hc3NpZ25lZE1hcCA/PyBuZXcgTWFwKClcclxuICAgICAgdGFyZ2V0LmFzc2lnbmVkTWFwLnNldChrZXksIGZhbHNlKVxyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIGNoYW5nZSAtIHNraXBcclxuICAgIGlmIChpc0VxdWFsKHZhbHVlLCBjdXJyZW50KSAmJiAodmFsdWUgIT09IHVuZGVmaW5lZCB8fCBoYXModGFyZ2V0Lm9yaWdpbmFsLCBrZXkpKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZVNoYWxsb3dDb3B5KHRhcmdldClcclxuICAgIG1hcmtDaGFuZ2VkKHRhcmdldClcclxuXHJcbiAgICAvLyBUcmFjayBhc3NpZ25tZW50IChzdGlsbCBuZWVkZWQgZm9yIGZpbmFsaXphdGlvbiB0byBrbm93IHdoYXQgY2hhbmdlZClcclxuICAgIGlmIChcclxuICAgICAgaGFzKHRhcmdldC5vcmlnaW5hbCwga2V5KSAmJlxyXG4gICAgICBpc0VxdWFsKHZhbHVlLCAodGFyZ2V0Lm9yaWdpbmFsIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV0pXHJcbiAgICApIHtcclxuICAgICAgLy8gUmV2ZXJ0aW5nIHRvIG9yaWdpbmFsIHZhbHVlIC0gc3RpbGwgbG9nIHRoZSBvcCBzaW5jZSB3ZSdyZSBkb2luZyBlYWdlciBsb2dnaW5nXHJcbiAgICAgIHRhcmdldC5hc3NpZ25lZE1hcCEuZGVsZXRlKGtleSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRhcmdldC5hc3NpZ25lZE1hcCEuc2V0KGtleSwgdHJ1ZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBUcmFjayBhbGlhc0NvdW50IGFuZCB1cGRhdGUgY29weVxyXG4gICAgY29uc3QgY29weSA9IHRhcmdldC5jb3B5IGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj5cclxuICAgIGRlY0FsaWFzQ291bnQoY29weVtrZXldKVxyXG4gICAgaW5jQWxpYXNDb3VudCh2YWx1ZSlcclxuICAgIGNvcHlba2V5XSA9IHZhbHVlXHJcblxyXG4gICAgLy8gRWFnZXIgb3AgbG9nZ2luZyBmb3Igc2V0IG9wZXJhdGlvbnNcclxuICAgIGlmICh0YXJnZXQudHlwZSA9PT0gRHJhZnRUeXBlLkFycmF5ICYmIG9wS2V5ID09PSBcImxlbmd0aFwiKSB7XHJcbiAgICAgIGNvbnN0IG9sZExlbmd0aCA9ICh0YXJnZXQub3JpZ2luYWwgYXMgdW5rbm93bltdKS5sZW5ndGhcclxuICAgICAgY29uc3QgbmV3TGVuZ3RoID0gdmFsdWUgYXMgbnVtYmVyXHJcbiAgICAgIGlmIChuZXdMZW5ndGggIT09IG9sZExlbmd0aCkge1xyXG4gICAgICAgIC8vIExlbmd0aCBjaGFuZ2UgLSBhbHdheXMgdXNlIHNldCBvcCB0byBjYXB0dXJlIGludGVudFxyXG4gICAgICAgIHB1c2hPcCh0YXJnZXQsIHtcclxuICAgICAgICAgIGtpbmQ6IFwic2V0XCIsXHJcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyh0YXJnZXQpLFxyXG4gICAgICAgICAga2V5OiBcImxlbmd0aFwiLFxyXG4gICAgICAgICAgdmFsdWU6IG5ld0xlbmd0aCxcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZWd1bGFyIHByb3BlcnR5IHNldCAtIHVzZSBvcEtleSAobnVtZXJpYyBmb3IgYXJyYXlzKVxyXG4gICAgICBwdXNoT3AodGFyZ2V0LCB7XHJcbiAgICAgICAga2luZDogXCJzZXRcIixcclxuICAgICAgICBwYXRoOiBnZXRQYXRoT3JUaHJvdyh0YXJnZXQpLFxyXG4gICAgICAgIGtleTogb3BLZXksXHJcbiAgICAgICAgdmFsdWU6IGRlZXBDbG9uZSh2YWx1ZSkgYXMgSlNPTlZhbHVlLFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfSxcclxuXHJcbiAgaGFzKHRhcmdldDogUHJveHlEcmFmdCwga2V5OiBQcm9wZXJ0eUtleSkge1xyXG4gICAgcmV0dXJuIGtleSBpbiBsYXRlc3QodGFyZ2V0KVxyXG4gIH0sXHJcblxyXG4gIG93bktleXModGFyZ2V0OiBQcm94eURyYWZ0KSB7XHJcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKGxhdGVzdCh0YXJnZXQpKVxyXG4gIH0sXHJcblxyXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQ6IFByb3h5RHJhZnQsIGtleTogUHJvcGVydHlLZXkpIHtcclxuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdCh0YXJnZXQpXHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpXHJcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHJldHVybiBkZXNjcmlwdG9yXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgY29uZmlndXJhYmxlOiB0YXJnZXQudHlwZSAhPT0gRHJhZnRUeXBlLkFycmF5IHx8IGtleSAhPT0gXCJsZW5ndGhcIixcclxuICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxyXG4gICAgICB2YWx1ZTogKHNvdXJjZSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtrZXldLFxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGdldFByb3RvdHlwZU9mKHRhcmdldDogUHJveHlEcmFmdCkge1xyXG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0Lm9yaWdpbmFsIGFzIG9iamVjdClcclxuICB9LFxyXG5cclxuICBzZXRQcm90b3R5cGVPZigpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNhbGwgJ3NldFByb3RvdHlwZU9mKCknIG9uIGRyYWZ0c2ApXHJcbiAgfSxcclxuXHJcbiAgZGVmaW5lUHJvcGVydHkoKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjYWxsICdkZWZpbmVQcm9wZXJ0eSgpJyBvbiBkcmFmdHNgKVxyXG4gIH0sXHJcblxyXG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldDogUHJveHlEcmFmdCwga2V5OiBQcm9wZXJ0eUtleSkge1xyXG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGVsZXRlIHN5bWJvbCBwcm9wZXJ0aWVzIGZyb20gZHJhZnRzYClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFyZ2V0LnR5cGUgPT09IERyYWZ0VHlwZS5BcnJheSkge1xyXG4gICAgICAvLyBGb3IgYXJyYXlzLCBkZWxldGluZyBhIHByb3BlcnR5IHNldHMgaXQgdG8gdW5kZWZpbmVkXHJcbiAgICAgIHJldHVybiBwcm94eUhhbmRsZXIuc2V0IS5jYWxsKHRoaXMsIHRhcmdldCwga2V5IGFzIHN0cmluZyB8IHN5bWJvbCwgdW5kZWZpbmVkLCB0YXJnZXQucHJveHkpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzIGFuZCBnZXQgaXRzIGN1cnJlbnQgdmFsdWVcclxuICAgIGNvbnN0IGN1cnJlbnQgPSBwZWVrKGxhdGVzdCh0YXJnZXQpLCBrZXkpXHJcbiAgICBjb25zdCBleGlzdGVkID0gY3VycmVudCAhPT0gdW5kZWZpbmVkIHx8IGtleSBpbiAodGFyZ2V0Lm9yaWdpbmFsIGFzIG9iamVjdClcclxuXHJcbiAgICAvLyBGb3Igb2JqZWN0cywgdHJhY2sgZGVsZXRpb25cclxuICAgIGlmIChleGlzdGVkKSB7XHJcbiAgICAgIGVuc3VyZVNoYWxsb3dDb3B5KHRhcmdldClcclxuICAgICAgbWFya0NoYW5nZWQodGFyZ2V0KVxyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAhLnNldChrZXksIGZhbHNlKVxyXG5cclxuICAgICAgLy8gRWFnZXIgb3AgbG9nZ2luZyBmb3IgZGVsZXRlXHJcbiAgICAgIHB1c2hPcCh0YXJnZXQsIHtcclxuICAgICAgICBraW5kOiBcImRlbGV0ZVwiLFxyXG4gICAgICAgIHBhdGg6IGdldFBhdGhPclRocm93KHRhcmdldCksXHJcbiAgICAgICAga2V5OiBrZXksXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICAvLyBUcmFjayBhbGlhc0NvdW50IGFuZCBkZWxldGUgZnJvbSBjb3B5XHJcbiAgICAgIGNvbnN0IGNvcHkgPSB0YXJnZXQuY29weSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+XHJcbiAgICAgIGRlY0FsaWFzQ291bnQoY29weVtrZXldKVxyXG4gICAgICBkZWxldGUgY29weVtrZXldXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YXJnZXQuYXNzaWduZWRNYXAgPSB0YXJnZXQuYXNzaWduZWRNYXAgPz8gbmV3IE1hcCgpXHJcbiAgICAgIHRhcmdldC5hc3NpZ25lZE1hcC5kZWxldGUoa2V5KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9LFxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgZHJhZnQgcHJveHkgZm9yIGEgdmFsdWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcmFmdDxUIGV4dGVuZHMgb2JqZWN0PihvcHRpb25zOiB7XHJcbiAgb3JpZ2luYWw6IFRcclxuICBwYXJlbnREcmFmdD86IFByb3h5RHJhZnQgfCBudWxsXHJcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyXHJcbiAgZmluYWxpdGllczogRmluYWxpdGllc1xyXG59KTogVCB7XHJcbiAgY29uc3QgeyBvcmlnaW5hbCwgcGFyZW50RHJhZnQsIGtleSwgZmluYWxpdGllcyB9ID0gb3B0aW9uc1xyXG4gIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9yaWdpbmFsKVxyXG5cclxuICBjb25zdCBwcm94eURyYWZ0OiBQcm94eURyYWZ0PFQ+ID0ge1xyXG4gICAgdHlwZSxcclxuICAgIGZpbmFsaXplZDogZmFsc2UsXHJcbiAgICBwYXJlbnQ6IHBhcmVudERyYWZ0ID8/IG51bGwsXHJcbiAgICBvcmlnaW5hbCxcclxuICAgIGNvcHk6IG51bGwsXHJcbiAgICBwcm94eTogbnVsbCxcclxuICAgIGZpbmFsaXRpZXMsXHJcbiAgICBhbGlhc0NvdW50OiAxLFxyXG4gIH1cclxuXHJcbiAgLy8gU2V0IGtleSBpZiBwcm92aWRlZFxyXG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCB8fCBcImtleVwiIGluIG9wdGlvbnMpIHtcclxuICAgIHByb3h5RHJhZnQua2V5ID0ga2V5XHJcbiAgfVxyXG5cclxuICAvLyBDcmVhdGUgcmV2b2NhYmxlIHByb3h5XHJcbiAgY29uc3QgeyBwcm94eSwgcmV2b2tlIH0gPSBQcm94eS5yZXZvY2FibGU8VD4oXHJcbiAgICAodHlwZSA9PT0gRHJhZnRUeXBlLkFycmF5ID8gT2JqZWN0LmFzc2lnbihbXSwgcHJveHlEcmFmdCkgOiBwcm94eURyYWZ0KSBhcyBULFxyXG4gICAgcHJveHlIYW5kbGVyIGFzIFByb3h5SGFuZGxlcjxUPlxyXG4gIClcclxuXHJcbiAgZmluYWxpdGllcy5yZXZva2UucHVzaChyZXZva2UpXHJcbiAgcHJveHlEcmFmdC5wcm94eSA9IHByb3h5XHJcblxyXG4gIC8vIFNldCB1cCBmaW5hbGl6YXRpb24gY2FsbGJhY2sgdG8gdW53cmFwIGNoaWxkIGRyYWZ0cyBpbiBwYXJlbnQgY29weVxyXG4gIGlmIChwYXJlbnREcmFmdCkge1xyXG4gICAgcGFyZW50RHJhZnQuZmluYWxpdGllcy5kcmFmdC5wdXNoKCgpID0+IHtcclxuICAgICAgY29uc3QgY29weSA9IHBhcmVudERyYWZ0LmNvcHlcclxuICAgICAgaWYgKCFjb3B5KSByZXR1cm5cclxuXHJcbiAgICAgIGNvbnN0IGRyYWZ0ID0gZ2V0KGNvcHkgYXMgb2JqZWN0LCBrZXkhKVxyXG4gICAgICBjb25zdCBjaGlsZFByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KGRyYWZ0KVxyXG5cclxuICAgICAgaWYgKGNoaWxkUHJveHlEcmFmdCkge1xyXG4gICAgICAgIC8vIEdldCB0aGUgdXBkYXRlZCB2YWx1ZVxyXG4gICAgICAgIGxldCB1cGRhdGVkVmFsdWUgPSBjaGlsZFByb3h5RHJhZnQub3JpZ2luYWxcclxuICAgICAgICBpZiAoY2hpbGRQcm94eURyYWZ0Lm9wZXJhdGVkKSB7XHJcbiAgICAgICAgICB1cGRhdGVkVmFsdWUgPSBnZXRWYWx1ZShkcmFmdCBhcyBvYmplY3QpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNoaWxkUHJveHlEcmFmdC5maW5hbGl6ZWQgPSB0cnVlXHJcbiAgICAgICAgc2V0KGNvcHkgYXMgb2JqZWN0LCBrZXkhLCB1cGRhdGVkVmFsdWUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcHJveHlcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmFsaXplIGEgZHJhZnQgYW5kIHJldHVybiB0aGUgcmVzdWx0IHdpdGggb3BzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVEcmFmdDxUPihyZXN1bHQ6IFQsIHJldHVybmVkVmFsdWU6IFtUXSB8IFtdKTogW1QsIE9wW11dIHtcclxuICBjb25zdCBwcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdDxUPihyZXN1bHQpXHJcbiAgY29uc3QgaGFzUmV0dXJuZWRWYWx1ZSA9IHJldHVybmVkVmFsdWUubGVuZ3RoID4gMFxyXG5cclxuICAvLyBSdW4gZmluYWxpemF0aW9uIGNhbGxiYWNrcyB0byB1bndyYXAgY2hpbGQgZHJhZnRzXHJcbiAgaWYgKHByb3h5RHJhZnQ/Lm9wZXJhdGVkKSB7XHJcbiAgICB3aGlsZSAocHJveHlEcmFmdC5maW5hbGl0aWVzLmRyYWZ0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmluYWxpemUgPSBwcm94eURyYWZ0LmZpbmFsaXRpZXMuZHJhZnQucG9wKCkhXHJcbiAgICAgIGZpbmFsaXplKClcclxuICAgIH1cclxuICAgIHByb3h5RHJhZnQuZmluYWxpemVkID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgLy8gRGV0ZXJtaW5lIGZpbmFsIHN0YXRlXHJcbiAgY29uc3Qgc3RhdGUgPSBoYXNSZXR1cm5lZFZhbHVlXHJcbiAgICA/IHJldHVybmVkVmFsdWVbMF1cclxuICAgIDogcHJveHlEcmFmdFxyXG4gICAgICA/IHByb3h5RHJhZnQub3BlcmF0ZWRcclxuICAgICAgICA/IChwcm94eURyYWZ0LmNvcHkgYXMgVClcclxuICAgICAgICA6IHByb3h5RHJhZnQub3JpZ2luYWxcclxuICAgICAgOiByZXN1bHRcclxuXHJcbiAgLy8gSGFuZGxlIGFueSByZW1haW5pbmcgbmVzdGVkIGRyYWZ0cyBpbiB0aGUgc3RhdGUgKGUuZy4sIGZyb20gYXNzaWdubWVudHMgbGlrZSBkcmFmdC5hID0gZHJhZnQuYilcclxuICBpZiAocHJveHlEcmFmdCAmJiBzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgIGhhbmRsZVZhbHVlKHN0YXRlLCBwcm94eURyYWZ0LmZpbmFsaXRpZXMuaGFuZGxlZFNldClcclxuICB9XHJcblxyXG4gIC8vIEdldCBvcHMgZnJvbSBmaW5hbGl0aWVzIChlYWdlciBsb2dnaW5nKVxyXG4gIGNvbnN0IG9wcyA9IHByb3h5RHJhZnQ/LmZpbmFsaXRpZXMub3BzID8/IFtdXHJcblxyXG4gIC8vIFJldm9rZSBhbGwgcHJveGllc1xyXG4gIGlmIChwcm94eURyYWZ0KSB7XHJcbiAgICByZXZva2VQcm94eShwcm94eURyYWZ0KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIFtzdGF0ZSBhcyBULCBvcHNdXHJcbn1cclxuIiwiLyoqXHJcbiAqIENyZWF0ZSBhIGRyYWZ0IGZyb20gYSBiYXNlIHN0YXRlLlxyXG4gKiBTaW1wbGlmaWVkIGZyb20gbXV0YXRpdmUgLSByZW1vdmVkIHBhdGNoZXMvZnJlZXplL21hcmsgc3VwcG9ydC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBjcmVhdGVEcmFmdCwgZmluYWxpemVEcmFmdCB9IGZyb20gXCIuL2RyYWZ0XCJcclxuaW1wb3J0IHR5cGUgeyBGaW5hbGl0aWVzLCBPcCB9IGZyb20gXCIuL2ludGVyZmFjZVwiXHJcbmltcG9ydCB7IGdldFByb3h5RHJhZnQsIGlzRHJhZnRhYmxlIH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGRyYWZ0IGFuZCByZXR1cm4gYSBmaW5hbGl6ZSBmdW5jdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0aWZ5PFQgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gIGJhc2VTdGF0ZTogVFxyXG4pOiBbVCwgKHJldHVybmVkVmFsdWU6IFtUXSB8IFtdKSA9PiBbVCwgT3BbXV1dIHtcclxuICBjb25zdCBmaW5hbGl0aWVzOiBGaW5hbGl0aWVzID0ge1xyXG4gICAgZHJhZnQ6IFtdLFxyXG4gICAgcmV2b2tlOiBbXSxcclxuICAgIGhhbmRsZWRTZXQ6IG5ldyBXZWFrU2V0PG9iamVjdD4oKSxcclxuICAgIGRyYWZ0c0NhY2hlOiBuZXcgV2Vha1NldDxvYmplY3Q+KCksXHJcbiAgICBvcHM6IFtdLFxyXG4gICAgcm9vdERyYWZ0OiBudWxsLCAvLyBXaWxsIGJlIHNldCBieSBjcmVhdGVEcmFmdFxyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgc3RhdGUgaXMgZHJhZnRhYmxlXHJcbiAgaWYgKCFpc0RyYWZ0YWJsZShiYXNlU3RhdGUpKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU9wcygpIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLmApXHJcbiAgfVxyXG5cclxuICBjb25zdCBkcmFmdCA9IGNyZWF0ZURyYWZ0KHtcclxuICAgIG9yaWdpbmFsOiBiYXNlU3RhdGUsXHJcbiAgICBwYXJlbnREcmFmdDogbnVsbCxcclxuICAgIGZpbmFsaXRpZXMsXHJcbiAgfSlcclxuXHJcbiAgLy8gU2V0IHRoZSByb290IGRyYWZ0IGZvciBtdWx0aS1wYXRoIGRldGVjdGlvblxyXG4gIGZpbmFsaXRpZXMucm9vdERyYWZ0ID0gZ2V0UHJveHlEcmFmdChkcmFmdClcclxuXHJcbiAgcmV0dXJuIFtcclxuICAgIGRyYWZ0LFxyXG4gICAgKHJldHVybmVkVmFsdWU6IFtUXSB8IFtdID0gW10pID0+IHtcclxuICAgICAgcmV0dXJuIGZpbmFsaXplRHJhZnQoZHJhZnQsIHJldHVybmVkVmFsdWUpXHJcbiAgICB9LFxyXG4gIF1cclxufVxyXG4iLCIvKipcclxuICogY3JlYXRlT3BzIC0gTWFpbiBBUEkgZm9yIGdlbmVyYXRpbmcgb3BlcmF0aW9ucyBmcm9tIG11dGFibGUtc3R5bGUgbXV0YXRpb25zLlxyXG4gKlxyXG4gKiBGb3JrZWQgZnJvbSBtdXRhdGl2ZSAoaHR0cHM6Ly9naXRodWIuY29tL3VuYWRsaWIvbXV0YXRpdmUpXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgY3VycmVudCB9IGZyb20gXCIuL2N1cnJlbnRcIlxyXG5pbXBvcnQgeyBkcmFmdGlmeSB9IGZyb20gXCIuL2RyYWZ0aWZ5XCJcclxuaW1wb3J0IHR5cGUgeyBDcmVhdGVPcHNSZXN1bHQsIERyYWZ0IH0gZnJvbSBcIi4vaW50ZXJmYWNlXCJcclxuaW1wb3J0IHsgZ2V0UHJveHlEcmFmdCwgaXNEcmFmdCwgaXNEcmFmdGFibGUsIGlzRXF1YWwsIHJldm9rZVByb3h5IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBvcGVyYXRpb25zIGZyb20gbXV0YWJsZS1zdHlsZSBtdXRhdGlvbnMuXHJcbiAqXHJcbiAqIEBwYXJhbSBiYXNlIC0gVGhlIGJhc2Ugc3RhdGUgKHdpbGwgbm90IGJlIG11dGF0ZWQpXHJcbiAqIEBwYXJhbSBtdXRhdGUgLSBBIGZ1bmN0aW9uIHRoYXQgbXV0YXRlcyB0aGUgZHJhZnRcclxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5leHQgc3RhdGUgYW5kIHRoZSBvcGVyYXRpb25zIHBlcmZvcm1lZFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjb25zdCBzdGF0ZSA9IHsgbGlzdDogW3sgdGV4dDogJ0xlYXJuJywgZG9uZTogZmFsc2UgfV0gfTtcclxuICpcclxuICogY29uc3QgeyBuZXh0U3RhdGUsIG9wcyB9ID0gY3JlYXRlT3BzKHN0YXRlLCAoZHJhZnQpID0+IHtcclxuICogICBkcmFmdC5saXN0WzBdLmRvbmUgPSB0cnVlO1xyXG4gKiAgIGRyYWZ0Lmxpc3QucHVzaCh7IHRleHQ6ICdQcmFjdGljZScsIGRvbmU6IGZhbHNlIH0pO1xyXG4gKiB9KTtcclxuICpcclxuICogLy8gb3BzIGNvbnRhaW5zIHRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZSBwZXJmb3JtZWQ6XHJcbiAqIC8vIFtcclxuICogLy8gICB7IGtpbmQ6ICdzZXQnLCBwYXRoOiBbJ2xpc3QnLCAwXSwga2V5OiAnZG9uZScsIHZhbHVlOiB0cnVlIH0sXHJcbiAqIC8vICAgeyBraW5kOiAnc3BsaWNlJywgcGF0aDogWydsaXN0J10sIGluZGV4OiAxLCBkZWxldGVDb3VudDogMCwgaW5zZXJ0czogW3sgdGV4dDogJ1ByYWN0aWNlJywgZG9uZTogZmFsc2UgfV0gfVxyXG4gKiAvLyBdXHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wczxUIGV4dGVuZHMgb2JqZWN0PihcclxuICBiYXNlOiBULFxyXG4gIG11dGF0ZTogKGRyYWZ0OiBEcmFmdDxUPikgPT4gdm9pZFxyXG4pOiBDcmVhdGVPcHNSZXN1bHQ8VD4ge1xyXG4gIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGJhc2UgaXMgYWxyZWFkeSBhIGRyYWZ0XHJcbiAgY29uc3Qgc3RhdGUgPSBpc0RyYWZ0KGJhc2UpID8gY3VycmVudChiYXNlIGFzIERyYWZ0PFQ+KSA6IGJhc2VcclxuXHJcbiAgLy8gVmFsaWRhdGUgdGhhdCBzdGF0ZSBpcyBkcmFmdGFibGVcclxuICBpZiAoIWlzRHJhZnRhYmxlKHN0YXRlKSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVPcHMoKSBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cy5gKVxyXG4gIH1cclxuXHJcbiAgLy8gQ3JlYXRlIGRyYWZ0XHJcbiAgY29uc3QgW2RyYWZ0LCBmaW5hbGl6ZV0gPSBkcmFmdGlmeShzdGF0ZSlcclxuXHJcbiAgLy8gUnVuIG11dGF0aW9uXHJcbiAgbGV0IHJlc3VsdDogdW5rbm93blxyXG4gIHRyeSB7XHJcbiAgICByZXN1bHQgPSBtdXRhdGUoZHJhZnQgYXMgRHJhZnQ8VD4pXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldm9rZVByb3h5KGdldFByb3h5RHJhZnQoZHJhZnQpKVxyXG4gICAgdGhyb3cgZXJyb3JcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSByZXR1cm4gdmFsdWVcclxuICBjb25zdCBwcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdChkcmFmdCkhXHJcblxyXG4gIC8vIENoZWNrIGZvciBpbnZhbGlkIHJldHVybiB2YWx1ZXNcclxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgIWlzRHJhZnQocmVzdWx0KSkge1xyXG4gICAgaWYgKCFpc0VxdWFsKHJlc3VsdCwgZHJhZnQpICYmIHByb3h5RHJhZnQub3BlcmF0ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBFaXRoZXIgdGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIGEgbmV3IG5vbi1kcmFmdCB2YWx1ZSwgb3Igb25seSB0aGUgZHJhZnQgaXMgbW9kaWZpZWQgd2l0aG91dCByZXR1cm5pbmcgYW55IHZhbHVlLmBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gICAgLy8gVXNlciByZXR1cm5lZCBhIG5ldyB2YWx1ZSAtIHVzZSBpdCBhcyB0aGUgbmV4dCBzdGF0ZVxyXG4gICAgLy8gTm90ZTogV2UgZG9uJ3Qgc3VwcG9ydCByYXdSZXR1cm4sIHNvIHJldHVybmluZyBhIG5vbi1kcmFmdCB2YWx1ZSByZXBsYWNlcyB0aGUgc3RhdGVcclxuICAgIC8vIGJ1dCB3ZSBjYW4ndCBnZW5lcmF0ZSBtZWFuaW5nZnVsIG9wcyBmb3IgdGhpcyBjYXNlXHJcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgWywgb3BzXSA9IGZpbmFsaXplKFtdKVxyXG4gICAgICByZXR1cm4geyBuZXh0U3RhdGU6IHJlc3VsdCBhcyBULCBvcHMgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU3RhbmRhcmQgZmxvdyAtIGZpbmFsaXplIHRoZSBkcmFmdFxyXG4gIGlmIChyZXN1bHQgPT09IGRyYWZ0IHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCBbbmV4dFN0YXRlLCBvcHNdID0gZmluYWxpemUoW10pXHJcbiAgICByZXR1cm4geyBuZXh0U3RhdGUsIG9wcyB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm5lZCBhIGRpZmZlcmVudCBkcmFmdCAoY2hpbGQpXHJcbiAgY29uc3QgcmV0dXJuZWRQcm94eURyYWZ0ID0gZ2V0UHJveHlEcmFmdChyZXN1bHQpXHJcbiAgaWYgKHJldHVybmVkUHJveHlEcmFmdCkge1xyXG4gICAgaWYgKHJldHVybmVkUHJveHlEcmFmdC5vcGVyYXRlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXR1cm4gYSBtb2RpZmllZCBjaGlsZCBkcmFmdC5gKVxyXG4gICAgfVxyXG4gICAgY29uc3QgWywgb3BzXSA9IGZpbmFsaXplKFtdKVxyXG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlOiBjdXJyZW50KHJlc3VsdCBhcyBvYmplY3QpIGFzIFQsIG9wcyB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBbbmV4dFN0YXRlLCBvcHNdID0gZmluYWxpemUoW10pXHJcbiAgcmV0dXJuIHsgbmV4dFN0YXRlLCBvcHMgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBHZXQgdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gYSBkcmFmdC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBnZXRQcm94eURyYWZ0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuLyoqXHJcbiAqIGBvcmlnaW5hbChkcmFmdClgIHRvIGdldCBvcmlnaW5hbCBzdGF0ZSBpbiB0aGUgZHJhZnQgbXV0YXRpb24gZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGNvbnN0IHsgbmV4dFN0YXRlLCBvcHMgfSA9IGNyZWF0ZU9wcyhiYXNlU3RhdGUsIChkcmFmdCkgPT4ge1xyXG4gKiAgIGRyYWZ0LmZvby5iYXIgPSAnbmV3IHZhbHVlJztcclxuICogICBjb25zb2xlLmxvZyhvcmlnaW5hbChkcmFmdC5mb28pKTsgLy8geyBiYXI6ICdvbGQgdmFsdWUnIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9yaWdpbmFsPFQ+KHRhcmdldDogVCk6IFQge1xyXG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KHRhcmdldClcclxuICBpZiAoIXByb3h5RHJhZnQpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgb3JpZ2luYWwoKSBpcyBvbmx5IHVzZWQgZm9yIGEgZHJhZnQsIHBhcmFtZXRlcjogJHt0YXJnZXR9YClcclxuICB9XHJcbiAgcmV0dXJuIHByb3h5RHJhZnQub3JpZ2luYWwgYXMgVFxyXG59XHJcbiIsIi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBzZXQtbGlrZSBhcnJheSBvcGVyYXRpb25zLlxyXG4gKiBVc2VzIGVhZ2VyIG9wIGxvZ2dpbmcgLSBvcHMgYXJlIHB1c2hlZCBpbW1lZGlhdGVseSB3aGVuIG11dGF0aW9ucyBoYXBwZW4uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHR5cGUgeyBKU09OVmFsdWUgfSBmcm9tIFwiLi4vanNvblwiXHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHsgcHVzaE9wIH0gZnJvbSBcIi4vcHVzaE9wXCJcclxuaW1wb3J0IHsgZW5zdXJlU2hhbGxvd0NvcHksIGdldFBhdGhPclRocm93LCBnZXRQcm94eURyYWZ0LCBtYXJrQ2hhbmdlZCB9IGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSB2YWx1ZSB0byBhbiBhcnJheSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKHNldCBzZW1hbnRpY3MpLlxyXG4gKiBHZW5lcmF0ZXMgYW4gYGFkZFRvU2V0YCBvcGVyYXRpb24uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzXHJcbiAqIGNyZWF0ZU9wcyhzdGF0ZSwgKGRyYWZ0KSA9PiB7XHJcbiAqICAgYWRkVG9TZXQoZHJhZnQudGFncywgJ25ld1RhZycpOyAvLyBPbmx5IGFkZHMgaWYgbm90IHByZXNlbnRcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvU2V0PFQgZXh0ZW5kcyBKU09OVmFsdWU+KGRyYWZ0OiBUW10sIHZhbHVlOiBUKTogdm9pZCB7XHJcbiAgY29uc3QgcHJveHlEcmFmdCA9IGdldFByb3h5RHJhZnQoZHJhZnQpXHJcbiAgaWYgKCFwcm94eURyYWZ0KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZFRvU2V0KCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBkcmFmdCBhcnJheXNgKVxyXG4gIH1cclxuXHJcbiAgLy8gTWFyayBhcyBjaGFuZ2VkXHJcbiAgZW5zdXJlU2hhbGxvd0NvcHkocHJveHlEcmFmdClcclxuICBtYXJrQ2hhbmdlZChwcm94eURyYWZ0KVxyXG5cclxuICAvLyBDaGVjayBpZiB2YWx1ZSBhbHJlYWR5IGV4aXN0c1xyXG4gIGNvbnN0IGFyciA9IHByb3h5RHJhZnQuY29weSBhcyBUW11cclxuICBpZiAoYXJyLnNvbWUoKGl0ZW0pID0+IGl0ZW0gPT09IHZhbHVlIHx8IGRlZXBFcXVhbChpdGVtLCB2YWx1ZSkpKSB7XHJcbiAgICAvLyBWYWx1ZSBhbHJlYWR5IGV4aXN0cyAtIG5vIG9wIG5lZWRlZFxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICAvLyBBZGQgdGhlIHZhbHVlXHJcbiAgYXJyLnB1c2godmFsdWUpXHJcblxyXG4gIC8vIEVhZ2VyIG9wIGxvZ2dpbmdcclxuICBwdXNoT3AocHJveHlEcmFmdCwge1xyXG4gICAga2luZDogXCJhZGRUb1NldFwiLFxyXG4gICAgcGF0aDogZ2V0UGF0aE9yVGhyb3cocHJveHlEcmFmdCksXHJcbiAgICB2YWx1ZTogZGVlcENsb25lKHZhbHVlKSBhcyBKU09OVmFsdWUsXHJcbiAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBhIHZhbHVlIGZyb20gYW4gYXJyYXkgKHNldCBzZW1hbnRpY3MpLlxyXG4gKiBHZW5lcmF0ZXMgYSBgZGVsZXRlRnJvbVNldGAgb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0c1xyXG4gKiBjcmVhdGVPcHMoc3RhdGUsIChkcmFmdCkgPT4ge1xyXG4gKiAgIGRlbGV0ZUZyb21TZXQoZHJhZnQudGFncywgJ29sZFRhZycpOyAvLyBSZW1vdmVzIGFsbCBtYXRjaGluZyBpdGVtc1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRnJvbVNldDxUIGV4dGVuZHMgSlNPTlZhbHVlPihkcmFmdDogVFtdLCB2YWx1ZTogVCk6IHZvaWQge1xyXG4gIGNvbnN0IHByb3h5RHJhZnQgPSBnZXRQcm94eURyYWZ0KGRyYWZ0KVxyXG4gIGlmICghcHJveHlEcmFmdCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWxldGVGcm9tU2V0KCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBkcmFmdCBhcnJheXNgKVxyXG4gIH1cclxuXHJcbiAgLy8gTWFyayBhcyBjaGFuZ2VkXHJcbiAgZW5zdXJlU2hhbGxvd0NvcHkocHJveHlEcmFmdClcclxuICBtYXJrQ2hhbmdlZChwcm94eURyYWZ0KVxyXG5cclxuICAvLyBDaGVjayBpZiB2YWx1ZSBleGlzdHNcclxuICBjb25zdCBhcnIgPSBwcm94eURyYWZ0LmNvcHkgYXMgVFtdXHJcbiAgY29uc3QgaGFzVmFsdWUgPSBhcnIuc29tZSgoaXRlbSkgPT4gaXRlbSA9PT0gdmFsdWUgfHwgZGVlcEVxdWFsKGl0ZW0sIHZhbHVlKSlcclxuXHJcbiAgaWYgKCFoYXNWYWx1ZSkge1xyXG4gICAgLy8gVmFsdWUgZG9lc24ndCBleGlzdCAtIG5vIG9wIG5lZWRlZFxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmUgYWxsIG1hdGNoaW5nIGl0ZW1zIChieSB2YWx1ZSBlcXVhbGl0eSlcclxuICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICBpZiAoYXJyW2ldID09PSB2YWx1ZSB8fCBkZWVwRXF1YWwoYXJyW2ldLCB2YWx1ZSkpIHtcclxuICAgICAgYXJyLnNwbGljZShpLCAxKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRWFnZXIgb3AgbG9nZ2luZ1xyXG4gIHB1c2hPcChwcm94eURyYWZ0LCB7XHJcbiAgICBraW5kOiBcImRlbGV0ZUZyb21TZXRcIixcclxuICAgIHBhdGg6IGdldFBhdGhPclRocm93KHByb3h5RHJhZnQpLFxyXG4gICAgdmFsdWU6IGRlZXBDbG9uZSh2YWx1ZSkgYXMgSlNPTlZhbHVlLFxyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IHR5cGUgQ2hlY2twb2ludFJlY29yZCwgcGFyc2VDaGVja3BvaW50S2V5IH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGZpbmFsaXplZCBlcG9jaCBhbmQgaXRzIGNhbm9uaWNhbCBjaGVja3BvaW50IGluIGEgc2luZ2xlIHBhc3MuXG4gKlxuICogUG9saWN5IEE6IFRoZSBmaW5hbGl6ZWQgZXBvY2ggaXMgdGhlIG1vc3QgcmVjZW50IGVwb2NoIHdpdGggYSBjaGVja3BvaW50LlxuICogQ2Fub25pY2FsIGNoZWNrcG9pbnQ6IFRoZSBjaGVja3BvaW50IHdpdGggaGlnaGVzdCB0eENvdW50IGZvciB0aGF0IGVwb2NoXG4gKiAodGllLWJyZWFrOiBsb3dlc3QgY2xpZW50SWQgYWxwaGFiZXRpY2FsbHkpLlxuICpcbiAqIFJldHVybnMgeyBmaW5hbGl6ZWRFcG9jaDogLTEsIGNoZWNrcG9pbnQ6IG51bGwgfSBpZiBubyBjaGVja3BvaW50cyBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbmFsaXplZEVwb2NoQW5kQ2hlY2twb2ludCh5Q2hlY2twb2ludDogWS5NYXA8Q2hlY2twb2ludFJlY29yZD4pOiB7XG4gIGZpbmFsaXplZEVwb2NoOiBudW1iZXJcbiAgY2hlY2twb2ludDogQ2hlY2twb2ludFJlY29yZCB8IG51bGxcbn0ge1xuICBsZXQgbWF4RXBvY2ggPSAtMVxuICBsZXQgYmVzdDogQ2hlY2twb2ludFJlY29yZCB8IG51bGwgPSBudWxsXG4gIGxldCBiZXN0VHhDb3VudCA9IC0xXG4gIGxldCBiZXN0Q2xpZW50SWQgPSBcIlwiXG5cbiAgZm9yIChjb25zdCBba2V5LCBjcF0gb2YgeUNoZWNrcG9pbnQuZW50cmllcygpKSB7XG4gICAgY29uc3QgeyBlcG9jaCwgY2xpZW50SWQgfSA9IHBhcnNlQ2hlY2twb2ludEtleShrZXkpXG5cbiAgICBpZiAoZXBvY2ggPiBtYXhFcG9jaCkge1xuICAgICAgLy8gTmV3IGhpZ2hlc3QgZXBvY2ggLSByZXNldCBiZXN0IGNoZWNrcG9pbnQgdHJhY2tpbmdcbiAgICAgIG1heEVwb2NoID0gZXBvY2hcbiAgICAgIGJlc3QgPSBjcFxuICAgICAgYmVzdFR4Q291bnQgPSBjcC50eENvdW50XG4gICAgICBiZXN0Q2xpZW50SWQgPSBjbGllbnRJZFxuICAgIH0gZWxzZSBpZiAoZXBvY2ggPT09IG1heEVwb2NoKSB7XG4gICAgICAvLyBTYW1lIGVwb2NoIC0gY2hlY2sgaWYgdGhpcyBpcyBhIGJldHRlciBjYW5vbmljYWwgY2hlY2twb2ludFxuICAgICAgLy8gUHJpbWFyeTogaGlnaGVyIHR4Q291bnQgd2luc1xuICAgICAgLy8gU2Vjb25kYXJ5ICh0aWUtYnJlYWspOiBsb3dlciBjbGllbnRJZCAoYWxwaGFiZXRpY2FsbHkpIHdpbnNcbiAgICAgIGlmIChjcC50eENvdW50ID4gYmVzdFR4Q291bnQgfHwgKGNwLnR4Q291bnQgPT09IGJlc3RUeENvdW50ICYmIGNsaWVudElkIDwgYmVzdENsaWVudElkKSkge1xuICAgICAgICBiZXN0ID0gY3BcbiAgICAgICAgYmVzdFR4Q291bnQgPSBjcC50eENvdW50XG4gICAgICAgIGJlc3RDbGllbnRJZCA9IGNsaWVudElkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmluYWxpemVkRXBvY2g6IG1heEVwb2NoLCBjaGVja3BvaW50OiBiZXN0IH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBDbGllbnRJZCB9IGZyb20gXCIuL0NsaWVudElkXCJcbmltcG9ydCB7IGdldEZpbmFsaXplZEVwb2NoQW5kQ2hlY2twb2ludCB9IGZyb20gXCIuL2NoZWNrcG9pbnRVdGlsc1wiXG5pbXBvcnQgeyBDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5pbXBvcnQgeyBUeFJlY29yZCB9IGZyb20gXCIuL1R4UmVjb3JkXCJcbmltcG9ydCB7IFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIFdhdGVybWFya2luZyBmb3IgZGVkdXBsaWNhdGlvbiBhbmQgcHJ1bmluZy5cbiAqIC0gbWF4Q2xvY2s6IEFsbCB0eHMgZnJvbSB0aGlzIGNsaWVudCB3aXRoIGNsb2NrIDw9IG1heENsb2NrIGFyZSBGSU5BTElaRUQuXG4gKiAtIG1heFdhbGxDbG9jazogVGhlIGxhc3QgdGltZSB3ZSBzYXcgdGhpcyBjbGllbnQgYWN0aXZlIChmb3IgcHJ1bmluZykuXG4gKi9cbnR5cGUgQ2xpZW50V2F0ZXJtYXJrID0gUmVhZG9ubHk8e1xuICBtYXhDbG9jazogbnVtYmVyXG4gIG1heFdhbGxDbG9jazogbnVtYmVyXG59PlxuXG4vKipcbiAqIFdhdGVybWFya3MgZm9yIGFsbCBjbGllbnRzLlxuICovXG5leHBvcnQgdHlwZSBDbGllbnRXYXRlcm1hcmtzID0gUmVjb3JkPENsaWVudElkLCBDbGllbnRXYXRlcm1hcms+XG5cbi8qKlxuICogQSBzbmFwc2hvdCBvZiB0aGUgc3RhdGUgYXQgdGhlIGVuZCBvZiBhIHNwZWNpZmljIGVwb2NoLlxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50UmVjb3JkID0ge1xuICBzdGF0ZTogSlNPTk9iamVjdCAvLyBUaGUgZG9jdW1lbnQgc3RhdGVcbiAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyAvLyBEZWR1cC9QcnVuaW5nIGluZm9cbiAgdHhDb3VudDogbnVtYmVyIC8vIFRpZS1icmVha2VyIGZvciBjYW5vbmljYWwgc2VsZWN0aW9uXG4gIG1pbldhbGxDbG9jazogbnVtYmVyIC8vIFJlZmVyZW5jZSB0aW1lIGZvciB0aGlzIGVwb2NoIChkZXRlcm1pbmlzdGljIHBydW5pbmcpXG59XG5cbi8qKlxuICogVW5pcXVlIElEIGZvciBhIGNoZWNrcG9pbnQuXG4gKiBGb3JtYXQ6IGAke2Vwb2NofTske3R4Q291bnR9OyR7Y2xpZW50SWR9YFxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50S2V5ID0gc3RyaW5nXG5cbi8qKlxuICogRGF0YSBleHRyYWN0ZWQgZnJvbSBhIGNoZWNrcG9pbnQga2V5LlxuICovXG5leHBvcnQgdHlwZSBDaGVja3BvaW50S2V5RGF0YSA9IHtcbiAgZXBvY2g6IG51bWJlclxuICB0eENvdW50OiBudW1iZXJcbiAgY2xpZW50SWQ6IENsaWVudElkXG59XG5cbi8qKlxuICogQ29udmVydHMgY2hlY2twb2ludCBrZXkgZGF0YSBjb21wb25lbnRzIHRvIGEga2V5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gY2hlY2twb2ludEtleURhdGFUb0tleShkYXRhOiBDaGVja3BvaW50S2V5RGF0YSk6IENoZWNrcG9pbnRLZXkge1xuICByZXR1cm4gYCR7ZGF0YS5lcG9jaH07JHtkYXRhLnR4Q291bnR9OyR7ZGF0YS5jbGllbnRJZH1gXG59XG5cbi8qKlxuICogSGVscGVyIHRvIHBhcnNlIGNoZWNrcG9pbnQga2V5cy5cbiAqIENoZWNrcG9pbnQga2V5cyBoYXZlIGZvcm1hdDogYCR7ZXBvY2h9OyR7dHhDb3VudH07JHtjbGllbnRJZH1gXG4gKiBUaHJvd3MgaWYga2V5IGlzIG1hbGZvcm1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hlY2twb2ludEtleShrZXk6IENoZWNrcG9pbnRLZXkpOiBDaGVja3BvaW50S2V5RGF0YSB7XG4gIGNvbnN0IGkxID0ga2V5LmluZGV4T2YoXCI7XCIpXG4gIGNvbnN0IGkyID0ga2V5LmluZGV4T2YoXCI7XCIsIGkxICsgMSlcblxuICBpZiAoaTEgPT09IC0xIHx8IGkyID09PSAtMSkge1xuICAgIGZhaWx1cmUoYE1hbGZvcm1lZCBjaGVja3BvaW50IGtleTogJHtrZXl9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXBvY2g6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKDAsIGkxKSwgMTApLFxuICAgIHR4Q291bnQ6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKGkxICsgMSwgaTIpLCAxMCksXG4gICAgY2xpZW50SWQ6IGtleS5zdWJzdHJpbmcoaTIgKyAxKSxcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBwZXJpb2RpY2FsbHkgKGUuZy4gYnkgYSBzZXJ2ZXIgb3IgbGVhZGVyIGNsaWVudCkgdG8gZmluYWxpemUgdGhlIGVwb2NoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hlY2twb2ludChcbiAgeVR4OiBZLk1hcDxUeFJlY29yZD4sXG4gIHlDaGVja3BvaW50OiBZLk1hcDxDaGVja3BvaW50UmVjb3JkPixcbiAgY2xpZW50U3RhdGU6IENsaWVudFN0YXRlLFxuICBhY3RpdmVFcG9jaDogbnVtYmVyLFxuICBjdXJyZW50U3RhdGU6IEpTT05PYmplY3QsXG4gIG15Q2xpZW50SWQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIC8vIDEuIFN0YXJ0IHdpdGggcHJldmlvdXMgd2F0ZXJtYXJrcyAoZnJvbSBmaW5hbGl6ZWQgZXBvY2ggPSBhY3RpdmVFcG9jaCAtIDEpXG4gIGNvbnN0IHsgY2hlY2twb2ludDogcHJldkNQIH0gPSBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQpXG4gIGNvbnN0IG5ld1dhdGVybWFya3MgPSBwcmV2Q1AgPyB7IC4uLnByZXZDUC53YXRlcm1hcmtzIH0gOiB7fVxuXG4gIC8vIEdldCBhY3RpdmUgdHhzIHVzaW5nIGNhY2hlZCBzb3J0ZWQgb3JkZXIgKGZpbHRlciBieSBlcG9jaClcbiAgLy8gRklMVEVSIElTIFJFUVVJUkVEOlxuICAvLyBBbHRob3VnaCB3ZSBhcmUgZmluYWxpemluZyAnYWN0aXZlRXBvY2gnLCBvdGhlciBwZWVycyBtYXkgaGF2ZSBhbHJlYWR5XG4gIC8vIGFkdmFuY2VkIHRvIHRoZSBuZXh0IGVwb2NoIGFuZCBzdGFydGVkIHN5bmNpbmcgdGhvc2UgdHhzLlxuICAvLyBXZSBtdXN0IGVuc3VyZSB0aGlzIGNoZWNrcG9pbnQgT05MWSBjb250YWlucyB0eHMgZnJvbSAnYWN0aXZlRXBvY2gnLlxuICAvLyBVc2luZyBzdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzIGF2b2lkcyByZWR1bmRhbnQga2V5IHBhcnNpbmcgKHRpbWVzdGFtcHMgYXJlIGNhY2hlZCkuXG4gIC8vXG4gIC8vIE9QVElNSVpBVElPTjogU2luY2Ugc29ydGVkVHhzIGlzIHNvcnRlZCBieSBlcG9jaCAocHJpbWFyeSBrZXkpIGFuZCBwYXN0IGVwb2Noc1xuICAvLyBhcmUgcHJ1bmVkLCB3ZSBvbmx5IG5lZWQgdG8gZmluZCB0aGUgcmlnaHQgYm91bmRhcnkuIEZ1dHVyZSBlcG9jaHMgYXJlIHJhcmUsXG4gIC8vIHNvIGEgc2ltcGxlIGxpbmVhciBzZWFyY2ggZnJvbSB0aGUgcmlnaHQgaXMgZWZmaWNpZW50ICh0eXBpY2FsbHkgMC0xIGl0ZXJhdGlvbnMpLlxuICBjb25zdCBzb3J0ZWRUeHMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKClcblxuICAvLyBGaW5kIGVuZCBib3VuZGFyeSBieSBzZWFyY2hpbmcgZnJvbSByaWdodCAoc2tpcCBhbnkgZnV0dXJlIGVwb2NoIGVudHJpZXMpXG4gIGxldCBlbmRJbmRleCA9IHNvcnRlZFR4cy5sZW5ndGhcbiAgd2hpbGUgKGVuZEluZGV4ID4gMCAmJiBzb3J0ZWRUeHNbZW5kSW5kZXggLSAxXS50eFRpbWVzdGFtcC5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgZW5kSW5kZXgtLVxuICB9XG5cbiAgLy8gU2xpY2UgZnJvbSBzdGFydCB0byBlbmRJbmRleCAocGFzdCBlcG9jaHMgYXJlIHBydW5lZCwgc28gdGhlc2UgYXJlIGFsbCBhY3RpdmVFcG9jaClcbiAgY29uc3QgYWN0aXZlVHhzID0gc29ydGVkVHhzLnNsaWNlKDAsIGVuZEluZGV4KVxuXG4gIGlmIChhY3RpdmVUeHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC8vIERvIG5vdGhpbmcgaWYgbm8gdHhzIChwcmV2ZW50cyBlbXB0eSBlcG9jaHMpXG4gIH1cblxuICAvLyAyLiBVcGRhdGUgd2F0ZXJtYXJrcyBiYXNlZCBvbiBPQlNFUlZFRCBhY3RpdmUgdHhzIGFuZCBjYWxjdWxhdGUgbWluV2FsbENsb2NrXG4gIC8vIE5PVEU6IFdlIGNhbm5vdCB1c2UgYWN0aXZlVHhzWzBdLnR4VGltZXN0YW1wLndhbGxDbG9jayBmb3IgbWluV2FsbENsb2NrIGJlY2F1c2VcbiAgLy8gdHhzIGFyZSBzb3J0ZWQgYnkgTGFtcG9ydCBjbG9jayAoZXBvY2gg4oaSIGNsb2NrIOKGkiBjbGllbnRJZCksIG5vdCBieSB3YWxsQ2xvY2suXG4gIC8vIEEgY2xpZW50IG1heSBoYXZlIGEgaGlnaCBMYW1wb3J0IGNsb2NrIGJ1dCBlYXJseSB3YWxsQ2xvY2sgZHVlIHRvIGNsb2NrIGRyaWZ0XG4gIC8vIG9yIHJlY2VpdmluZyBtYW55IG1lc3NhZ2VzIGJlZm9yZSBlbWl0dGluZy5cbiAgbGV0IG1pbldhbGxDbG9jayA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICBsZXQgdHhDb3VudCA9IDBcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhY3RpdmVUeHMpIHtcbiAgICBjb25zdCB0cyA9IGVudHJ5LnR4VGltZXN0YW1wXG5cbiAgICAvLyBUcmFjayBtaW4gd2FsbENsb2NrIGZvciBkZXRlcm1pbmlzdGljIHBydW5pbmcgcmVmZXJlbmNlXG4gICAgaWYgKHRzLndhbGxDbG9jayA8IG1pbldhbGxDbG9jaykge1xuICAgICAgbWluV2FsbENsb2NrID0gdHMud2FsbENsb2NrXG4gICAgfVxuXG4gICAgY29uc3QgbmV3V20gPSBuZXdXYXRlcm1hcmtzW3RzLmNsaWVudElkXVxuICAgICAgPyB7IC4uLm5ld1dhdGVybWFya3NbdHMuY2xpZW50SWRdIH1cbiAgICAgIDogeyBtYXhDbG9jazogLTEsIG1heFdhbGxDbG9jazogMCB9XG5cbiAgICBpZiAodHMuY2xvY2sgPiBuZXdXbS5tYXhDbG9jaykge1xuICAgICAgbmV3V20ubWF4Q2xvY2sgPSB0cy5jbG9ja1xuICAgICAgbmV3V20ubWF4V2FsbENsb2NrID0gdHMud2FsbENsb2NrXG4gICAgfVxuICAgIG5ld1dhdGVybWFya3NbdHMuY2xpZW50SWRdID0gbmV3V21cbiAgICB0eENvdW50KytcbiAgfVxuXG4gIC8vIDMuIFBydW5lIEluYWN0aXZlIFdhdGVybWFya3MgKERldGVybWluaXN0aWMpXG4gIC8vIFVzZXMgbWluV2FsbENsb2NrIHNvIGFsbCBjbGllbnRzIGFncmVlIG9uIGV4YWN0bHkgd2hvIHRvIHBydW5lLlxuICBmb3IgKGNvbnN0IGNsaWVudElkIGluIG5ld1dhdGVybWFya3MpIHtcbiAgICBpZiAobWluV2FsbENsb2NrIC0gbmV3V2F0ZXJtYXJrc1tjbGllbnRJZF0ubWF4V2FsbENsb2NrID4gY2xpZW50U3RhdGUucmV0ZW50aW9uV2luZG93TXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdXYXRlcm1hcmtzW2NsaWVudElkXVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFNhdmUgQ2hlY2twb2ludFxuICBjb25zdCBjcEtleSA9IGNoZWNrcG9pbnRLZXlEYXRhVG9LZXkoe1xuICAgIGVwb2NoOiBhY3RpdmVFcG9jaCxcbiAgICB0eENvdW50LFxuICAgIGNsaWVudElkOiBteUNsaWVudElkLFxuICB9KVxuICB5Q2hlY2twb2ludC5zZXQoY3BLZXksIHtcbiAgICBzdGF0ZTogY3VycmVudFN0YXRlLCAvLyBSZXNwb25zaWJpbGl0eSBmb3IgY2xvbmluZyBpcyBtb3ZlZCB0byB0aGUgY2FsbGVyIGlmIG5lZWRlZFxuICAgIHdhdGVybWFya3M6IG5ld1dhdGVybWFya3MsXG4gICAgdHhDb3VudCxcbiAgICBtaW5XYWxsQ2xvY2ssXG4gIH0pXG5cbiAgLy8gNS4gRWFybHkgdHggcHJ1bmluZyAoT3B0aW1pemF0aW9uKVxuICAvLyBEZWxldGUgYWxsIHR4cyBmcm9tIHRoZSBub3ctZmluYWxpemVkIGVwb2NoXG4gIC8vIFRoaXMgcmVkdWNlcyBtZW1vcnkgcHJlc3N1cmUgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBjbGVhbnVwTG9nXG4gIGNvbnN0IGtleXNUb0RlbGV0ZTogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWN0aXZlVHhzKSB7XG4gICAgeVR4LmRlbGV0ZShlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgICBrZXlzVG9EZWxldGUucHVzaChlbnRyeS50eFRpbWVzdGFtcEtleSlcbiAgfVxuICBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IucmVtb3ZlVHhzKGtleXNUb0RlbGV0ZSlcbn1cblxuLyoqXG4gKiBHYXJiYWdlIGNvbGxlY3RzIG9sZCBjaGVja3BvaW50cy5cbiAqIFNob3VsZCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aCBvZiB5Q2hlY2twb2ludC5cbiAqXG4gKiBLZWVwcyBvbmx5IHRoZSBjYW5vbmljYWwgY2hlY2twb2ludCBmb3IgdGhlIGZpbmFsaXplZCBlcG9jaC5cbiAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBkZWxldGVkIChvbGQgZXBvY2hzICsgbm9uLWNhbm9uaWNhbCkuXG4gKlxuICogTm90ZTogVGhlIGFjdGl2ZSBlcG9jaCBuZXZlciBoYXMgY2hlY2twb2ludHMgLSBjcmVhdGluZyBhIGNoZWNrcG9pbnRcbiAqIGZvciBhbiBlcG9jaCBpbW1lZGlhdGVseSBtYWtlcyBpdCBmaW5hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZUNoZWNrcG9pbnRzKFxuICB5Q2hlY2twb2ludDogWS5NYXA8Q2hlY2twb2ludFJlY29yZD4sXG4gIGZpbmFsaXplZEVwb2NoOiBudW1iZXJcbik6IHZvaWQge1xuICAvLyBGaW5kIHRoZSBjYW5vbmljYWwgY2hlY2twb2ludCBhbmQgaXRzIGtleSBpbiBvbmUgcGFzc1xuICBsZXQgY2Fub25pY2FsS2V5OiBDaGVja3BvaW50S2V5IHwgbnVsbCA9IG51bGxcbiAgbGV0IGJlc3RUeENvdW50ID0gLTFcblxuICBmb3IgKGNvbnN0IFtrZXldIG9mIHlDaGVja3BvaW50LmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHsgZXBvY2gsIHR4Q291bnQgfSA9IHBhcnNlQ2hlY2twb2ludEtleShrZXkpXG4gICAgaWYgKGVwb2NoID09PSBmaW5hbGl6ZWRFcG9jaCAmJiB0eENvdW50ID4gYmVzdFR4Q291bnQpIHtcbiAgICAgIGNhbm9uaWNhbEtleSA9IGtleVxuICAgICAgYmVzdFR4Q291bnQgPSB0eENvdW50XG4gICAgfVxuICB9XG5cbiAgLy8gRGVsZXRlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjYW5vbmljYWwgY2hlY2twb2ludFxuICBmb3IgKGNvbnN0IGtleSBvZiB5Q2hlY2twb2ludC5rZXlzKCkpIHtcbiAgICBpZiAoa2V5ICE9PSBjYW5vbmljYWxLZXkpIHtcbiAgICAgIHlDaGVja3BvaW50LmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxyXG5pbXBvcnQgdHlwZSB7IEpTT05PYmplY3QsIEpTT05SZWNvcmQsIEpTT05WYWx1ZSwgUGF0aCB9IGZyb20gXCIuL2pzb25cIlxyXG5pbXBvcnQgdHlwZSB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXHJcbmltcG9ydCB7IFR4UmVjb3JkIH0gZnJvbSBcIi4vVHhSZWNvcmRcIlxyXG5pbXBvcnQgeyBkZWVwRXF1YWwsIGlzT2JqZWN0LCBwYXJzZUFycmF5SW5kZXggfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG4vKipcclxuICogQSBkcmFmdCBjb250ZXh0IGZvciBjb3B5LW9uLXdyaXRlIGltbXV0YWJsZSB1cGRhdGVzLlxyXG4gKlxyXG4gKiBUaGlzIHByb3ZpZGVzIEltbWVyL011dGF0aXZlLWxpa2Ugc2VtYW50aWNzIHdpdGhvdXQgdGhlIHByb3h5IG92ZXJoZWFkOlxyXG4gKiAtIFRoZSBvcmlnaW5hbCBiYXNlIHN0YXRlIGlzIG5ldmVyIG11dGF0ZWRcclxuICogLSBPYmplY3RzIGFyZSBjbG9uZWQgbGF6aWx5IG9uIGZpcnN0IG11dGF0aW9uIChjb3B5LW9uLXdyaXRlKVxyXG4gKiAtIE9uY2UgYW4gb2JqZWN0IGlzIGNsb25lZCAoXCJvd25lZFwiKSwgaXQgY2FuIGJlIG11dGF0ZWQgZGlyZWN0bHlcclxuICogLSBJZiBubyBjaGFuZ2VzIGFyZSBtYWRlLCB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGlzIHByZXNlcnZlZCAoc3RydWN0dXJhbCBzaGFyaW5nKVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEcmFmdENvbnRleHQ8VCBleHRlbmRzIEpTT05PYmplY3Q+IHtcclxuICAvKiogVGhlIGN1cnJlbnQgcm9vdCAobWF5IGJlIHRoZSBvcmlnaW5hbCBiYXNlIG9yIGEgY2xvbmVkIHZlcnNpb24pICovXHJcbiAgcm9vdDogVFxyXG4gIC8qKiBUaGUgb3JpZ2luYWwgYmFzZSBzdGF0ZSAobmV2ZXIgbXV0YXRlZCkgKi9cclxuICBiYXNlOiBUXHJcbiAgLyoqIFNldCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNsb25lZCBhbmQgYXJlIHNhZmUgdG8gbXV0YXRlICovXHJcbiAgb3duZWRPYmplY3RzOiBXZWFrU2V0PG9iamVjdD5cclxuICAvKiogT3B0aW1pemF0aW9uOiBmYXN0IGNoZWNrIGlmIHJvb3QgaXMgYWxyZWFkeSBvd25lZCAqL1xyXG4gIGlzUm9vdE93bmVkOiBib29sZWFuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGNvbnRleHQgZnJvbSBhIGJhc2Ugc3RhdGUuXHJcbiAqIFRoZSBiYXNlIHN0YXRlIHdpbGwgbmV2ZXIgYmUgbXV0YXRlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcmFmdDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oYmFzZTogVCk6IERyYWZ0Q29udGV4dDxUPiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJvb3Q6IGJhc2UsXHJcbiAgICBiYXNlLFxyXG4gICAgb3duZWRPYmplY3RzOiBuZXcgU2V0KCksXHJcbiAgICBpc1Jvb3RPd25lZDogZmFsc2UsXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBkcmFmdCB3YXMgbW9kaWZpZWQgKHJvb3QgIT09IGJhc2UpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRNb2RpZmllZDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oY3R4OiBEcmFmdENvbnRleHQ8VD4pOiBib29sZWFuIHtcclxuICByZXR1cm4gY3R4LnJvb3QgIT09IGN0eC5iYXNlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNoYWxsb3dDbG9uZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBUIHtcclxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICByZXR1cm4gb2JqLnNsaWNlKCkgYXMgdW5rbm93biBhcyBUXHJcbiAgfVxyXG4gIGNvbnN0IGNsb25lID0ge30gYXMgVFxyXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldXHJcbiAgICA7KGNsb25lIGFzIGFueSlba2V5XSA9IChvYmogYXMgYW55KVtrZXldXHJcbiAgfVxyXG4gIHJldHVybiBjbG9uZVxyXG59XHJcblxyXG4vKipcclxuICogRW5zdXJlcyBhbiBvYmplY3QgaXMgb3duZWQgKGNsb25lZCBpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm5zIHRoZSBvd25lZCB2ZXJzaW9uLlxyXG4gKiBBbHNvIHVwZGF0ZXMgdGhlIHBhcmVudCB0byBwb2ludCB0byB0aGUgY2xvbmVkIGNoaWxkLlxyXG4gKi9cclxuZnVuY3Rpb24gZW5zdXJlT3duZWQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhcmVudDogSlNPTk9iamVjdCxcclxuICBrZXk6IHN0cmluZyB8IG51bWJlcixcclxuICBjaGlsZDogSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdXHJcbik6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXSB7XHJcbiAgaWYgKGN0eC5vd25lZE9iamVjdHMuaGFzKGNoaWxkKSkge1xyXG4gICAgcmV0dXJuIGNoaWxkXHJcbiAgfVxyXG4gIGNvbnN0IGNsb25lZCA9IHNoYWxsb3dDbG9uZShjaGlsZClcclxuICA7KHBhcmVudCBhcyBhbnkpW2tleV0gPSBjbG9uZWRcclxuICBjdHgub3duZWRPYmplY3RzLmFkZChjbG9uZWQpXHJcbiAgcmV0dXJuIGNsb25lZFxyXG59XHJcblxyXG4vKipcclxuICogRW5zdXJlcyBhbGwgb2JqZWN0cyBhbG9uZyB0aGUgcGF0aCBhcmUgb3duZWQgKGNsb25lZCBpZiBuZWNlc3NhcnkpLlxyXG4gKiBSZXR1cm5zIHRoZSBjb250YWluZXIgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aC5cclxuICogVGhyb3dzIGlmIHRoZSBwYXRoIGlzIGludmFsaWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBlbnN1cmVPd25lZFBhdGg8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhdGg6IFBhdGhcclxuKTogSlNPTlJlY29yZCB8IEpTT05WYWx1ZVtdIHtcclxuICAvLyBFbnN1cmUgcm9vdCBpcyBvd25lZCBmaXJzdFxyXG4gIGlmICghY3R4LmlzUm9vdE93bmVkKSB7XHJcbiAgICBjdHgucm9vdCA9IHNoYWxsb3dDbG9uZShjdHgucm9vdCBhcyB1bmtub3duIGFzIG9iamVjdCkgYXMgVFxyXG4gICAgY3R4Lm93bmVkT2JqZWN0cy5hZGQoY3R4LnJvb3QpXHJcbiAgICBjdHguaXNSb290T3duZWQgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBjdHgucm9vdFxyXG4gIH1cclxuXHJcbiAgbGV0IGN1cnJlbnQ6IEpTT05SZWNvcmQgfCBKU09OVmFsdWVbXSA9IGN0eC5yb290XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3Qgc2VnbWVudCA9IHBhdGhbaV1cclxuICAgIGNvbnN0IGlzQXJyYXlJbmRleCA9IHR5cGVvZiBzZWdtZW50ID09PSBcIm51bWJlclwiXHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY29udGFpbmVyIHR5cGVcclxuICAgIGlmIChpc0FycmF5SW5kZXgpIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgYXJyYXkgYXQgcGF0aCBzZWdtZW50ICR7c2VnbWVudH1gKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWdtZW50IDwgMCB8fCBzZWdtZW50ID49IGN1cnJlbnQubGVuZ3RoKSB7XHJcbiAgICAgICAgZmFpbHVyZShgSW5kZXggJHtzZWdtZW50fSBvdXQgb2YgYm91bmRzYClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFpc09iamVjdChjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgRXhwZWN0ZWQgb2JqZWN0IGF0IHBhdGggc2VnbWVudCBcIiR7c2VnbWVudH1cImApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCEoc2VnbWVudCBpbiBjdXJyZW50KSkge1xyXG4gICAgICAgIGZhaWx1cmUoYFByb3BlcnR5IFwiJHtzZWdtZW50fVwiIGRvZXMgbm90IGV4aXN0YClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoaWxkOiBKU09OVmFsdWUgPSAoY3VycmVudCBhcyBhbnkpW3NlZ21lbnRdXHJcblxyXG4gICAgLy8gVmFsaWRhdGUgY2hpbGQgaXMgdHJhdmVyc2FibGVcclxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgZmFpbHVyZShgQ2Fubm90IHRyYXZlcnNlIHRocm91Z2ggcHJpbWl0aXZlIGF0IHBhdGggc2VnbWVudCAke3NlZ21lbnR9YClcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbnN1cmUgY2hpbGQgaXMgb3duZWQgYW5kIGNvbnRpbnVlXHJcbiAgICBjdXJyZW50ID0gZW5zdXJlT3duZWQoY3R4LCBjdXJyZW50LCBzZWdtZW50LCBjaGlsZCBhcyBKU09OUmVjb3JkIHwgSlNPTlZhbHVlW10pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY3VycmVudFxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSBcInNldFwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0U2V0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihcclxuICBjdHg6IERyYWZ0Q29udGV4dDxUPixcclxuICBwYXRoOiBQYXRoLFxyXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyLFxyXG4gIHZhbHVlOiBKU09OVmFsdWVcclxuKTogdm9pZCB7XHJcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcclxuICBpZiAoIWlzT2JqZWN0KGNvbnRhaW5lcikpIHtcclxuICAgIGZhaWx1cmUoXCJzZXQgcmVxdWlyZXMgb2JqZWN0IG9yIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gIH1cclxuICBsZXQgZmluYWxLZXk6IHN0cmluZyB8IG51bWJlciA9IGtleVxyXG4gIC8vIEZvciBhcnJheXMsIGNvbnZlcnQgc3RyaW5nIGtleXMgdG8gbnVtYmVycyAoZXhjZXB0IFwibGVuZ3RoXCIpXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGtleSAhPT0gXCJsZW5ndGhcIikge1xyXG4gICAgY29uc3QgbnVtS2V5ID0gcGFyc2VBcnJheUluZGV4KGtleSlcclxuICAgIGlmIChudW1LZXkgPT09IG51bGwpIHtcclxuICAgICAgZmFpbHVyZShgQ2Fubm90IHNldCBub24tbnVtZXJpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIG9uIGFycmF5YClcclxuICAgIH1cclxuICAgIGZpbmFsS2V5ID0gbnVtS2V5XHJcbiAgfVxyXG4gIDsoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIEpTT05WYWx1ZT4pW2ZpbmFsS2V5XSA9IHZhbHVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIFwiZGVsZXRlXCIgb3BlcmF0aW9uIHRvIHRoZSBkcmFmdCB3aXRoIGNvcHktb24td3JpdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZHJhZnREZWxldGU8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhdGg6IFBhdGgsXHJcbiAga2V5OiBzdHJpbmcgfCBudW1iZXJcclxuKTogdm9pZCB7XHJcbiAgY29uc3QgY29udGFpbmVyID0gZW5zdXJlT3duZWRQYXRoKGN0eCwgcGF0aClcclxuICBpZiAoIWlzT2JqZWN0KGNvbnRhaW5lcikpIHtcclxuICAgIGZhaWx1cmUoXCJkZWxldGUgcmVxdWlyZXMgb2JqZWN0IG9yIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gIH1cclxuICBsZXQgZmluYWxLZXk6IHN0cmluZyB8IG51bWJlciA9IGtleVxyXG4gIC8vIEZvciBhcnJheXMsIGNvbnZlcnQgc3RyaW5nIGtleXMgdG8gbnVtYmVyc1xyXG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgY29uc3QgbnVtS2V5ID0gcGFyc2VBcnJheUluZGV4KGtleSlcclxuICAgIGlmIChudW1LZXkgPT09IG51bGwpIHtcclxuICAgICAgZmFpbHVyZShgQ2Fubm90IGRlbGV0ZSBub24tbnVtZXJpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIGZyb20gYXJyYXlgKVxyXG4gICAgfVxyXG4gICAgZmluYWxLZXkgPSBudW1LZXlcclxuICB9XHJcbiAgZGVsZXRlIChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgSlNPTlZhbHVlPilbZmluYWxLZXldXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIFwic3BsaWNlXCIgb3BlcmF0aW9uIHRvIHRoZSBkcmFmdCB3aXRoIGNvcHktb24td3JpdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZHJhZnRTcGxpY2U8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhdGg6IFBhdGgsXHJcbiAgaW5kZXg6IG51bWJlcixcclxuICBkZWxldGVDb3VudDogbnVtYmVyLFxyXG4gIGluc2VydHM6IHJlYWRvbmx5IEpTT05WYWx1ZVtdXHJcbik6IHZvaWQge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgIGZhaWx1cmUoXCJzcGxpY2UgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgfVxyXG4gIGNvbnN0IHNhZmVJbmRleCA9IE1hdGgubWluKGluZGV4LCBjb250YWluZXIubGVuZ3RoKVxyXG4gIGlmIChpbnNlcnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgY29udGFpbmVyLnNwbGljZShzYWZlSW5kZXgsIGRlbGV0ZUNvdW50KVxyXG4gIH0gZWxzZSBpZiAoaW5zZXJ0cy5sZW5ndGggPT09IDEpIHtcclxuICAgIGNvbnRhaW5lci5zcGxpY2Uoc2FmZUluZGV4LCBkZWxldGVDb3VudCwgaW5zZXJ0c1swXSlcclxuICB9IGVsc2Uge1xyXG4gICAgY29udGFpbmVyLnNwbGljZShzYWZlSW5kZXgsIGRlbGV0ZUNvdW50LCAuLi5pbnNlcnRzKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzaW5nbGUgXCJhZGRUb1NldFwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0QWRkVG9TZXQ8VCBleHRlbmRzIEpTT05PYmplY3Q+KFxyXG4gIGN0eDogRHJhZnRDb250ZXh0PFQ+LFxyXG4gIHBhdGg6IFBhdGgsXHJcbiAgdmFsdWU6IEpTT05WYWx1ZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCBjb250YWluZXIgPSBlbnN1cmVPd25lZFBhdGgoY3R4LCBwYXRoKVxyXG4gIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICBmYWlsdXJlKFwiYWRkVG9TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgfVxyXG4gIGlmICghY29udGFpbmVyLnNvbWUoKGl0ZW0pID0+IGRlZXBFcXVhbChpdGVtLCB2YWx1ZSkpKSB7XHJcbiAgICBjb250YWluZXIucHVzaCh2YWx1ZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIFwiZGVsZXRlRnJvbVNldFwiIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRyYWZ0RGVsZXRlRnJvbVNldDxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXHJcbiAgY3R4OiBEcmFmdENvbnRleHQ8VD4sXHJcbiAgcGF0aDogUGF0aCxcclxuICB2YWx1ZTogSlNPTlZhbHVlXHJcbik6IHZvaWQge1xyXG4gIGNvbnN0IGNvbnRhaW5lciA9IGVuc3VyZU93bmVkUGF0aChjdHgsIHBhdGgpXHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgIGZhaWx1cmUoXCJkZWxldGVGcm9tU2V0IHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gIH1cclxuICAvLyBSZW1vdmUgYWxsIG1hdGNoaW5nIGl0ZW1zIChpdGVyYXRlIGJhY2t3YXJkcyB0byBhdm9pZCBpbmRleCBzaGlmdGluZylcclxuICBmb3IgKGxldCBpID0gY29udGFpbmVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICBpZiAoZGVlcEVxdWFsKGNvbnRhaW5lcltpXSwgdmFsdWUpKSB7XHJcbiAgICAgIGNvbnRhaW5lci5zcGxpY2UoaSwgMSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgZHJhZnQgd2l0aCBjb3B5LW9uLXdyaXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3BUb0RyYWZ0PFQgZXh0ZW5kcyBKU09OT2JqZWN0PihjdHg6IERyYWZ0Q29udGV4dDxUPiwgb3A6IE9wKTogdm9pZCB7XHJcbiAgc3dpdGNoIChvcC5raW5kKSB7XHJcbiAgICBjYXNlIFwic2V0XCI6XHJcbiAgICAgIGRyYWZ0U2V0KGN0eCwgb3AucGF0aCwgb3Aua2V5LCBvcC52YWx1ZSlcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgXCJkZWxldGVcIjpcclxuICAgICAgZHJhZnREZWxldGUoY3R4LCBvcC5wYXRoLCBvcC5rZXkpXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIFwic3BsaWNlXCI6XHJcbiAgICAgIGRyYWZ0U3BsaWNlKGN0eCwgb3AucGF0aCwgb3AuaW5kZXgsIG9wLmRlbGV0ZUNvdW50LCBvcC5pbnNlcnRzKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBcImFkZFRvU2V0XCI6XHJcbiAgICAgIGRyYWZ0QWRkVG9TZXQoY3R4LCBvcC5wYXRoLCBvcC52YWx1ZSlcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgXCJkZWxldGVGcm9tU2V0XCI6XHJcbiAgICAgIGRyYWZ0RGVsZXRlRnJvbVNldChjdHgsIG9wLnBhdGgsIG9wLnZhbHVlKVxyXG4gICAgICBicmVha1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgdGhyb3cgZmFpbHVyZShgVW5rbm93biBvcGVyYXRpb24ga2luZDogJHsob3AgYXMgYW55KS5raW5kfWApXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiB0byBhIGJhc2Ugc3RhdGUgaW1tdXRhYmx5LlxyXG4gKlxyXG4gKiBLZXkgYmVuZWZpdHMgb3ZlciBNdXRhdGl2ZS9JbW1lcjpcclxuICogLSBObyBwcm94eSBvdmVyaGVhZCAtIGRpcmVjdCBvYmplY3QgYWNjZXNzIGFuZCBjb3B5LW9uLXdyaXRlIGNsb25pbmdcclxuICogLSBTdHJ1Y3R1cmFsIHNoYXJpbmcgLSB1bmNoYW5nZWQgc3VidHJlZXMga2VlcCB0aGVpciByZWZlcmVuY2VzXHJcbiAqIC0gWmVyby1jb3B5IG9uIGZhaWx1cmUgLSBpZiB2YWxpZGF0aW9uIGZhaWxzLCByZXR1cm5zIG9yaWdpbmFsIGJhc2UgdW5jaGFuZ2VkXHJcbiAqXHJcbiAqIEBwYXJhbSBiYXNlIC0gVGhlIGJhc2Ugc3RhdGUgKG5ldmVyIG11dGF0ZWQpXHJcbiAqIEBwYXJhbSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byBhcHBseVxyXG4gKiBAcGFyYW0gdmFsaWRhdGVGbiAtIE9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb25cclxuICogQHJldHVybnMgVGhlIGZpbmFsIHN0YXRlIChpZiB2YWxpZCkgb3IgdGhlIG9yaWdpbmFsIGJhc2UgKGlmIGludmFsaWQgb3IgZW1wdHkpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUeEltbXV0YWJsZTxUIGV4dGVuZHMgSlNPTk9iamVjdD4oXHJcbiAgYmFzZTogVCxcclxuICB0eDogUGljazxUeFJlY29yZCwgXCJvcHNcIj4sXHJcbiAgdmFsaWRhdGVGbj86IFZhbGlkYXRlRm48VD5cclxuKTogVCB7XHJcbiAgaWYgKHR4Lm9wcy5sZW5ndGggPT09IDApIHJldHVybiBiYXNlXHJcblxyXG4gIGNvbnN0IGN0eCA9IGNyZWF0ZURyYWZ0KGJhc2UpXHJcblxyXG4gIHRyeSB7XHJcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHR4Lm9wcykge1xyXG4gICAgICBhcHBseU9wVG9EcmFmdChjdHgsIG9wKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWxpZGF0ZUZuICYmICF2YWxpZGF0ZUZuKGN0eC5yb290KSkge1xyXG4gICAgICByZXR1cm4gYmFzZVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjdHgucm9vdFxyXG4gIH0gY2F0Y2gge1xyXG4gICAgcmV0dXJuIGJhc2VcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcbmltcG9ydCB7IEpTT05SZWNvcmQsIEpTT05WYWx1ZSwgUGF0aCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcblxuLyoqXG4gKiBSZWNvbmNpbGVzIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggdGhlIHRhcmdldCBzdGF0ZSBieSBjb21wdXRpbmcgYW5kIGVtaXR0aW5nXG4gKiB0aGUgbWluaW1hbCBzZXQgb2Ygb3BlcmF0aW9ucyBuZWVkZWQgdG8gdHJhbnNmb3JtIGN1cnJlbnRTdGF0ZSBpbnRvIHRhcmdldFN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJlY29uY2lsZU9wcyhjdXJyZW50U3RhdGU6IEpTT05WYWx1ZSwgdGFyZ2V0U3RhdGU6IEpTT05WYWx1ZSk6IE9wW10ge1xuICBjb25zdCBvcHM6IE9wW10gPSBbXVxuICBkaWZmVmFsdWUoY3VycmVudFN0YXRlLCB0YXJnZXRTdGF0ZSwgW10sIG9wcylcbiAgcmV0dXJuIG9wc1xufVxuXG5mdW5jdGlvbiBkaWZmVmFsdWUoY3VycmVudDogSlNPTlZhbHVlLCB0YXJnZXQ6IEpTT05WYWx1ZSwgcGF0aDogUGF0aCwgb3BzOiBPcFtdKTogdm9pZCB7XG4gIC8vIDEuIFJlZmVyZW5jZSBlcXVhbGl0eSAoc3RydWN0dXJhbCBzaGFyaW5nKVxuICBpZiAoY3VycmVudCA9PT0gdGFyZ2V0KSByZXR1cm5cblxuICAvLyAyLiBIYW5kbGUgcHJpbWl0aXZlcyBhbmQgbnVsbCBxdWlja2x5XG4gIGNvbnN0IGN1cnJlbnRUeXBlID0gdHlwZW9mIGN1cnJlbnRcbiAgY29uc3QgdGFyZ2V0VHlwZSA9IHR5cGVvZiB0YXJnZXRcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IG51bGwgfHwgY3VycmVudFR5cGUgIT09IFwib2JqZWN0XCIgfHwgdGFyZ2V0VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIC8vIEF0IGxlYXN0IG9uZSBpcyBwcmltaXRpdmUvbnVsbCwgb3IgdHlwZXMgZG9uJ3QgbWF0Y2hcbiAgICBlbWl0UmVwbGFjZShwYXRoLCB0YXJnZXQsIG9wcylcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEJvdGggYXJlIG9iamVjdHMgKG9iamVjdCBvciBhcnJheSlcbiAgY29uc3QgY3VycmVudElzQXJyYXkgPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpXG4gIGNvbnN0IHRhcmdldElzQXJyYXkgPSBBcnJheS5pc0FycmF5KHRhcmdldClcblxuICBpZiAoY3VycmVudElzQXJyYXkgIT09IHRhcmdldElzQXJyYXkpIHtcbiAgICAvLyBUeXBlIG1pc21hdGNoIChvbmUgYXJyYXksIG9uZSBvYmplY3QpXG4gICAgZW1pdFJlcGxhY2UocGF0aCwgdGFyZ2V0LCBvcHMpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoY3VycmVudElzQXJyYXkpIHtcbiAgICBkaWZmQXJyYXkoY3VycmVudCwgdGFyZ2V0IGFzIEpTT05WYWx1ZVtdLCBwYXRoLCBvcHMpXG4gIH0gZWxzZSB7XG4gICAgZGlmZk9iamVjdChjdXJyZW50IGFzIEpTT05SZWNvcmQsIHRhcmdldCBhcyBKU09OUmVjb3JkLCBwYXRoLCBvcHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZk9iamVjdChjdXJyZW50OiBKU09OUmVjb3JkLCB0YXJnZXQ6IEpTT05SZWNvcmQsIHBhdGg6IFBhdGgsIG9wczogT3BbXSk6IHZvaWQge1xuICAvLyAxLiBEZWxldGUga2V5cyBpbiBjdXJyZW50IGJ1dCBub3QgaW4gdGFyZ2V0XG4gIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihjdXJyZW50LCBrZXkpICYmICFPYmplY3QuaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgICAgb3BzLnB1c2goeyBraW5kOiBcImRlbGV0ZVwiLCBwYXRoLCBrZXkgfSlcbiAgICB9XG4gIH1cblxuICAvLyAyLiBBZGQvVXBkYXRlIGtleXMgaW4gdGFyZ2V0XG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgICAgY29uc3QgdGFyZ2V0VmFsID0gdGFyZ2V0W2tleV1cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihjdXJyZW50LCBrZXkpKSB7XG4gICAgICAgIG9wcy5wdXNoKHsga2luZDogXCJzZXRcIiwgcGF0aCwga2V5LCB2YWx1ZTogdGFyZ2V0VmFsIH0pXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRba2V5XSAhPT0gdGFyZ2V0VmFsKSB7XG4gICAgICAgIC8vIE9ubHkgcmVjdXJzZSBpZiB2YWx1ZXMgZGlmZmVyIChyZWZlcmVuY2UgY2hlY2sgZmlyc3QpXG4gICAgICAgIGRpZmZWYWx1ZShjdXJyZW50W2tleV0sIHRhcmdldFZhbCwgWy4uLnBhdGgsIGtleV0sIG9wcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkFycmF5KGN1cnJlbnQ6IEpTT05WYWx1ZVtdLCB0YXJnZXQ6IEpTT05WYWx1ZVtdLCBwYXRoOiBQYXRoLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudExlbiA9IGN1cnJlbnQubGVuZ3RoXG4gIGNvbnN0IHRhcmdldExlbiA9IHRhcmdldC5sZW5ndGhcbiAgY29uc3QgbWluTGVuID0gY3VycmVudExlbiA8IHRhcmdldExlbiA/IGN1cnJlbnRMZW4gOiB0YXJnZXRMZW5cblxuICAvLyBEaWZmIGNvbW1vbiBlbGVtZW50c1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkxlbjsgaSsrKSB7XG4gICAgaWYgKGN1cnJlbnRbaV0gIT09IHRhcmdldFtpXSkge1xuICAgICAgZGlmZlZhbHVlKGN1cnJlbnRbaV0sIHRhcmdldFtpXSwgWy4uLnBhdGgsIGldLCBvcHMpXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIGxlbmd0aCBkaWZmZXJlbmNlXG4gIGlmICh0YXJnZXRMZW4gPiBjdXJyZW50TGVuKSB7XG4gICAgb3BzLnB1c2goe1xuICAgICAga2luZDogXCJzcGxpY2VcIixcbiAgICAgIHBhdGgsXG4gICAgICBpbmRleDogY3VycmVudExlbixcbiAgICAgIGRlbGV0ZUNvdW50OiAwLFxuICAgICAgaW5zZXJ0czogdGFyZ2V0LnNsaWNlKGN1cnJlbnRMZW4pLFxuICAgIH0pXG4gIH0gZWxzZSBpZiAoY3VycmVudExlbiA+IHRhcmdldExlbikge1xuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoLFxuICAgICAgaW5kZXg6IHRhcmdldExlbixcbiAgICAgIGRlbGV0ZUNvdW50OiBjdXJyZW50TGVuIC0gdGFyZ2V0TGVuLFxuICAgICAgaW5zZXJ0czogW10sXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVwbGFjZShwYXRoOiBQYXRoLCB2YWx1ZTogSlNPTlZhbHVlLCBvcHM6IE9wW10pOiB2b2lkIHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gQ2Fubm90IHJlcGxhY2Ugcm9vdCBkaXJlY3RseSB2aWEgT3BzICh1bmxlc3Mgd2UgZGVmaW5lIGEgJ3Jvb3QnIG9wLCB3aGljaCB3ZSBkb24ndClcbiAgICAvLyBXZSBleHBlY3Qgcm9vdCB0byBiZSBoYW5kbGVkIGJ5IGRpZmZPYmplY3QgdXN1YWxseS5cbiAgICAvLyBJZiB3ZSBsYW5kIGhlcmUsIGl0IG1lYW5zIHJvb3QgdHlwZXMgbWlzbWF0Y2hlZCAoZS5nLiBPYmogLT4gQXJyYXkpLlxuICAgIGZhaWx1cmUoXCJTdGF0ZVN5bmNMb2c6IENhbm5vdCByZXBsYWNlIHJvb3Qgc3RhdGUgZGlyZWN0bHkgdmlhIE9wcy5cIilcbiAgfVxuXG4gIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICBjb25zdCBrZXlUb0NoZWNrID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG5cbiAgaWYgKHR5cGVvZiBrZXlUb0NoZWNrID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gUGFyZW50IGlzIE9iamVjdFxuICAgIG9wcy5wdXNoKHsga2luZDogXCJzZXRcIiwgcGF0aDogcGFyZW50UGF0aCwga2V5OiBrZXlUb0NoZWNrLCB2YWx1ZSB9KVxuICB9IGVsc2Uge1xuICAgIC8vIFBhcmVudCBpcyBBcnJheVxuICAgIG9wcy5wdXNoKHtcbiAgICAgIGtpbmQ6IFwic3BsaWNlXCIsXG4gICAgICBwYXRoOiBwYXJlbnRQYXRoLFxuICAgICAgaW5kZXg6IGtleVRvQ2hlY2ssXG4gICAgICBkZWxldGVDb3VudDogMSxcbiAgICAgIGluc2VydHM6IFt2YWx1ZV0sXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuL2Vycm9yXCJcblxuLyoqXG4gKiBQYXJzZWQgdHggdGltZXN0YW1wIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFR4VGltZXN0YW1wID0ge1xuICBlcG9jaDogbnVtYmVyXG4gIGNsb2NrOiBudW1iZXJcbiAgY2xpZW50SWQ6IHN0cmluZ1xuICB3YWxsQ2xvY2s6IG51bWJlclxufVxuXG4vKipcbiAqIFVuaXF1ZSB0eCBJRCAoQ29tcG9zaXRlIEtleSkuXG4gKi9cbmV4cG9ydCB0eXBlIFR4VGltZXN0YW1wS2V5ID0gc3RyaW5nXG5cbi8qKlxuICogQ29udmVydHMgYSB0aW1lc3RhbXAgb2JqZWN0IHRvIGEgVHJhbnNhY3Rpb25UaW1lc3RhbXBLZXkgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHhUaW1lc3RhbXBUb0tleSh0czogVHhUaW1lc3RhbXApOiBUeFRpbWVzdGFtcEtleSB7XG4gIHJldHVybiBgJHt0cy5lcG9jaH07JHt0cy5jbG9ja307JHt0cy5jbGllbnRJZH07JHt0cy53YWxsQ2xvY2t9YFxufVxuXG4vKipcbiAqIEhlbHBlciB0byBwYXJzZSB0eCB0aW1lc3RhbXAga2V5cy5cbiAqIFRocm93cyBpZiBrZXkgaXMgbWFsZm9ybWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUeFRpbWVzdGFtcEtleShrZXk6IFR4VGltZXN0YW1wS2V5KTogVHhUaW1lc3RhbXAge1xuICBjb25zdCBpMSA9IGtleS5pbmRleE9mKFwiO1wiKVxuICBjb25zdCBpMiA9IGtleS5pbmRleE9mKFwiO1wiLCBpMSArIDEpXG4gIGNvbnN0IGkzID0ga2V5LmluZGV4T2YoXCI7XCIsIGkyICsgMSlcblxuICBpZiAoaTEgPT09IC0xIHx8IGkyID09PSAtMSB8fCBpMyA9PT0gLTEpIHtcbiAgICBmYWlsdXJlKGBNYWxmb3JtZWQgdGltZXN0YW1wIGtleTogJHtrZXl9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXBvY2g6IE51bWJlci5wYXJzZUludChrZXkuc3Vic3RyaW5nKDAsIGkxKSwgMTApLFxuICAgIGNsb2NrOiBOdW1iZXIucGFyc2VJbnQoa2V5LnN1YnN0cmluZyhpMSArIDEsIGkyKSwgMTApLFxuICAgIGNsaWVudElkOiBrZXkuc3Vic3RyaW5nKGkyICsgMSwgaTMpLFxuICAgIHdhbGxDbG9jazogTnVtYmVyLnBhcnNlSW50KGtleS5zdWJzdHJpbmcoaTMgKyAxKSwgMTApLFxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHR4IHRpbWVzdGFtcHMgZm9yIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gKiBTb3J0IG9yZGVyOiBlcG9jaCAoYXNjKSDihpIgY2xvY2sgKGFzYykg4oaSIGNsaWVudElkIChhc2MpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVHhUaW1lc3RhbXBzKGE6IFR4VGltZXN0YW1wLCBiOiBUeFRpbWVzdGFtcCk6IG51bWJlciB7XG4gIGlmIChhLmVwb2NoICE9PSBiLmVwb2NoKSByZXR1cm4gYS5lcG9jaCAtIGIuZXBvY2hcbiAgaWYgKGEuY2xvY2sgIT09IGIuY2xvY2spIHJldHVybiBhLmNsb2NrIC0gYi5jbG9ja1xuICBpZiAoYS5jbGllbnRJZCA8IGIuY2xpZW50SWQpIHJldHVybiAtMVxuICBpZiAoYS5jbGllbnRJZCA+IGIuY2xpZW50SWQpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG4iLCJpbXBvcnQgdHlwZSAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBwYXJzZVR4VGltZXN0YW1wS2V5LCB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIEEgY2FjaGVkIHR4IGVudHJ5IHdpdGggbGF6eSBwYXJzaW5nIGFuZCBvcHRpb25hbCB0eCBjYWNoaW5nLlxuICogVGhlIHRpbWVzdGFtcCBpcyBwYXJzZWQgb24gZmlyc3QgYWNjZXNzIGFuZCBjYWNoZWQuXG4gKiBUaGUgdHggcmVjb3JkIGNhbiBiZSBmZXRjaGVkIGxhemlseSBhbmQgY2FjaGVkLlxuICovXG5leHBvcnQgY2xhc3MgU29ydGVkVHhFbnRyeSB7XG4gIHByaXZhdGUgX3R4VGltZXN0YW1wPzogVHhUaW1lc3RhbXBcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUeFRpbWVzdGFtcEtleT86IFR4VGltZXN0YW1wS2V5IHwgbnVsbFxuICBwcml2YXRlIF9vcmlnaW5hbFR4VGltZXN0YW1wPzogVHhUaW1lc3RhbXAgfCBudWxsXG4gIHByaXZhdGUgX3R4UmVjb3JkPzogVHhSZWNvcmRcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0eFRpbWVzdGFtcEtleTogVHhUaW1lc3RhbXBLZXksXG4gICAgcHJpdmF0ZSByZWFkb25seSBfeVR4OiBZLk1hcDxUeFJlY29yZD5cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgdGltZXN0YW1wLCBsYXppbHkgcGFyc2luZyBhbmQgY2FjaGluZyBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICBnZXQgdHhUaW1lc3RhbXAoKTogVHhUaW1lc3RhbXAge1xuICAgIGlmICghdGhpcy5fdHhUaW1lc3RhbXApIHtcbiAgICAgIHRoaXMuX3R4VGltZXN0YW1wID0gcGFyc2VUeFRpbWVzdGFtcEtleSh0aGlzLnR4VGltZXN0YW1wS2V5KVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHhUaW1lc3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvcmlnaW5hbCB0eCB0aW1lc3RhbXAga2V5LCBsYXppbHkgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgZ2V0IG9yaWdpbmFsVHhUaW1lc3RhbXBLZXkoKTogVHhUaW1lc3RhbXBLZXkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0eCA9IHRoaXMudHhSZWNvcmRcbiAgICAgIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPSB0eC5vcmlnaW5hbFR4S2V5ID8/IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgb3JpZ2luYWwgdHggdGltZXN0YW1wLCBsYXppbHkgcGFyc2luZyBhbmQgY2FjaGluZyBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICBnZXQgb3JpZ2luYWxUeFRpbWVzdGFtcCgpOiBUeFRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICh0aGlzLl9vcmlnaW5hbFR4VGltZXN0YW1wID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMub3JpZ2luYWxUeFRpbWVzdGFtcEtleVxuICAgICAgdGhpcy5fb3JpZ2luYWxUeFRpbWVzdGFtcCA9IGtleSA/IHBhcnNlVHhUaW1lc3RhbXBLZXkoa2V5KSA6IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsVHhUaW1lc3RhbXBcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2dpY2FsIChkZWR1cGxpY2F0ZWQpIHR4IHRpbWVzdGFtcCBrZXkuXG4gICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHR4IGtleSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB0aGUgcGh5c2ljYWwga2V5LlxuICAgKi9cbiAgZ2V0IGRlZHVwVHhUaW1lc3RhbXBLZXkoKTogVHhUaW1lc3RhbXBLZXkge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVHhUaW1lc3RhbXBLZXkgPz8gdGhpcy50eFRpbWVzdGFtcEtleVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvZ2ljYWwgKGRlZHVwbGljYXRlZCkgcGFyc2VkIHR4IHRpbWVzdGFtcC5cbiAgICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgdHggdGltZXN0YW1wIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBwaHlzaWNhbCB0aW1lc3RhbXAuXG4gICAqL1xuICBnZXQgZGVkdXBUeFRpbWVzdGFtcCgpOiBUeFRpbWVzdGFtcCB7XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxUeFRpbWVzdGFtcCA/PyB0aGlzLnR4VGltZXN0YW1wXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHggcmVjb3JkLCBsYXppbHkgZmV0Y2hpbmcgYW5kIGNhY2hpbmcgb24gZmlyc3QgYWNjZXNzLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgdHggZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGdldCB0eFJlY29yZCgpOiBUeFJlY29yZCB7XG4gICAgaWYgKCF0aGlzLl90eFJlY29yZCkge1xuICAgICAgdGhpcy5fdHhSZWNvcmQgPSB0aGlzLl95VHguZ2V0KHRoaXMudHhUaW1lc3RhbXBLZXkpXG4gICAgICBpZiAoIXRoaXMuX3R4UmVjb3JkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoYFNvcnRlZFR4RW50cnk6IFR4UmVjb3JkIG5vdCBmb3VuZCBmb3Iga2V5ICR7dGhpcy50eFRpbWVzdGFtcEtleX1gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHhSZWNvcmRcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgdHlwZSBDaGVja3BvaW50UmVjb3JkLCB0eXBlIENsaWVudFdhdGVybWFya3MgfSBmcm9tIFwiLi9jaGVja3BvaW50c1wiXG5pbXBvcnQgeyBhcHBseVR4SW1tdXRhYmxlIH0gZnJvbSBcIi4vZHJhZnRcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AsIFZhbGlkYXRlRm4gfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcbmltcG9ydCB7IGNvbXB1dGVSZWNvbmNpbGVPcHMgfSBmcm9tIFwiLi9yZWNvbmNpbGVcIlxuaW1wb3J0IHsgU29ydGVkVHhFbnRyeSB9IGZyb20gXCIuL1NvcnRlZFR4RW50cnlcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBjb21wYXJlVHhUaW1lc3RhbXBzLCB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYSB0cmFuc2FjdGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBjaGVja3BvaW50IHdhdGVybWFya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zYWN0aW9uSW5DaGVja3BvaW50KHRzOiBUeFRpbWVzdGFtcCwgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyk6IGJvb2xlYW4ge1xuICBjb25zdCB3bSA9IHdhdGVybWFya3NbdHMuY2xpZW50SWRdXG4gIGlmICghd20pIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHMuY2xvY2sgPD0gd20ubWF4Q2xvY2tcbn1cblxuLyoqXG4gKiBTdGF0ZUNhbGN1bGF0b3IgZW5jYXBzdWxhdGVzIHRoZSBzb3J0ZWQgdHJhbnNhY3Rpb24gY2FjaGUgYW5kIHN0YXRlIGNhbGN1bGF0aW9uIGxvZ2ljLlxuICpcbiAqIEl0IG1haW50YWluczpcbiAqIC0gQSBzb3J0ZWQgYXJyYXkgb2YgdHJhbnNhY3Rpb24gZW50cmllc1xuICogLSBBIG1hcCBmb3IgTygxKSBsb29rdXBcbiAqIC0gQSB0cmFja2luZyBpbmRleCBpbmRpY2F0aW5nIHVwIHRvIHdoaWNoIHR4IHRoZSBzdGF0ZSBoYXMgYmVlbiBjYWxjdWxhdGVkXG4gKiAtIFRoZSBjYWNoZWQgY2FsY3VsYXRlZCBzdGF0ZVxuICogLSBUaGUgYmFzZSBjaGVja3BvaW50XG4gKlxuICogVGhlIHRyYWNraW5nIGluZGV4IGlzIGludmFsaWRhdGVkIChzZXQgdG8gbnVsbCkgd2hlbjpcbiAqIC0gQSB0cmFuc2FjdGlvbiBpcyBpbnNlcnRlZCBiZWZvcmUgdGhlIGFscmVhZHktY2FsY3VsYXRlZCBzbGljZVxuICogLSBBIHRyYW5zYWN0aW9uIGlzIGRlbGV0ZWQgZnJvbSB0aGUgYWxyZWFkeS1jYWxjdWxhdGVkIHNsaWNlXG4gKiAtIFRoZSBiYXNlIGNoZWNrcG9pbnQgY2hhbmdlc1xuICovXG5leHBvcnQgY2xhc3MgU3RhdGVDYWxjdWxhdG9yIHtcbiAgLyoqIFNvcnRlZCB0eCBjYWNoZSAoQUxMIGFjdGl2ZS9mdXR1cmUgdHhzLCBrZXB0IHNvcnRlZCBieSB0aW1lc3RhbXApICovXG4gIHByaXZhdGUgc29ydGVkVHhzOiBTb3J0ZWRUeEVudHJ5W10gPSBbXVxuXG4gIC8qKiBPKDEpIGV4aXN0ZW5jZSBjaGVjayBhbmQgbG9va3VwICovXG4gIHByaXZhdGUgc29ydGVkVHhzTWFwOiBNYXA8VHhUaW1lc3RhbXBLZXksIFNvcnRlZFR4RW50cnk+ID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIEluZGV4IG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGFwcGxpZWQgdG8gY2FjaGVkU3RhdGUuXG4gICAqIC0gbnVsbDogc3RhdGUgbmVlZHMgZnVsbCByZWNhbGN1bGF0aW9uIGZyb20gY2hlY2twb2ludFxuICAgKiAtIC0xOiBubyB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWQgeWV0IChzdGF0ZSA9PT0gY2hlY2twb2ludCBzdGF0ZSlcbiAgICogLSA+PSAwOiB0cmFuc2FjdGlvbnMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGluZGV4IGhhdmUgYmVlbiBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGxhc3RBcHBsaWVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgLyoqIFRoZSBjYWNoZWQgY2FsY3VsYXRlZCBzdGF0ZSAqL1xuICBwcml2YXRlIGNhY2hlZFN0YXRlOiBKU09OT2JqZWN0IHwgbnVsbCA9IG51bGxcblxuICAvKiogVGhlIGJhc2UgY2hlY2twb2ludCB0byBjYWxjdWxhdGUgc3RhdGUgZnJvbSAqL1xuICBwcml2YXRlIGJhc2VDaGVja3BvaW50OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogQXBwbGllZCBkZWR1cCBrZXlzIC0gdHJhY2tzIHdoaWNoIExPR0lDQUwgdHhzIGhhdmUgYmVlbiBhcHBsaWVkLlxuICAgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbFR4S2V5IChvciBwaHlzaWNhbCBrZXkgaWYgbm8gb3JpZ2luYWwpIGZvciBlYWNoIGFwcGxpZWQgdHguXG4gICAqIFVzZWQgdG8gcHJvcGVybHkgZGVkdXBsaWNhdGUgcmUtZW1pdHMuXG4gICAqL1xuICBwcml2YXRlIGFwcGxpZWRUeEtleXM6IFNldDxUeFRpbWVzdGFtcEtleT4gPSBuZXcgU2V0KClcblxuICAvKiogTWF4IGNsb2NrIHNlZW4gZnJvbSBhbnkgdHJhbnNhY3Rpb24gKGZvciBMYW1wb3J0IGNsb2NrIHVwZGF0ZXMpICovXG4gIHByaXZhdGUgbWF4U2VlbkNsb2NrID0gMFxuXG4gIC8qKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIChvcHRpb25hbCkgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZuPzogVmFsaWRhdGVGbjxKU09OT2JqZWN0PlxuXG4gIGNvbnN0cnVjdG9yKHZhbGlkYXRlRm4/OiBWYWxpZGF0ZUZuPEpTT05PYmplY3Q+KSB7XG4gICAgdGhpcy52YWxpZGF0ZUZuID0gdmFsaWRhdGVGblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJhc2UgY2hlY2twb2ludC4gSW52YWxpZGF0ZXMgY2FjaGVkIHN0YXRlIGlmIGNoZWNrcG9pbnQgY2hhbmdlZC5cbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hlY2twb2ludCBjaGFuZ2VkXG4gICAqL1xuICBzZXRCYXNlQ2hlY2twb2ludChjaGVja3BvaW50OiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChjaGVja3BvaW50ID09PSB0aGlzLmJhc2VDaGVja3BvaW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLmJhc2VDaGVja3BvaW50ID0gY2hlY2twb2ludFxuICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGJhc2UgY2hlY2twb2ludC5cbiAgICovXG4gIGdldEJhc2VDaGVja3BvaW50KCk6IENoZWNrcG9pbnRSZWNvcmQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ2hlY2twb2ludFxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgdHJhbnNhY3Rpb25zIGFuZCByZWJ1aWxkcyBmcm9tIHlUeCBtYXAuXG4gICAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjaGVja3BvaW50IGNoYW5nZXMgYW5kIHdlIG5lZWQgYSBmcmVzaCBzdGFydC5cbiAgICovXG4gIHJlYnVpbGRGcm9tWWpzKHlUeDogWS5NYXA8VHhSZWNvcmQ+KTogdm9pZCB7XG4gICAgdGhpcy5zb3J0ZWRUeHMgPSBbXVxuICAgIHRoaXMuc29ydGVkVHhzTWFwLmNsZWFyKClcblxuICAgIC8vIENvbGxlY3QgYWxsIGVudHJpZXMsIGJ1aWxkIHRoZSBtYXAgYW5kIG1heCBjbG9ja1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHlUeC5rZXlzKCkpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IFNvcnRlZFR4RW50cnkoa2V5LCB5VHgpXG4gICAgICB0aGlzLnNvcnRlZFR4cy5wdXNoKGVudHJ5KVxuXG4gICAgICB0aGlzLnNvcnRlZFR4c01hcC5zZXQoZW50cnkudHhUaW1lc3RhbXBLZXksIGVudHJ5KVxuICAgICAgaWYgKGVudHJ5LnR4VGltZXN0YW1wLmNsb2NrID4gdGhpcy5tYXhTZWVuQ2xvY2spIHtcbiAgICAgICAgdGhpcy5tYXhTZWVuQ2xvY2sgPSBlbnRyeS50eFRpbWVzdGFtcC5jbG9ja1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgb25jZSAtIE8obiBsb2cgbilcbiAgICB0aGlzLnNvcnRlZFR4cy5zb3J0KChhLCBiKSA9PiBjb21wYXJlVHhUaW1lc3RhbXBzKGEudHhUaW1lc3RhbXAsIGIudHhUaW1lc3RhbXApKVxuXG4gICAgLy8gSW52YWxpZGF0ZSBjYWNoZWQgc3RhdGUgc2luY2Ugd2UgcmVidWlsdFxuICAgIHRoaXMuaW52YWxpZGF0ZSgpXG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0cyBhIHRyYW5zYWN0aW9uIGludG8gdGhlIHNvcnRlZCBjYWNoZS5cbiAgICogSW52YWxpZGF0ZXMgY2FjaGVkIHN0YXRlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBjYWxjdWxhdGVkIHNsaWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgY2F1c2VkIGludmFsaWRhdGlvbiAob3V0LW9mLW9yZGVyIGluc2VydClcbiAgICovXG4gIGluc2VydFR4KGtleTogVHhUaW1lc3RhbXBLZXksIHlUeDogWS5NYXA8VHhSZWNvcmQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc29ydGVkVHhzTWFwLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2UgLy8gQWxyZWFkeSBleGlzdHNcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeSA9IG5ldyBTb3J0ZWRUeEVudHJ5KGtleSwgeVR4KVxuICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcblxuICAgIC8vIFVwZGF0ZSBtYXggc2VlbiBjbG9jayBmb3IgTGFtcG9ydCBjbG9jayBtZWNoYW5pc21cbiAgICBpZiAodHMuY2xvY2sgPiB0aGlzLm1heFNlZW5DbG9jaykge1xuICAgICAgdGhpcy5tYXhTZWVuQ2xvY2sgPSB0cy5jbG9ja1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZFR4cyA9IHRoaXMuc29ydGVkVHhzXG5cbiAgICAvLyBGaW5kIGluc2VydGlvbiBwb3NpdGlvbiAoc2VhcmNoIGZyb20gZW5kIHNpbmNlIG5ldyB0eHMgdHlwaWNhbGx5IGhhdmUgaGlnaGVyIHRpbWVzdGFtcHMpXG4gICAgbGV0IGluc2VydEluZGV4ID0gc29ydGVkVHhzLmxlbmd0aCAvLyBEZWZhdWx0OiBhcHBlbmQgYXQgZW5kXG4gICAgZm9yIChsZXQgaSA9IHNvcnRlZFR4cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdUcyA9IHNvcnRlZFR4c1tpXS50eFRpbWVzdGFtcFxuICAgICAgaWYgKGNvbXBhcmVUeFRpbWVzdGFtcHModHMsIGV4aXN0aW5nVHMpID49IDApIHtcbiAgICAgICAgaW5zZXJ0SW5kZXggPSBpICsgMVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgaW5zZXJ0SW5kZXggPSAwIC8vIEluc2VydCBhdCBiZWdpbm5pbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgYXQgdGhlIGZvdW5kIHBvc2l0aW9uXG4gICAgc29ydGVkVHhzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgZW50cnkpXG4gICAgdGhpcy5zb3J0ZWRUeHNNYXAuc2V0KGtleSwgZW50cnkpXG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGludmFsaWRhdGVzIG91ciBjYWNoZWQgc3RhdGVcbiAgICAvLyBJZiB3ZSBpbnNlcnRlZCBiZWZvcmUgb3IgYXQgdGhlIGxhc3QgYXBwbGllZCBpbmRleCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZVxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggIT09IG51bGwgJiYgaW5zZXJ0SW5kZXggPD0gdGhpcy5sYXN0QXBwbGllZEluZGV4KSB7XG4gICAgICB0aGlzLmludmFsaWRhdGUoKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBzb3J0ZWQgY2FjaGUuXG4gICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVtb3ZlZFxuICAgKi9cbiAgcmVtb3ZlVHhzKGtleXM6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W10pOiBudW1iZXIge1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwXG4gICAgbGV0IG1pblJlbW92ZWRJbmRleCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuXG4gICAgLy8gQnVpbGQgc2V0IG9mIGtleXMgdG8gZGVsZXRlIGFuZCB0cmFjayB0aGVpciBpbmRpY2VzXG4gICAgY29uc3QgdG9EZWxldGUgPSBuZXcgU2V0PFR4VGltZXN0YW1wS2V5PigpXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnNvcnRlZFR4c01hcC5nZXQoa2V5KVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIHRoaXMuc29ydGVkVHhzTWFwLmRlbGV0ZShrZXkpXG4gICAgICAgIHRvRGVsZXRlLmFkZChrZXkpXG5cbiAgICAgICAgLy8gRmluZCBpbmRleCBmb3IgaW52YWxpZGF0aW9uIGNoZWNrXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zb3J0ZWRUeHMuaW5kZXhPZihlbnRyeSlcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCA8IG1pblJlbW92ZWRJbmRleCkge1xuICAgICAgICAgIG1pblJlbW92ZWRJbmRleCA9IGluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9EZWxldGUuc2l6ZSA9PT0gMCkgcmV0dXJuIDBcblxuICAgIC8vIFNpbmdsZSBmb3J3YXJkIHBhc3MgdGhyb3VnaCBzb3J0ZWRUeHMsIHJlbW92aW5nIG1hdGNoaW5nIGVudHJpZXNcbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChpIDwgc29ydGVkVHhzLmxlbmd0aCAmJiB0b0RlbGV0ZS5zaXplID4gMCkge1xuICAgICAgaWYgKHRvRGVsZXRlLmhhcyhzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBLZXkpKSB7XG4gICAgICAgIHRvRGVsZXRlLmRlbGV0ZShzb3J0ZWRUeHNbaV0udHhUaW1lc3RhbXBLZXkpXG4gICAgICAgIHNvcnRlZFR4cy5zcGxpY2UoaSwgMSlcbiAgICAgICAgcmVtb3ZlZENvdW50KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrK1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaW52YWxpZGF0ZXMgb3VyIGNhY2hlZCBzdGF0ZVxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggIT09IG51bGwgJiYgbWluUmVtb3ZlZEluZGV4IDw9IHRoaXMubGFzdEFwcGxpZWRJbmRleCkge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlZENvdW50XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdHJhbnNhY3Rpb24ga2V5IGV4aXN0cyBpbiB0aGUgY2FjaGUuXG4gICAqL1xuICBoYXNUeChrZXk6IFR4VGltZXN0YW1wS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ydGVkVHhzTWFwLmhhcyhrZXkpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHRyYW5zYWN0aW9uIGVudHJ5IGJ5IGtleS5cbiAgICovXG4gIGdldFR4KGtleTogVHhUaW1lc3RhbXBLZXkpOiBTb3J0ZWRUeEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHNNYXAuZ2V0KGtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBzb3J0ZWQgdHJhbnNhY3Rpb24gZW50cmllcy5cbiAgICovXG4gIGdldFNvcnRlZFR4cygpOiByZWFkb25seSBTb3J0ZWRUeEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgZ2V0IHR4Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRUeHMubGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdGF0ZSBuZWVkcyBmdWxsIHJlY2FsY3VsYXRpb24uXG4gICAqL1xuICBuZWVkc0Z1bGxSZWNhbGN1bGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPT09IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlcyB0aGUgY2FjaGVkIHN0YXRlLCBmb3JjaW5nIGEgZnVsbCByZWNhbGN1bGF0aW9uIG9uIG5leHQgY2FsY3VsYXRlU3RhdGUoKS5cbiAgICogTm90ZTogY2FjaGVkU3RhdGUgaXMga2VwdCBzbyBjb21wdXRlUmVjb25jaWxlT3BzIGNhbiBkaWZmIG9sZCB2cyBuZXcgc3RhdGUuXG4gICAqL1xuICBpbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlLCBhbG9uZyB3aXRoIGEgbGF6eSBnZXR0ZXIgZm9yIG9wcyB0aGF0IGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAqXG4gICAqIC0gSWYgbGFzdEFwcGxpZWRJbmRleCBpcyBudWxsOiBmdWxsIHJlY2FsY3VsYXRpb24gZnJvbSBjaGVja3BvaW50XG4gICAqIC0gSWYgbGFzdEFwcGxpZWRJbmRleCA+PSAtMTogaW5jcmVtZW50YWwgYXBwbHkgZnJvbSBsYXN0QXBwbGllZEluZGV4ICsgMVxuICAgKi9cbiAgY2FsY3VsYXRlU3RhdGUoKTogeyBzdGF0ZTogSlNPTk9iamVjdDsgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSB9IHtcbiAgICBjb25zdCBiYXNlU3RhdGU6IEpTT05PYmplY3QgPSB0aGlzLmJhc2VDaGVja3BvaW50Py5zdGF0ZSA/PyB7fVxuICAgIGNvbnN0IHdhdGVybWFya3MgPSB0aGlzLmJhc2VDaGVja3BvaW50Py53YXRlcm1hcmtzID8/IHt9XG4gICAgY29uc3QgaGFzV2F0ZXJtYXJrcyA9IE9iamVjdC5rZXlzKHdhdGVybWFya3MpLmxlbmd0aCA+IDBcblxuICAgIGlmICh0aGlzLmxhc3RBcHBsaWVkSW5kZXggPT09IG51bGwpIHtcbiAgICAgIC8vIFNMT1cgUEFUSDogRnVsbCByZWNhbGN1bGF0aW9uXG4gICAgICByZXR1cm4gdGhpcy5mdWxsUmVjYWxjdWxhdGlvbihiYXNlU3RhdGUsIHdhdGVybWFya3MsIGhhc1dhdGVybWFya3MpXG4gICAgfVxuXG4gICAgLy8gRkFTVCBQQVRIOiBJbmNyZW1lbnRhbCBhcHBseVxuICAgIHJldHVybiB0aGlzLmluY3JlbWVudGFsQXBwbHkod2F0ZXJtYXJrcywgaGFzV2F0ZXJtYXJrcylcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIHJlY2FsY3VsYXRpb24gb2Ygc3RhdGUgZnJvbSB0aGUgYmFzZSBjaGVja3BvaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBmdWxsUmVjYWxjdWxhdGlvbihcbiAgICBiYXNlU3RhdGU6IEpTT05PYmplY3QsXG4gICAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyxcbiAgICBoYXNXYXRlcm1hcmtzOiBib29sZWFuXG4gICk6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gICAgY29uc3Qgb2xkU3RhdGUgPSB0aGlzLmNhY2hlZFN0YXRlID8/IHt9XG5cbiAgICAvLyBSZXNldCB0cmFja2luZyBmb3IgZnVsbCByZWNvbXB1dGVcbiAgICB0aGlzLmFwcGxpZWRUeEtleXMuY2xlYXIoKVxuICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IC0xXG4gICAgdGhpcy5jYWNoZWRTdGF0ZSA9IGJhc2VTdGF0ZVxuXG4gICAgLy8gRGVsZWdhdGUgdG8gaW5jcmVtZW50YWwgYXBwbHkgdG8gcmVwbGF5IGFsbCB0cmFuc2FjdGlvbnNcbiAgICAvLyBXZSBpZ25vcmUgdGhlIHJldHVybmVkIG9wcyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHRoZSBvcGVyYXRpb25zIGFwcGxpZWQgZnJvbSB0aGUgYmFzZSBzdGF0ZSxcbiAgICAvLyB3aGVyZWFzIHdlIHdhbnQgdGhlIGRpZmYgZnJvbSB0aGUgKnByZXZpb3VzIGNhY2hlZCBzdGF0ZSouXG4gICAgLy8gV2UgcGFzcyByZXR1cm5PcHM9ZmFsc2UgdG8gYXZvaWQgY29sbGVjdGluZyBvcHMgZHVyaW5nIHJlcGxheS5cbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLmluY3JlbWVudGFsQXBwbHkod2F0ZXJtYXJrcywgaGFzV2F0ZXJtYXJrcywgZmFsc2UpXG5cbiAgICAvLyBMYXp5IGxvYWQgdGhlIHJlY29uY2lsaWF0aW9uIG9wcyAoZXhwZW5zaXZlIGRpZmYpXG4gICAgY29uc3QgZ2V0QXBwbGllZE9wcyA9IGxhenkoKCkgPT4gY29tcHV0ZVJlY29uY2lsZU9wcyhvbGRTdGF0ZSwgc3RhdGUpKVxuXG4gICAgcmV0dXJuIHsgc3RhdGUsIGdldEFwcGxpZWRPcHMgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudGFsIGFwcGx5IG9mIHRyYW5zYWN0aW9ucyBmcm9tIGxhc3RBcHBsaWVkSW5kZXggKyAxLlxuICAgKiBAcGFyYW0gcmV0dXJuT3BzIElmIHRydWUsIGNvbGxlY3RzIGFwcGxpZWQgdHJhbnNhY3Rpb25zICh0byBsYXp5IGNvbXB1dGUgb3BzKS4gSWYgZmFsc2UsIHNraXBzIGNvbGxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGluY3JlbWVudGFsQXBwbHkoXG4gICAgd2F0ZXJtYXJrczogQ2xpZW50V2F0ZXJtYXJrcyxcbiAgICBoYXNXYXRlcm1hcmtzOiBib29sZWFuLFxuICAgIHJldHVybk9wcyA9IHRydWVcbiAgKTogeyBzdGF0ZTogSlNPTk9iamVjdDsgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSB9IHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNhY2hlZFN0YXRlIGFzIEpTT05PYmplY3RcbiAgICBjb25zdCBhcHBsaWVkVHhzOiBUeFJlY29yZFtdID0gW11cbiAgICBjb25zdCBzb3J0ZWRUeHMgPSB0aGlzLnNvcnRlZFR4c1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmxhc3RBcHBsaWVkSW5kZXghICsgMVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBzb3J0ZWRUeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc29ydGVkVHhzW2ldXG4gICAgICBjb25zdCBkZWR1cEtleSA9IGVudHJ5LmRlZHVwVHhUaW1lc3RhbXBLZXlcblxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGFwcGxpZWQgKGRlZHVwbGljYXRpb24pXG4gICAgICBpZiAodGhpcy5hcHBsaWVkVHhLZXlzLmhhcyhkZWR1cEtleSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBpbiBjaGVja3BvaW50XG4gICAgICBpZiAoaGFzV2F0ZXJtYXJrcykge1xuICAgICAgICBjb25zdCBkZWR1cFRzID0gZW50cnkuZGVkdXBUeFRpbWVzdGFtcFxuICAgICAgICBpZiAoaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludChkZWR1cFRzLCB3YXRlcm1hcmtzKSkge1xuICAgICAgICAgIHRoaXMuYXBwbGllZFR4S2V5cy5hZGQoZGVkdXBLZXkpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0eCA9IGVudHJ5LnR4UmVjb3JkXG5cbiAgICAgIC8vIEFwcGx5IHRyYW5zYWN0aW9uIDEtYnktMSB0byBhdm9pZCBkcmFmdCBjb250ZXh0IHBvbGx1dGlvbiBvbiB2YWxpZGF0aW9uIGZhaWx1cmVcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gYXBwbHlUeEltbXV0YWJsZShzdGF0ZSwgdHgsIHRoaXMudmFsaWRhdGVGbilcblxuICAgICAgaWYgKG5ld1N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlXG4gICAgICAgIGlmIChyZXR1cm5PcHMpIHtcbiAgICAgICAgICBhcHBsaWVkVHhzLnB1c2godHgpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBsaWVkVHhLZXlzLmFkZChkZWR1cEtleSlcbiAgICAgIHRoaXMubGFzdEFwcGxpZWRJbmRleCA9IGlcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGFzdEFwcGxpZWRJbmRleCB0byBlbmQgZXZlbiBpZiBhbGwgdHhzIHdlcmUgc2tpcHBlZFxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCByZS1wcm9jZXNzIHNraXBwZWQgdHhzIG9uIG5leHQgaW5jcmVtZW50YWwgYXBwbHlcbiAgICBpZiAoc29ydGVkVHhzLmxlbmd0aCA+IDAgJiYgdGhpcy5sYXN0QXBwbGllZEluZGV4ISA8IHNvcnRlZFR4cy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmxhc3RBcHBsaWVkSW5kZXggPSBzb3J0ZWRUeHMubGVuZ3RoIC0gMVxuICAgIH1cblxuICAgIHRoaXMuY2FjaGVkU3RhdGUgPSBzdGF0ZVxuXG4gICAgLy8gTGF6eSBnZXR0ZXIgZm9yIG9wcyAoZmxhdHRlbnMgYXBwbGllZCB0eHMpXG4gICAgY29uc3QgZ2V0QXBwbGllZE9wcyA9IGxhenkoKCkgPT4ge1xuICAgICAgY29uc3Qgb3BzOiBPcFtdID0gW11cbiAgICAgIGZvciAoY29uc3QgdHggb2YgYXBwbGllZFR4cykge1xuICAgICAgICBvcHMucHVzaCguLi50eC5vcHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3BzXG4gICAgfSlcblxuICAgIHJldHVybiB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtYXggc2VlbiBjbG9jayAoZm9yIExhbXBvcnQgY2xvY2sgdXBkYXRlcykuXG4gICAqL1xuICBnZXRNYXhTZWVuQ2xvY2soKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhTZWVuQ2xvY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGNhY2hlZCBzdGF0ZSB3aXRob3V0IHJlY2FsY3VsYXRpbmcuXG4gICAqIFJldHVybnMgbnVsbCBpZiBzdGF0ZSBoYXMgbmV2ZXIgYmVlbiBjYWxjdWxhdGVkLlxuICAgKi9cbiAgZ2V0Q2FjaGVkU3RhdGUoKTogSlNPTk9iamVjdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNhY2hlZFN0YXRlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBhcHBsaWVkIHRpbWVzdGFtcC5cbiAgICovXG4gIGdldExhc3RBcHBsaWVkVHMoKTogVHhUaW1lc3RhbXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5sYXN0QXBwbGllZEluZGV4ID09PSBudWxsIHx8IHRoaXMubGFzdEFwcGxpZWRJbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvcnRlZFR4c1t0aGlzLmxhc3RBcHBsaWVkSW5kZXhdPy50eFRpbWVzdGFtcCA/PyBudWxsXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFzdCBhcHBsaWVkIGluZGV4IChmb3IgZGVidWdnaW5nL3RyYWNraW5nKS5cbiAgICovXG4gIGdldExhc3RBcHBsaWVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEFwcGxpZWRJbmRleFxuICB9XG59XG4iLCJpbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5pbXBvcnQgeyBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5pbXBvcnQgeyBTdGF0ZUNhbGN1bGF0b3IgfSBmcm9tIFwiLi9TdGF0ZUNhbGN1bGF0b3JcIlxuXG4vKipcbiAqIENsaWVudC1zaWRlIHN0YXRlIGluY2x1ZGluZyBjbG9ja3MgYW5kIGNhbGN1bGF0b3IgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRTdGF0ZSB7XG4gIC8vIExhbXBvcnQgY2xvY2tzIChtb25vdG9uaWMsIG5ldmVyIHJlc2V0KVxuICBsb2NhbENsb2NrOiBudW1iZXJcblxuICAvLyBDYWNoZWQgZmluYWxpemVkIGVwb2NoIChudWxsID0gbm90IHlldCBpbml0aWFsaXplZCwgcmVjYWxjdWxhdGVkIG9ubHkgd2hlbiBjaGVja3BvaW50IG1hcCBjaGFuZ2VzKVxuICBjYWNoZWRGaW5hbGl6ZWRFcG9jaDogbnVtYmVyIHwgbnVsbFxuXG4gIC8vIFN0YXRlIGNhbGN1bGF0b3IgKG1hbmFnZXMgc29ydGVkIHR4IGNhY2hlLCBzdGF0ZSBjYWxjdWxhdGlvbiwgYW5kIGludmFsaWRhdGlvbilcbiAgc3RhdGVDYWxjdWxhdG9yOiBTdGF0ZUNhbGN1bGF0b3JcblxuICAvKipcbiAgICogVGltZXN0YW1wIHJldGVudGlvbiB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmV0ZW50aW9uV2luZG93TXM6IG51bWJlclxufVxuXG4vKipcbiAqIEZhY3RvcnkgdG8gY3JlYXRlIGFuIGluaXRpYWwgQ2xpZW50U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudFN0YXRlKFxuICB2YWxpZGF0ZUZuOiBWYWxpZGF0ZUZuPEpTT05PYmplY3Q+IHwgdW5kZWZpbmVkLFxuICByZXRlbnRpb25XaW5kb3dNczogbnVtYmVyXG4pOiBDbGllbnRTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxDbG9jazogMCxcbiAgICBjYWNoZWRGaW5hbGl6ZWRFcG9jaDogbnVsbCwgLy8gV2lsbCBiZSByZWNhbGN1bGF0ZWQgb24gZmlyc3QgcnVuXG4gICAgc3RhdGVDYWxjdWxhdG9yOiBuZXcgU3RhdGVDYWxjdWxhdG9yKHZhbGlkYXRlRm4pLFxuICAgIHJldGVudGlvbldpbmRvd01zLFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgdHlwZSBDaGVja3BvaW50UmVjb3JkLCBwcnVuZUNoZWNrcG9pbnRzIH0gZnJvbSBcIi4vY2hlY2twb2ludHNcIlxuaW1wb3J0IHsgZ2V0RmluYWxpemVkRXBvY2hBbmRDaGVja3BvaW50IH0gZnJvbSBcIi4vY2hlY2twb2ludFV0aWxzXCJcbmltcG9ydCB7IENsaWVudFN0YXRlIH0gZnJvbSBcIi4vY2xpZW50U3RhdGVcIlxuaW1wb3J0IHsgSlNPTk9iamVjdCB9IGZyb20gXCIuL2pzb25cIlxuaW1wb3J0IHsgT3AgfSBmcm9tIFwiLi9vcGVyYXRpb25zXCJcbmltcG9ydCB7IFNvcnRlZFR4RW50cnkgfSBmcm9tIFwiLi9Tb3J0ZWRUeEVudHJ5XCJcbmltcG9ydCB7IGlzVHJhbnNhY3Rpb25JbkNoZWNrcG9pbnQgfSBmcm9tIFwiLi9TdGF0ZUNhbGN1bGF0b3JcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyB0eXBlIFR4VGltZXN0YW1wLCB0eXBlIFR4VGltZXN0YW1wS2V5LCB0eFRpbWVzdGFtcFRvS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuXG4vKipcbiAqIENoYW5nZXMgdG8gdHJhbnNhY3Rpb24ga2V5cyBmcm9tIGEgWS5ZTWFwRXZlbnQuXG4gKiAtIGFkZGVkOiBrZXlzIHRoYXQgd2VyZSBhZGRlZFxuICogLSBkZWxldGVkOiBrZXlzIHRoYXQgd2VyZSBkZWxldGVkXG4gKi9cbmV4cG9ydCB0eXBlIFR4S2V5Q2hhbmdlcyA9IHtcbiAgYWRkZWQ6IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W11cbiAgZGVsZXRlZDogcmVhZG9ubHkgVHhUaW1lc3RhbXBLZXlbXVxufVxuXG4vKipcbiAqIEFwcGVuZHMgYSBuZXcgdHJhbnNhY3Rpb24gdG8gdGhlIGxvZy5cbiAqXG4gKiBAcGFyYW0gb3JpZ2luYWxLZXkgLSBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGtleSBmb3IgcmUtZW1pdHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICBVc2VkIGJ5IHN5bmNMb2cgdG8gcHJlc2VydmUgdHJhbnNhY3Rpb25zIG1pc3NlZCBieSBjaGVja3BvaW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFR4KFxuICBvcHM6IHJlYWRvbmx5IE9wW10sXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICBhY3RpdmVFcG9jaDogbnVtYmVyLFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgb3JpZ2luYWxLZXk/OiBUeFRpbWVzdGFtcEtleVxuKTogVHhUaW1lc3RhbXBLZXkge1xuICBjb25zdCBjYWxjID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yXG5cbiAgLy8gMS4gQWR2YW5jZSBsb2dpY2FsIGNsb2NrIChMYW1wb3J0KSBiYXNlZCBvbiBhbGwgc2VlbiB0cmFmZmljXG4gIGNvbnN0IGNsb2NrID0gTWF0aC5tYXgoY2xpZW50U3RhdGUubG9jYWxDbG9jaywgY2FsYy5nZXRNYXhTZWVuQ2xvY2soKSkgKyAxXG4gIGNsaWVudFN0YXRlLmxvY2FsQ2xvY2sgPSBjbG9ja1xuXG4gIC8vIDIuIEdlbmVyYXRlIEtleSB3aXRoIFdhbGxDbG9jayBmb3IgZnV0dXJlIHBydW5pbmcgc2FmZXR5XG4gIGNvbnN0IHRzOiBUeFRpbWVzdGFtcCA9IHtcbiAgICBlcG9jaDogYWN0aXZlRXBvY2gsXG4gICAgY2xvY2ssXG4gICAgY2xpZW50SWQ6IG15Q2xpZW50SWQsXG4gICAgd2FsbENsb2NrOiBEYXRlLm5vdygpLFxuICB9XG4gIGNvbnN0IGtleSA9IHR4VGltZXN0YW1wVG9LZXkodHMpXG5cbiAgLy8gMy4gV3JpdGUgdG8gWWpzIChBdG9taWMpXG4gIGNvbnN0IHJlY29yZDogVHhSZWNvcmQgPSB7IG9wcywgb3JpZ2luYWxUeEtleTogb3JpZ2luYWxLZXkgfVxuICB5VHguc2V0KGtleSwgcmVjb3JkKVxuXG4gIHJldHVybiBrZXlcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIHRyYW5zYWN0aW9uIGxvZyB3aXRoIHRoZSBjdXJyZW50IGNoZWNrcG9pbnQuXG4gKiBSZS1lbWl0cyBtaXNzZWQgdHJhbnNhY3Rpb25zIGFuZCBwcnVuZXMgb2xkIG9uZXMuXG4gKlxuICogU2hvdWxkIGJlIGNhbGxlZCBCRUZPUkUgdXBkYXRlU3RhdGUgdG8gZW5zdXJlIGxvZyBpcyBjbGVhbiBhbmQgY29tcGxldGUuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgdHJhbnNhY3Rpb25zIHdlcmUgcmUtZW1pdHRlZCBvciBkZWxldGVkLCB3aGljaCBtYXkgaW52YWxpZGF0ZSBsYXN0QXBwbGllZEluZGV4XG4gKi9cbmZ1bmN0aW9uIHN5bmNMb2coXG4gIHlUeDogWS5NYXA8VHhSZWNvcmQ+LFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgZmluYWxpemVkRXBvY2g6IG51bWJlcixcbiAgYmFzZUNQOiBDaGVja3BvaW50UmVjb3JkIHwgbnVsbCxcbiAgbmV3S2V5cz86IHJlYWRvbmx5IFR4VGltZXN0YW1wS2V5W10gLy8ga2V5cyBhZGRlZCBpbiB0aGlzIHVwZGF0ZVxuKTogdm9pZCB7XG4gIGNvbnN0IGNhbGMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3JcbiAgY29uc3QgYWN0aXZlRXBvY2ggPSBmaW5hbGl6ZWRFcG9jaCArIDFcbiAgY29uc3Qgd2F0ZXJtYXJrcyA9IGJhc2VDUD8ud2F0ZXJtYXJrcyA/PyB7fVxuXG4gIC8vIERldGVybWluaXN0aWMgUmVmZXJlbmNlIFRpbWU6IFVzZSBzdG9yZWQgbWluV2FsbENsb2NrIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIDAgKG5vdGhpbmcgYW5jaWVudCkuXG4gIGNvbnN0IHJlZmVyZW5jZVRpbWUgPSBiYXNlQ1A/Lm1pbldhbGxDbG9jayA/PyAwXG5cbiAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBydW5lZFxuICBjb25zdCBzaG91bGRQcnVuZSA9ICh0czogVHhUaW1lc3RhbXAsIGRlZHVwVHM6IFR4VGltZXN0YW1wKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgaXNBbmNpZW50ID0gcmVmZXJlbmNlVGltZSAtIHRzLndhbGxDbG9jayA+IGNsaWVudFN0YXRlLnJldGVudGlvbldpbmRvd01zXG4gICAgaWYgKGlzQW5jaWVudCkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gaXNUcmFuc2FjdGlvbkluQ2hlY2twb2ludChkZWR1cFRzLCB3YXRlcm1hcmtzKVxuICB9XG5cbiAgY29uc3QgdG9EZWxldGU6IFR4VGltZXN0YW1wS2V5W10gPSBbXVxuICBjb25zdCB0b1JlRW1pdDogQXJyYXk8eyBvcmlnaW5hbEtleTogVHhUaW1lc3RhbXBLZXk7IHR4OiBUeFJlY29yZCB9PiA9IFtdXG5cbiAgLy8gMS4gSGVscGVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggZWFjaCB0cmFuc2FjdGlvblxuICBjb25zdCBwcm9jZXNzRW50cnkgPSAoZW50cnk6IFNvcnRlZFR4RW50cnkpOiBib29sZWFuID0+IHtcbiAgICBpZiAoc2hvdWxkUHJ1bmUoZW50cnkudHhUaW1lc3RhbXAsIGVudHJ5LmRlZHVwVHhUaW1lc3RhbXApKSB7XG4gICAgICB0b0RlbGV0ZS5wdXNoKGVudHJ5LnR4VGltZXN0YW1wS2V5KVxuICAgICAgcmV0dXJuIGZhbHNlIC8vIGRlbGV0ZWRcbiAgICB9XG5cbiAgICBpZiAoZW50cnkudHhUaW1lc3RhbXAuZXBvY2ggPD0gZmluYWxpemVkRXBvY2gpIHtcbiAgICAgIC8vIE5vdCBpbiBjaGVja3BvaW50IGFuZCBzdGlsbCBmcmVzaCAtIHJlLWVtaXQgaXQgdG8gdGhlIGFjdGl2ZSBlcG9jaFxuICAgICAgdG9SZUVtaXQucHVzaCh7IG9yaWdpbmFsS2V5OiBlbnRyeS5kZWR1cFR4VGltZXN0YW1wS2V5LCB0eDogZW50cnkudHhSZWNvcmQgfSlcbiAgICAgIHRvRGVsZXRlLnB1c2goZW50cnkudHhUaW1lc3RhbXBLZXkpXG4gICAgICByZXR1cm4gZmFsc2UgLy8gcmUtZW1pdHRlZFxuICAgIH1cblxuICAgIHJldHVybiB0cnVlIC8vIGFjdGl2ZS9mcmVzaFxuICB9XG5cbiAgLy8gMi4gU2NhbiBsb2NhbCBjYWNoZSAoc29ydGVkVHhzKSB0byBpZGVudGlmeSBtaXNzaW5nL2FuY2llbnQgdHJhbnNhY3Rpb25zXG4gIGZvciAoY29uc3QgZW50cnkgb2YgY2FsYy5nZXRTb3J0ZWRUeHMoKSkge1xuICAgIGlmIChwcm9jZXNzRW50cnkoZW50cnkpKSB7XG4gICAgICAvLyBPcHRpbWl6YXRpb246IFBoeXNpY2FsIGtleXMgYXJlIHNvcnRlZC4gSWYgd2UgaGl0IHRoZSBhY3RpdmUvZnJlc2ggdGVycml0b3J5LCB3ZSBjYW4gc3RvcC5cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvY2Vzc0tleUJ5VGltZXN0YW1wS2V5ID0gKHR4VGltZXN0YW1wS2V5OiBUeFRpbWVzdGFtcEtleSk6IHZvaWQgPT4ge1xuICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBpdCBhY3R1YWxseSBleGlzdHMgaW4gWWpzIE1hcFxuICAgIGlmICh5VHguaGFzKHR4VGltZXN0YW1wS2V5KSkge1xuICAgICAgcHJvY2Vzc0VudHJ5KG5ldyBTb3J0ZWRUeEVudHJ5KHR4VGltZXN0YW1wS2V5LCB5VHgpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFNjYW4gTkVXIGtleXMgZnJvbSBZanMgdG8gaGFuZGxlIGluY29taW5nIHRyYW5zYWN0aW9ucyAoc3luYylcbiAgLy8gQW55IGNsaWVudCBjYW4gcmUtZW1pdCAtIGRlZHVwbGljYXRpb24gdmlhIG9yaWdpbmFsVHhLZXkgaGFuZGxlcyBkdXBsaWNhdGVzLlxuICBpZiAobmV3S2V5cykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG5ld0tleXMpIHtcbiAgICAgIHByb2Nlc3NLZXlCeVRpbWVzdGFtcEtleShrZXkpXG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmUtZW1pdCBtaXNzZWQgdHJhbnNhY3Rpb25zIEJFRk9SRSBwcnVuaW5nXG4gIGZvciAoY29uc3QgeyBvcmlnaW5hbEtleSwgdHggfSBvZiB0b1JlRW1pdCkge1xuICAgIGNvbnN0IG5ld0tleSA9IGFwcGVuZFR4KHR4Lm9wcywgeVR4LCBhY3RpdmVFcG9jaCwgbXlDbGllbnRJZCwgY2xpZW50U3RhdGUsIG9yaWdpbmFsS2V5KVxuICAgIGNhbGMuaW5zZXJ0VHgobmV3S2V5LCB5VHgpXG4gIH1cblxuICAvLyA1LiBQcnVuZSBvbGQvZmluYWxpemVkL3JlZHVuZGFudCB0cmFuc2FjdGlvbnMgZnJvbSBZanMgTWFwXG4gIGZvciAoY29uc3Qga2V5IG9mIHRvRGVsZXRlKSB7XG4gICAgeVR4LmRlbGV0ZShrZXkpXG4gIH1cbiAgY2FsYy5yZW1vdmVUeHModG9EZWxldGUpXG59XG5cbi8qKlxuICogVGhlIHByaW1hcnkgdXBkYXRlIGZ1bmN0aW9uIHRoYXQgbWFpbnRhaW5zIGN1cnJlbnQgc3RhdGUuXG4gKlxuICogQHBhcmFtIHR4Q2hhbmdlcyAtIENoYW5nZXMgZnJvbSBZLllNYXBFdmVudC4gSWYgdW5kZWZpbmVkIChmaXJzdCBydW4pLCBwZXJmb3JtcyBhIGZ1bGwgc2Nhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKFxuICBkb2M6IFkuRG9jLFxuICB5VHg6IFkuTWFwPFR4UmVjb3JkPixcbiAgeUNoZWNrcG9pbnQ6IFkuTWFwPENoZWNrcG9pbnRSZWNvcmQ+LFxuICBteUNsaWVudElkOiBzdHJpbmcsXG4gIGNsaWVudFN0YXRlOiBDbGllbnRTdGF0ZSxcbiAgdHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgfCB1bmRlZmluZWRcbik6IHsgc3RhdGU6IEpTT05PYmplY3Q7IGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10gfSB7XG4gIGNvbnN0IGNhbGMgPSBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3JcblxuICAvLyBBbHdheXMgY2FsY3VsYXRlIGZyZXNoIGZpbmFsaXplZCBlcG9jaCBhbmQgY2hlY2twb2ludCB0byBoYW5kbGUgc3luYyByYWNlIGNvbmRpdGlvbnNcbiAgY29uc3QgeyBmaW5hbGl6ZWRFcG9jaCwgY2hlY2twb2ludDogYmFzZUNQIH0gPSBnZXRGaW5hbGl6ZWRFcG9jaEFuZENoZWNrcG9pbnQoeUNoZWNrcG9pbnQpXG5cbiAgLy8gVXBkYXRlIHJlYWQtY2FjaGVcbiAgY2xpZW50U3RhdGUuY2FjaGVkRmluYWxpemVkRXBvY2ggPSBmaW5hbGl6ZWRFcG9jaFxuXG4gIC8vIFNldCBiYXNlIGNoZWNrcG9pbnQgKHRoaXMgaGFuZGxlcyBpbnZhbGlkYXRpb24gaWYgY2hlY2twb2ludCBjaGFuZ2VkKVxuICBjYWxjLnNldEJhc2VDaGVja3BvaW50KGJhc2VDUClcblxuICAvLyBUcmFjayBpZiB3ZSBuZWVkIHRvIHJlYnVpbGQgc29ydGVkIGNhY2hlIChmaXJzdCBydW4gb3IgbWlzc2luZyBkZWx0YSlcbiAgLy8gT3B0aW1pemF0aW9uOiBXZSBkb24ndCBuZWVkIHRvIHJlYnVpbGQganVzdCBiZWNhdXNlIGNoZWNrcG9pbnQgY2hhbmdlZCxcbiAgLy8gYXMgbG9uZyBhcyB3ZSBoYXZlIHR4Q2hhbmdlcyB0byBrZWVwIGNhY2hlIGluIHN5bmMuXG4gIGNvbnN0IG5lZWRzUmVidWlsZFNvcnRlZENhY2hlID0gY2FsYy5nZXRDYWNoZWRTdGF0ZSgpID09PSBudWxsIHx8ICF0eENoYW5nZXNcblxuICAvLyBSZWJ1aWxkIHNvcnRlZCBjYWNoZSBiZWZvcmUgc3luY0xvZyBpZiBuZWVkZWRcbiAgaWYgKG5lZWRzUmVidWlsZFNvcnRlZENhY2hlKSB7XG4gICAgY2FsYy5yZWJ1aWxkRnJvbVlqcyh5VHgpXG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgbm90IHJlYnVpbGRpbmcsIGltbWVkaWF0ZWx5IHByb2Nlc3MgZGVsZXRpb25zIHRvIGF2b2lkIFwiZ2hvc3RcIiB0cmFuc2FjdGlvbnNcbiAgICAvLyBpbiBzeW5jTG9nIChlLmcuIGF0dGVtcHRpbmcgdG8gYWNjZXNzIGEgdHJhbnNhY3Rpb24gdGhhdCB3YXMganVzdCBkZWxldGVkKS5cbiAgICBjYWxjLnJlbW92ZVR4cyh0eENoYW5nZXMuZGVsZXRlZClcbiAgfVxuXG4gIC8vIFN5bmMgYW5kIHBydW5lIHdpdGhpbiB0cmFuc2FjdGlvblxuICBkb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIHN5bmNMb2coeVR4LCBteUNsaWVudElkLCBjbGllbnRTdGF0ZSwgZmluYWxpemVkRXBvY2gsIGJhc2VDUCwgdHhDaGFuZ2VzPy5hZGRlZClcblxuICAgIC8vIFNhZmUgdG8gdXNlIGxvY2FsIGZpbmFsaXplZEVwb2NoIGhlcmVcbiAgICBwcnVuZUNoZWNrcG9pbnRzKHlDaGVja3BvaW50LCBmaW5hbGl6ZWRFcG9jaClcbiAgfSlcblxuICBpZiAobmVlZHNSZWJ1aWxkU29ydGVkQ2FjaGUpIHtcbiAgICAvLyBGdWxsIHJlY29tcHV0ZSAoY2FsY3VsYXRvciBoYW5kbGVzIHRoaXMpXG4gICAgcmV0dXJuIGNhbGMuY2FsY3VsYXRlU3RhdGUoKVxuICB9XG5cbiAgLy8gSW5jcmVtZW50YWwgdXBkYXRlIHVzaW5nIG9ubHkgY2hhbmdlZCBrZXlzIChjYWxjdWxhdG9yIGhhbmRsZXMgdGhpcylcbiAgLy8gdHhDaGFuZ2VzIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QgaGVyZSBzaW5jZSAhdHhDaGFuZ2VzIGltcGxpZXMgbmVlZHNSZWJ1aWxkU29ydGVkQ2FjaGVcblxuICAvLyBVcGRhdGUgc29ydGVkIGNhY2hlIHdpdGggbmV3IGtleXMgZnJvbSB0eENoYW5nZXNcbiAgLy8gVGhpcyBtdXN0IGhhcHBlbiBhZnRlciBzeW5jTG9nIHdoaWNoIG1heSBoYXZlIGRlbGV0ZWQgc29tZSBvZiB0aGVzZSBrZXlzXG4gIGZvciAoY29uc3Qga2V5IG9mIHR4Q2hhbmdlcy5hZGRlZCkge1xuICAgIC8vIENSSVRJQ0FMOiBDaGVjayB5VHguaGFzKGtleSkhIHN5bmNMb2cgbWlnaHQgaGF2ZSBqdXN0IHBydW5lZCBpdC5cbiAgICBpZiAoeVR4LmhhcyhrZXkpICYmICFjYWxjLmhhc1R4KGtleSkpIHtcbiAgICAgIGNhbGMuaW5zZXJ0VHgoa2V5LCB5VHgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbGMuY2FsY3VsYXRlU3RhdGUoKVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IENoZWNrcG9pbnRSZWNvcmQsIGNyZWF0ZUNoZWNrcG9pbnQgfSBmcm9tIFwiLi9jaGVja3BvaW50c1wiXG5pbXBvcnQgeyBjcmVhdGVDbGllbnRTdGF0ZSB9IGZyb20gXCIuL2NsaWVudFN0YXRlXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi9lcnJvclwiXG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSBcIi4vanNvblwiXG5cbmltcG9ydCB7IE9wLCBWYWxpZGF0ZUZuIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiXG5cbmltcG9ydCB7IGNvbXB1dGVSZWNvbmNpbGVPcHMgfSBmcm9tIFwiLi9yZWNvbmNpbGVcIlxuaW1wb3J0IHsgU29ydGVkVHhFbnRyeSB9IGZyb20gXCIuL1NvcnRlZFR4RW50cnlcIlxuaW1wb3J0IHsgVHhSZWNvcmQgfSBmcm9tIFwiLi9UeFJlY29yZFwiXG5pbXBvcnQgeyBhcHBlbmRUeCwgVHhLZXlDaGFuZ2VzLCB1cGRhdGVTdGF0ZSB9IGZyb20gXCIuL3R4TG9nXCJcbmltcG9ydCB7IFR4VGltZXN0YW1wS2V5IH0gZnJvbSBcIi4vdHhUaW1lc3RhbXBcIlxuaW1wb3J0IHsgZ2VuZXJhdGVJRCB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGNvbnN0IGdldFNvcnRlZFR4c1N5bWJvbCA9IFN5bWJvbChcImdldFNvcnRlZFR4c1wiKVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlU3luY0xvZ09wdGlvbnM8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBEb2N1bWVudCB0byBiaW5kIHRvLlxuICAgKi9cbiAgeURvYzogWS5Eb2NcblxuICAvKipcbiAgICogTmFtZSBmb3IgdGhlIHR4cyBZLk1hcC5cbiAgICogRGVmYXVsdDogXCJzdGF0ZS1zeW5jLWxvZy10eFwiXG4gICAqL1xuICB5VHhNYXBOYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE5hbWUgZm9yIHRoZSBjaGVja3BvaW50IFkuTWFwLlxuICAgKiBEZWZhdWx0OiBcInN0YXRlLXN5bmMtbG9nLWNoZWNrcG9pbnRcIlxuICAgKi9cbiAgeUNoZWNrcG9pbnRNYXBOYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsaWVudC5cbiAgICogSWYgb21pdHRlZCwgYSByYW5kb20gVVVJRCAobmFub2lkKSB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogTk9URTogSWYgeW91IG5lZWQgdG8gcmVzdW1lIGEgc2Vzc2lvbiAoa2VlcCBsb2NhbCBjbG9jay93YXRlcm1hcmspLCB5b3UgTVVTVCBwcm92aWRlIGEgc3RhYmxlIElELlxuICAgKiBNVVNUIE5PVCBjb250YWluIHNlbWljb2xvbnMuXG4gICAqL1xuICBjbGllbnRJZD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcmlnaW4gdGFnIGZvciBZLmpzIHR4cyBjcmVhdGVkIGJ5IHRoaXMgbGlicmFyeS5cbiAgICovXG4gIHlqc09yaWdpbj86IHVua25vd25cblxuICAvKipcbiAgICogT3B0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cbiAgICogUnVucyBhZnRlciBlYWNoIHR4J3Mgb3BzIGFyZSBhcHBsaWVkLlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGUgdHggaXMgcmVqZWN0ZWQgKHN0YXRlIHJldmVydHMpLlxuICAgKiBNVVNUIGJlIGRldGVybWluaXN0aWMgYW5kIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBjbGllbnRzLlxuICAgKi9cbiAgdmFsaWRhdGU/OiAoc3RhdGU6IFN0YXRlKSA9PiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCByZXRlbnRpb24gd2luZG93IGluIG1pbGxpc2Vjb25kcy5cbiAgICogVHhzIG9sZGVyIHRoYW4gdGhpcyB3aW5kb3cgYXJlIGNvbnNpZGVyZWQgXCJBbmNpZW50XCIgYW5kIHBydW5lZC5cbiAgICpcbiAgICogRGVmYXVsdDogSW5maW5pdHkgKE5vIHBydW5pbmcpLlxuICAgKiBSZWNvbW1lbmRlZDogMTQgZGF5cyAoMTIwOTYwMDAwMCBtcykuXG4gICAqL1xuICByZXRlbnRpb25XaW5kb3dNczogbnVtYmVyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVTeW5jTG9nQ29udHJvbGxlcjxTdGF0ZSBleHRlbmRzIEpTT05PYmplY3Q+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBTdGF0ZVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHN0YXRlIGNoYW5nZXMuXG4gICAqL1xuICBzdWJzY3JpYmUoY2FsbGJhY2s6IChuZXdTdGF0ZTogU3RhdGUsIGdldEFwcGxpZWRPcHM6ICgpID0+IHJlYWRvbmx5IE9wW10pID0+IHZvaWQpOiAoKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbmV3IHR4IChsaXN0IG9mIG9wZXJhdGlvbnMpIHRvIHRoZSBsb2cuXG4gICAqL1xuICBlbWl0KG9wczogT3BbXSk6IHZvaWRcblxuICAvKipcbiAgICogUmVjb25jaWxlcyB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIHRoZSB0YXJnZXQgc3RhdGUuXG4gICAqL1xuICByZWNvbmNpbGVTdGF0ZSh0YXJnZXRTdGF0ZTogU3RhdGUpOiB2b2lkXG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IHRyaWdnZXJzIGVwb2NoIGNvbXBhY3Rpb24gKENoZWNrcG9pbnRpbmcpLlxuICAgKi9cbiAgY29tcGFjdCgpOiB2b2lkXG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBvYnNlcnZlcnMgYW5kIHJlbGVhc2VzIG1lbW9yeS5cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZFxuXG4gIC8vIC0tLSBPYnNlcnZhYmlsaXR5ICYgU3RhdHMgLS0tXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWN0aXZlIGVwb2NoIG51bWJlci5cbiAgICovXG4gIGdldEFjdGl2ZUVwb2NoKCk6IG51bWJlclxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHhzIGN1cnJlbnRseSBpbiB0aGUgYWN0aXZlIGVwb2NoLlxuICAgKi9cbiAgZ2V0QWN0aXZlRXBvY2hUeENvdW50KCk6IG51bWJlclxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3YWxsQ2xvY2sgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0eCBpbiB0aGUgYWN0aXZlIGVwb2NoLlxuICAgKi9cbiAgZ2V0QWN0aXZlRXBvY2hTdGFydFRpbWUoKTogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9nIGlzIGNvbXBsZXRlbHkgZW1wdHkuXG4gICAqL1xuICBpc0xvZ0VtcHR5KCk6IGJvb2xlYW5cblxuICAvKipcbiAgICogSW50ZXJuYWwvVGVzdGluZzogUmV0dXJucyBhbGwgdHhzIGN1cnJlbnRseSBpbiB0aGUgbG9nLCBzb3J0ZWQuXG4gICAqL1xuICBbZ2V0U29ydGVkVHhzU3ltYm9sXSgpOiByZWFkb25seSBTb3J0ZWRUeEVudHJ5W11cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU3RhdGVTeW5jTG9nIGNvbnRyb2xsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0ZVN5bmNMb2c8U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PihcbiAgb3B0aW9uczogU3RhdGVTeW5jTG9nT3B0aW9uczxTdGF0ZT5cbik6IFN0YXRlU3luY0xvZ0NvbnRyb2xsZXI8U3RhdGU+IHtcbiAgY29uc3Qge1xuICAgIHlEb2MsXG4gICAgeVR4TWFwTmFtZSA9IFwic3RhdGUtc3luYy1sb2ctdHhcIixcbiAgICB5Q2hlY2twb2ludE1hcE5hbWUgPSBcInN0YXRlLXN5bmMtbG9nLWNoZWNrcG9pbnRcIixcbiAgICBjbGllbnRJZCA9IGdlbmVyYXRlSUQoKSxcbiAgICB5anNPcmlnaW4sXG4gICAgdmFsaWRhdGUsXG4gICAgcmV0ZW50aW9uV2luZG93TXMsXG4gIH0gPSBvcHRpb25zXG5cbiAgaWYgKGNsaWVudElkLmluY2x1ZGVzKFwiO1wiKSkge1xuICAgIGZhaWx1cmUoYGNsaWVudElkIE1VU1QgTk9UIGNvbnRhaW4gc2VtaWNvbG9uczogJHtjbGllbnRJZH1gKVxuICB9XG5cbiAgY29uc3QgeVR4ID0geURvYy5nZXRNYXA8VHhSZWNvcmQ+KHlUeE1hcE5hbWUpXG4gIGNvbnN0IHlDaGVja3BvaW50ID0geURvYy5nZXRNYXA8Q2hlY2twb2ludFJlY29yZD4oeUNoZWNrcG9pbnRNYXBOYW1lKVxuXG4gIC8vIENhc3QgdmFsaWRhdGUgdG8gYmFzaWMgdHlwZSB0byBtYXRjaCBpbnRlcm5hbCBDbGllbnRTdGF0ZVxuICBjb25zdCBjbGllbnRTdGF0ZSA9IGNyZWF0ZUNsaWVudFN0YXRlKFxuICAgIHZhbGlkYXRlIGFzIHVua25vd24gYXMgVmFsaWRhdGVGbjxKU09OT2JqZWN0PixcbiAgICByZXRlbnRpb25XaW5kb3dNcyA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgKVxuXG4gIC8vIExpc3RlbmVyc1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8KHN0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4gdm9pZD4oKVxuXG4gIGNvbnN0IG5vdGlmeVN1YnNjcmliZXJzID0gKHN0YXRlOiBTdGF0ZSwgZ2V0QXBwbGllZE9wczogKCkgPT4gcmVhZG9ubHkgT3BbXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIHN1YnNjcmliZXJzKSB7XG4gICAgICBzdWIoc3RhdGUsIGdldEFwcGxpZWRPcHMpXG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIHRvIGV4dHJhY3Qga2V5IGNoYW5nZXMgZnJvbSBZTWFwRXZlbnRcbiAgY29uc3QgZXh0cmFjdFR4Q2hhbmdlcyA9IChldmVudDogWS5ZTWFwRXZlbnQ8VHhSZWNvcmQ+KTogVHhLZXlDaGFuZ2VzID0+IHtcbiAgICBjb25zdCBhZGRlZDogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG4gICAgY29uc3QgZGVsZXRlZDogVHhUaW1lc3RhbXBLZXlbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoYW5nZV0gb2YgZXZlbnQuY2hhbmdlcy5rZXlzKSB7XG4gICAgICBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJhZGRcIikge1xuICAgICAgICBhZGRlZC5wdXNoKGtleSlcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJkZWxldGVcIikge1xuICAgICAgICBkZWxldGVkLnB1c2goa2V5KVxuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuYWN0aW9uID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIGRlbGV0ZWQucHVzaChrZXkpXG4gICAgICAgIGFkZGVkLnB1c2goa2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGFkZGVkLCBkZWxldGVkIH1cbiAgfVxuXG4gIC8vIEVtcHR5IHR4Q2hhbmdlcyBvYmplY3QgZm9yIGNoZWNrcG9pbnQgb2JzZXJ2ZXIgKG5vIHR4IGtleXMgY2hhbmdlZClcbiAgY29uc3QgZW1wdHlUeENoYW5nZXM6IFR4S2V5Q2hhbmdlcyA9IHsgYWRkZWQ6IFtdLCBkZWxldGVkOiBbXSB9XG5cbiAgLy8gVXBkYXRlIExvZ2ljIHdpdGggaW5jcmVtZW50YWwgY2hhbmdlc1xuICBjb25zdCBydW5VcGRhdGUgPSAodHhDaGFuZ2VzOiBUeEtleUNoYW5nZXMgfCB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlLCBnZXRBcHBsaWVkT3BzIH0gPSB1cGRhdGVTdGF0ZShcbiAgICAgIHlEb2MsXG4gICAgICB5VHgsXG4gICAgICB5Q2hlY2twb2ludCxcbiAgICAgIGNsaWVudElkLFxuICAgICAgY2xpZW50U3RhdGUsXG4gICAgICB0eENoYW5nZXNcbiAgICApXG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoc3RhdGUgYXMgU3RhdGUsIGdldEFwcGxpZWRPcHMpXG4gIH1cblxuICAvLyBUeCBvYnNlcnZlclxuICBjb25zdCB0eE9ic2VydmVyID0gKGV2ZW50OiBZLllNYXBFdmVudDxUeFJlY29yZD4sIF90cmFuc2FjdGlvbjogWS5UcmFuc2FjdGlvbikgPT4ge1xuICAgIGNvbnN0IHR4Q2hhbmdlcyA9IGV4dHJhY3RUeENoYW5nZXMoZXZlbnQpXG4gICAgcnVuVXBkYXRlKHR4Q2hhbmdlcylcbiAgfVxuXG4gIC8vIENoZWNrcG9pbnQgb2JzZXJ2ZXJcbiAgY29uc3QgY2hlY2twb2ludE9ic2VydmVyID0gKFxuICAgIF9ldmVudDogWS5ZTWFwRXZlbnQ8Q2hlY2twb2ludFJlY29yZD4sXG4gICAgX3RyYW5zYWN0aW9uOiBZLlRyYW5zYWN0aW9uXG4gICkgPT4ge1xuICAgIHJ1blVwZGF0ZShlbXB0eVR4Q2hhbmdlcylcbiAgfVxuXG4gIHlDaGVja3BvaW50Lm9ic2VydmUoY2hlY2twb2ludE9ic2VydmVyKVxuICB5VHgub2JzZXJ2ZSh0eE9ic2VydmVyKVxuXG4gIC8vIEluaXRpYWwgcnVuIChmdWxsIHJlY29tcHV0ZSwgdHJlYXQgYXMgY2hlY2twb2ludCBjaGFuZ2UgdG8gaW5pdGlhbGl6ZSBlcG9jaCBjYWNoZSlcbiAgcnVuVXBkYXRlKHVuZGVmaW5lZClcblxuICAvLyBUcmFjayBkaXNwb3NhbCBzdGF0ZVxuICBsZXQgZGlzcG9zZWQgPSBmYWxzZVxuXG4gIGNvbnN0IGFzc2VydE5vdERpc3Bvc2VkID0gKCkgPT4ge1xuICAgIGlmIChkaXNwb3NlZCkge1xuICAgICAgZmFpbHVyZShcIlN0YXRlU3luY0xvZyBoYXMgYmVlbiBkaXNwb3NlZCBhbmQgY2Fubm90IGJlIHVzZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBnZXRBY3RpdmVFcG9jaEludGVybmFsID0gKCkgPT4ge1xuICAgIGlmIChjbGllbnRTdGF0ZS5jYWNoZWRGaW5hbGl6ZWRFcG9jaCA9PT0gbnVsbCkge1xuICAgICAgZmFpbHVyZShcImNhY2hlZEZpbmFsaXplZEVwb2NoIGlzIG51bGwgLSB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGFmdGVyIGluaXRpYWxpemF0aW9uXCIpXG4gICAgfVxuICAgIHJldHVybiBjbGllbnRTdGF0ZS5jYWNoZWRGaW5hbGl6ZWRFcG9jaCArIDFcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0U3RhdGUoKTogU3RhdGUge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIChjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0Q2FjaGVkU3RhdGUoKSA/PyB7fSkgYXMgU3RhdGVcbiAgICB9LFxuXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiAobmV3U3RhdGU6IFN0YXRlLCBnZXRBcHBsaWVkT3BzOiAoKSA9PiByZWFkb25seSBPcFtdKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICBzdWJzY3JpYmVycy5hZGQoY2FsbGJhY2spXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoY2FsbGJhY2spXG4gICAgICB9XG4gICAgfSxcblxuICAgIGVtaXQob3BzOiBPcFtdKTogdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICB5RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlRXBvY2ggPSBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICAgICAgYXBwZW5kVHgob3BzLCB5VHgsIGFjdGl2ZUVwb2NoLCBjbGllbnRJZCwgY2xpZW50U3RhdGUpXG4gICAgICB9LCB5anNPcmlnaW4pXG4gICAgfSxcblxuICAgIHJlY29uY2lsZVN0YXRlKHRhcmdldFN0YXRlOiBTdGF0ZSk6IHZvaWQge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gKGNsaWVudFN0YXRlLnN0YXRlQ2FsY3VsYXRvci5nZXRDYWNoZWRTdGF0ZSgpID8/IHt9KSBhcyBTdGF0ZVxuICAgICAgY29uc3Qgb3BzID0gY29tcHV0ZVJlY29uY2lsZU9wcyhjdXJyZW50U3RhdGUsIHRhcmdldFN0YXRlKVxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZW1pdChvcHMpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBhY3QoKTogdm9pZCB7XG4gICAgICBhc3NlcnROb3REaXNwb3NlZCgpXG4gICAgICB5RG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlRXBvY2ggPSBnZXRBY3RpdmVFcG9jaEludGVybmFsKClcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldENhY2hlZFN0YXRlKCkgPz8ge31cbiAgICAgICAgY3JlYXRlQ2hlY2twb2ludCh5VHgsIHlDaGVja3BvaW50LCBjbGllbnRTdGF0ZSwgYWN0aXZlRXBvY2gsIGN1cnJlbnRTdGF0ZSwgY2xpZW50SWQpXG4gICAgICB9LCB5anNPcmlnaW4pXG4gICAgfSxcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICBpZiAoZGlzcG9zZWQpIHJldHVybiAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBuby1vcFxuICAgICAgZGlzcG9zZWQgPSB0cnVlXG4gICAgICB5VHgudW5vYnNlcnZlKHR4T2JzZXJ2ZXIpXG4gICAgICB5Q2hlY2twb2ludC51bm9ic2VydmUoY2hlY2twb2ludE9ic2VydmVyKVxuICAgICAgc3Vic2NyaWJlcnMuY2xlYXIoKVxuICAgIH0sXG5cbiAgICBnZXRBY3RpdmVFcG9jaCgpOiBudW1iZXIge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIGdldEFjdGl2ZUVwb2NoSW50ZXJuYWwoKVxuICAgIH0sXG5cbiAgICBnZXRBY3RpdmVFcG9jaFR4Q291bnQoKTogbnVtYmVyIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICBsZXQgY291bnQgPSAwXG4gICAgICAvLyBPbmx5IGN1cnJlbnQgb3IgZnV0dXJlIGVwb2NocyBleGlzdCBpbiBzb3J0ZWRUeHMgKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQgZHVyaW5nIHVwZGF0ZVN0YXRlKS5cbiAgICAgIC8vIEZ1dHVyZSBlcG9jaHMgYXBwZWFyIGlmIHdlIHJlY2VpdmUgdHhzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBjaGVja3BvaW50LlxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKCkpIHtcbiAgICAgICAgY29uc3QgdHMgPSBlbnRyeS50eFRpbWVzdGFtcFxuICAgICAgICBpZiAodHMuZXBvY2ggPT09IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgY291bnQrK1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmVwb2NoID4gYWN0aXZlRXBvY2gpIHtcbiAgICAgICAgICBicmVhayAvLyBPcHRpbWl6YXRpb246IHNvcnRlZCBvcmRlciBtZWFucyB3ZSBjYW4gc3RvcCBlYXJseVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY291bnRcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZlRXBvY2hTdGFydFRpbWUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIGNvbnN0IGFjdGl2ZUVwb2NoID0gZ2V0QWN0aXZlRXBvY2hJbnRlcm5hbCgpXG4gICAgICAvLyBPbmx5IGN1cnJlbnQgb3IgZnV0dXJlIGVwb2NocyBleGlzdCBpbiBzb3J0ZWRUeHMgKHBhc3QgZXBvY2hzIGFyZSBwcnVuZWQgZHVyaW5nIHVwZGF0ZVN0YXRlKS5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY2xpZW50U3RhdGUuc3RhdGVDYWxjdWxhdG9yLmdldFNvcnRlZFR4cygpKSB7XG4gICAgICAgIGNvbnN0IHRzID0gZW50cnkudHhUaW1lc3RhbXBcbiAgICAgICAgaWYgKHRzLmVwb2NoID09PSBhY3RpdmVFcG9jaCkge1xuICAgICAgICAgIHJldHVybiB0cy53YWxsQ2xvY2tcbiAgICAgICAgfSBlbHNlIGlmICh0cy5lcG9jaCA+IGFjdGl2ZUVwb2NoKSB7XG4gICAgICAgICAgYnJlYWsgLy8gT3B0aW1pemF0aW9uOiBzb3J0ZWQgb3JkZXIgbWVhbnMgd2UgY2FuIHN0b3AgZWFybHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBpc0xvZ0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgYXNzZXJ0Tm90RGlzcG9zZWQoKVxuICAgICAgcmV0dXJuIHlUeC5zaXplID09PSAwICYmIHlDaGVja3BvaW50LnNpemUgPT09IDBcbiAgICB9LFxuXG4gICAgW2dldFNvcnRlZFR4c1N5bWJvbF0oKTogcmVhZG9ubHkgU29ydGVkVHhFbnRyeVtdIHtcbiAgICAgIGFzc2VydE5vdERpc3Bvc2VkKClcbiAgICAgIHJldHVybiBjbGllbnRTdGF0ZS5zdGF0ZUNhbGN1bGF0b3IuZ2V0U29ydGVkVHhzKClcbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4vZXJyb3JcIlxyXG5pbXBvcnQgeyBKU09OT2JqZWN0LCBKU09OVmFsdWUsIFBhdGggfSBmcm9tIFwiLi9qc29uXCJcclxuaW1wb3J0IHsgZGVlcENsb25lLCBkZWVwRXF1YWwsIGlzT2JqZWN0LCBwYXJzZUFycmF5SW5kZXggfSBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG4vKipcclxuICogU3VwcG9ydGVkIG9wZXJhdGlvbnMuXHJcbiAqIEFwcGxpZWQgc2VxdWVudGlhbGx5IHdpdGhpbiBhIHR4LlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgT3AgPVxyXG4gIHwgeyBraW5kOiBcInNldFwiOyBwYXRoOiBQYXRoOyBrZXk6IHN0cmluZyB8IG51bWJlcjsgdmFsdWU6IEpTT05WYWx1ZSB9XHJcbiAgfCB7IGtpbmQ6IFwiZGVsZXRlXCI7IHBhdGg6IFBhdGg7IGtleTogc3RyaW5nIHwgbnVtYmVyIH1cclxuICB8IHsga2luZDogXCJzcGxpY2VcIjsgcGF0aDogUGF0aDsgaW5kZXg6IG51bWJlcjsgZGVsZXRlQ291bnQ6IG51bWJlcjsgaW5zZXJ0czogSlNPTlZhbHVlW10gfVxyXG4gIHwgeyBraW5kOiBcImFkZFRvU2V0XCI7IHBhdGg6IFBhdGg7IHZhbHVlOiBKU09OVmFsdWUgfVxyXG4gIHwgeyBraW5kOiBcImRlbGV0ZUZyb21TZXRcIjsgcGF0aDogUGF0aDsgdmFsdWU6IEpTT05WYWx1ZSB9XHJcblxyXG4vKipcclxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiB0eXBlLlxyXG4gKlxyXG4gKiBSdWxlczpcclxuICogLSBWYWxpZGF0aW9uIE1VU1QgZGVwZW5kIG9ubHkgb24gY2FuZGlkYXRlU3RhdGUgKGFuZCBkZXRlcm1pbmlzdGljIGNvZGUpLlxyXG4gKiAtIFZhbGlkYXRpb24gcnVucyBvbmNlIHBlciB0eCwgYWZ0ZXIgYWxsIG9wcyBhcHBseS5cclxuICogLSBJZiB2YWxpZGF0aW9uIGZhaWxzLCB0aGUgeCBpcyByZWplY3RlZCAoc3RhdGUgcmV2ZXJ0cyB0byBwcmV2aW91cykuXHJcbiAqIC0gSWYgbm8gdmFsaWRhdG9yIGlzIHByb3ZpZGVkLCB2YWxpZGF0aW9uIGRlZmF1bHRzIHRvIHRydWUuXHJcbiAqXHJcbiAqIElNUE9SVEFOVDogVmFsaWRhdGlvbiBvdXRjb21lIGlzICoqZGVyaXZlZCBsb2NhbCBzdGF0ZSoqIGFuZCBNVVNUIE5PVCBiZSByZXBsaWNhdGVkLlxyXG4gKiBBbGwgY2xpZW50cyBNVVNUIHVzZSB0aGUgc2FtZSB2YWxpZGF0aW9uIGxvZ2ljIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cclxuICovXHJcbmV4cG9ydCB0eXBlIFZhbGlkYXRlRm48U3RhdGUgZXh0ZW5kcyBKU09OT2JqZWN0PiA9IChjYW5kaWRhdGVTdGF0ZTogU3RhdGUpID0+IGJvb2xlYW5cclxuXHJcbi8qKlxyXG4gKiBSZXNvbHZlcyBhIHBhdGggd2l0aGluIHRoZSBzdGF0ZS5cclxuICogVGhyb3dzIGlmIGFueSBzZWdtZW50IGlzIG1pc3Npbmcgb3IgaGFzIHdyb25nIHR5cGUuXHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUGF0aChzdGF0ZTogSlNPTk9iamVjdCwgcGF0aDogUGF0aCk6IEpTT05WYWx1ZSB7XHJcbiAgbGV0IGN1cnJlbnQ6IEpTT05WYWx1ZSA9IHN0YXRlXHJcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHBhdGgpIHtcclxuICAgIGlmICh0eXBlb2Ygc2VnbWVudCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoIWlzT2JqZWN0KGN1cnJlbnQpIHx8IEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcclxuICAgICAgICBmYWlsdXJlKGBFeHBlY3RlZCBvYmplY3QgYXQgcGF0aCBzZWdtZW50IFwiJHtzZWdtZW50fVwiYClcclxuICAgICAgfVxyXG4gICAgICBpZiAoIShzZWdtZW50IGluIGN1cnJlbnQpKSB7XHJcbiAgICAgICAgZmFpbHVyZShgUHJvcGVydHkgXCIke3NlZ21lbnR9XCIgZG9lcyBub3QgZXhpc3RgKVxyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NlZ21lbnRdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcclxuICAgICAgICBmYWlsdXJlKGBFeHBlY3RlZCBhcnJheSBhdCBwYXRoIHNlZ21lbnQgJHtzZWdtZW50fWApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlZ21lbnQgPCAwIHx8IHNlZ21lbnQgPj0gY3VycmVudC5sZW5ndGgpIHtcclxuICAgICAgICBmYWlsdXJlKGBJbmRleCAke3NlZ21lbnR9IG91dCBvZiBib3VuZHNgKVxyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NlZ21lbnRdXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjdXJyZW50XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgc2luZ2xlIG9wZXJhdGlvbi5cclxuICogKFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RhbmRhcmQgSlNPTi1wYXRjaCBiZWhhdmlvcilcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5T3Aoc3RhdGU6IEpTT05PYmplY3QsIG9wOiBPcCwgY2xvbmVWYWx1ZXM6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAvLyBTcGVjaWFsIGNhc2U6IGlmIHBhdGggaXMgZW1wdHksIHdlIGNhbid0IHJlc29sdmUgXCJjb250YWluZXJcIi5cclxuICAvLyBUaGUgY2FsbGVyIG11c3QgaGFuZGxlIHJvb3QtbGV2ZWwgcmVwbGFjZW1lbnQgaWYgbmVjZXNzYXJ5LCBidXRcclxuICAvLyBzdGFuZGFyZCBPcHMgdXN1YWxseSBhY3QgT04gYSBjb250YWluZXIuXHJcbiAgLy8gRXhjZXB0aW9uOiBpZiB3ZSBhY3Qgb24gcm9vdCwgaGFuZGxlIGV4cGxpY2l0bHkgb3IgYXNzdW1lIHBhdGggbGVuZ3RoID4gMC5cclxuICAvLyBGb3IgdGhpcyBzcGVjLCBPcHMgbW9kaWZ5ICpmaWVsZHMqIG9yICppbmRpY2VzKi5cclxuICAvLyBJZiBwYXRoIGlzIGVtcHR5LCBpdCBtZWFucyB3ZSBhcmUgYWN0aW5nIE9OIHRoZSByb290IG9iamVjdCBpdHNlbGY/XHJcbiAgLy8gVGhlIHNwZWMncyBcInNldFwiIGV4YW1wbGU6IGNvbnRhaW5lcltvcC5rZXldID0gb3AudmFsdWUuXHJcbiAgLy8gVGhpcyBpbXBsaWVzIHdlIHJlc29sdmUgcGF0aCB0byBnZXQgdGhlIFBBUkVOVCBjb250YWluZXIuXHJcblxyXG4gIGNvbnN0IGNvbnRhaW5lciA9IHJlc29sdmVQYXRoKHN0YXRlLCBvcC5wYXRoKVxyXG5cclxuICBzd2l0Y2ggKG9wLmtpbmQpIHtcclxuICAgIGNhc2UgXCJzZXRcIjoge1xyXG4gICAgICAvLyBBbGxvdyBvYmplY3Qgb3IgYXJyYXkgY29udGFpbmVyXHJcbiAgICAgIGlmICghaXNPYmplY3QoY29udGFpbmVyKSkge1xyXG4gICAgICAgIGZhaWx1cmUoXCJzZXQgcmVxdWlyZXMgb2JqZWN0IG9yIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBrZXk6IHN0cmluZyB8IG51bWJlciA9IG9wLmtleVxyXG4gICAgICAvLyBGb3IgYXJyYXlzLCBjb252ZXJ0IHN0cmluZyBrZXlzIHRvIG51bWJlcnMgKGV4Y2VwdCBcImxlbmd0aFwiKVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgJiYga2V5ICE9PSBcImxlbmd0aFwiKSB7XHJcbiAgICAgICAgY29uc3QgbnVtS2V5ID0gcGFyc2VBcnJheUluZGV4KGtleSlcclxuICAgICAgICBpZiAobnVtS2V5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICBmYWlsdXJlKGBDYW5ub3Qgc2V0IG5vbi1udW1lcmljIHByb3BlcnR5IFwiJHtrZXl9XCIgb24gYXJyYXlgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkgPSBudW1LZXlcclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICA7KGNvbnRhaW5lciBhcyBhbnkpW2tleV0gPSBjbG9uZVZhbHVlcyA/IGRlZXBDbG9uZShvcC52YWx1ZSkgOiBvcC52YWx1ZVxyXG4gICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGNhc2UgXCJkZWxldGVcIjoge1xyXG4gICAgICAvLyBBbGxvdyBvYmplY3Qgb3IgYXJyYXkgKHNwYXJzZSBkZWxldGU/KVxyXG4gICAgICBpZiAoIWlzT2JqZWN0KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwiZGVsZXRlIHJlcXVpcmVzIG9iamVjdCBvciBhcnJheSBjb250YWluZXJcIilcclxuICAgICAgfVxyXG4gICAgICBsZXQga2V5OiBzdHJpbmcgfCBudW1iZXIgPSBvcC5rZXlcclxuICAgICAgLy8gRm9yIGFycmF5cywgY29udmVydCBzdHJpbmcga2V5cyB0byBudW1iZXJzXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlQXJyYXlJbmRleChrZXkpXHJcbiAgICAgICAgaWYgKG51bUtleSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgZmFpbHVyZShgQ2Fubm90IGRlbGV0ZSBub24tbnVtZXJpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiIGZyb20gYXJyYXlgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkgPSBudW1LZXlcclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICBkZWxldGUgKGNvbnRhaW5lciBhcyBhbnkpW2tleV1cclxuICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFwic3BsaWNlXCI6IHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwic3BsaWNlIHJlcXVpcmVzIGFycmF5IGNvbnRhaW5lclwiKVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNhZmVJbmRleCA9IE1hdGgubWluKG9wLmluZGV4LCBjb250YWluZXIubGVuZ3RoKVxyXG4gICAgICBjb250YWluZXIuc3BsaWNlKFxyXG4gICAgICAgIHNhZmVJbmRleCxcclxuICAgICAgICBvcC5kZWxldGVDb3VudCxcclxuICAgICAgICAuLi4oY2xvbmVWYWx1ZXMgPyBvcC5pbnNlcnRzLm1hcCgodikgPT4gZGVlcENsb25lKHYpKSA6IG9wLmluc2VydHMpXHJcbiAgICAgIClcclxuICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBjYXNlIFwiYWRkVG9TZXRcIjpcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICBmYWlsdXJlKFwiYWRkVG9TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjb250YWluZXIuc29tZSgoaXRlbSkgPT4gZGVlcEVxdWFsKGl0ZW0sIG9wLnZhbHVlKSkpIHtcclxuICAgICAgICBjb250YWluZXIucHVzaChjbG9uZVZhbHVlcyA/IGRlZXBDbG9uZShvcC52YWx1ZSkgOiBvcC52YWx1ZSlcclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGNhc2UgXCJkZWxldGVGcm9tU2V0XCI6XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgZmFpbHVyZShcImRlbGV0ZUZyb21TZXQgcmVxdWlyZXMgYXJyYXkgY29udGFpbmVyXCIpXHJcbiAgICAgIH1cclxuICAgICAgLy8gUmVtb3ZlIGFsbCBtYXRjaGluZyBpdGVtcyB1c2luZyBzcGxpY2UgKGZyb20gZW5kIHRvIGF2b2lkIGluZGV4IHNoaWZ0aW5nKVxyXG4gICAgICBmb3IgKGxldCBpID0gY29udGFpbmVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKGRlZXBFcXVhbChjb250YWluZXJbaV0sIG9wLnZhbHVlKSkge1xyXG4gICAgICAgICAgY29udGFpbmVyLnNwbGljZShpLCAxKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBicmVha1xyXG5cclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHRocm93IGZhaWx1cmUoYFVua25vd24gb3BlcmF0aW9uIGtpbmQ6ICR7KG9wIGFzIGFueSkua2luZH1gKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIGFwcGx5T3BzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcHBseU9wc09wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZGVlcCBjbG9uZSB2YWx1ZXMgYmVmb3JlIGluc2VydGluZyB0aGVtIGludG8gdGhlIHRhcmdldC5cclxuICAgKiAtIGB0cnVlYCAoZGVmYXVsdCk6IFZhbHVlcyBhcmUgY2xvbmVkIHRvIHByZXZlbnQgYWxpYXNpbmcgYmV0d2VlbiB0aGUgb3BzIGFuZCB0YXJnZXQuXHJcbiAgICogLSBgZmFsc2VgOiBWYWx1ZXMgYXJlIHVzZWQgZGlyZWN0bHkgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4gT25seSB1c2UgdGhpcyBpZiB5b3VcclxuICAgKiAgIGd1YXJhbnRlZSB0aGUgb3AgdmFsdWVzIHdvbid0IGJlIG11dGF0ZWQgYWZ0ZXIgYXBwbGljYXRpb24uXHJcbiAgICovXHJcbiAgY2xvbmVWYWx1ZXM/OiBib29sZWFuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgbGlzdCBvZiBvcGVyYXRpb25zIHRvIGEgbXV0YWJsZSB0YXJnZXQgb2JqZWN0LlxyXG4gKiBVc2UgdGhpcyB0byBzeW5jaHJvbml6ZSBhbiBleHRlcm5hbCBtdXRhYmxlIHN0YXRlIChlLmcuLCBNb2JYIHN0b3JlKVxyXG4gKiB3aXRoIHRoZSBvcGVyYXRpb25zIHJlY2VpdmVkIHZpYSBzdWJzY3JpYmUoKS5cclxuICpcclxuICogQHBhcmFtIG9wcyAtIFRoZSBsaXN0IG9mIG9wZXJhdGlvbnMgdG8gYXBwbHkuXHJcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgbXV0YWJsZSBvYmplY3QgdG8gbW9kaWZ5LlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIGZvciBjb250cm9sbGluZyBjbG9uaW5nIGJlaGF2aW9yLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3BzKG9wczogcmVhZG9ubHkgT3BbXSwgdGFyZ2V0OiBKU09OT2JqZWN0LCBvcHRpb25zPzogQXBwbHlPcHNPcHRpb25zKTogdm9pZCB7XHJcbiAgY29uc3QgY2xvbmVWYWx1ZXMgPSBvcHRpb25zPy5jbG9uZVZhbHVlcyA/PyB0cnVlXHJcbiAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcclxuICAgIGFwcGx5T3AodGFyZ2V0LCBvcCwgY2xvbmVWYWx1ZXMpXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJEcmFmdFR5cGUiLCJjdXJyZW50Iiwib3JpZ2luYWwiLCJkZWVwQ2xvbmUiLCJlcXVhbCIsInNjb3BlZFVybEFscGhhYmV0IiwicmZkYyIsImhhbmRsZXIiLCJjbG9uZSIsImNyZWF0ZURyYWZ0Iiwib3BzIiwibmV4dFN0YXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBQU8sTUFBTSwwQkFBMEIsTUFBTTtBQUFBLElBQzNDLFlBQVksS0FBYTtBQUN2QixZQUFNLEdBQUc7QUFHVCxhQUFPLGVBQWUsTUFBTSxrQkFBa0IsU0FBUztBQUFBLElBQ3pEO0FBQUEsRUFDRjtBQUVPLFdBQVMsUUFBUSxTQUF3QjtBQUM5QyxVQUFNLElBQUksa0JBQWtCLE9BQU87QUFBQSxFQUNyQztBQ0xPLFFBQU0sY0FBYyx1QkFBTyxJQUFJLDJCQUEyQjtBQ0kxRCxNQUFLLDhCQUFBQSxlQUFMO0FBQ0xBLGVBQUFBLFdBQUEsWUFBUyxDQUFBLElBQVQ7QUFDQUEsZUFBQUEsV0FBQSxXQUFRLENBQUEsSUFBUjtBQUZVLFdBQUFBO0FBQUFBLEVBQUEsR0FBQSxhQUFBLENBQUEsQ0FBQTtBQ01MLFdBQVMsT0FBVSxZQUE4Qjs7QUFDdEQsWUFBUSxnQkFBVyxTQUFYLFlBQW1CLFdBQVc7QUFBQSxFQUN4QztBQUtPLFdBQVMsUUFBUSxRQUEwQjtBQUNoRCxXQUFPLENBQUMsQ0FBQyxjQUFjLE1BQU07QUFBQSxFQUMvQjtBQUtPLFdBQVMsY0FBaUIsT0FBc0M7O0FBQ3JFLFFBQUksT0FBTyxVQUFVLFlBQVksVUFBVSxLQUFNLFFBQU87QUFDeEQsWUFBUSxXQUE0QyxXQUFXLE1BQXZELFlBQTREO0FBQUEsRUFDdEU7QUFLTyxXQUFTLFNBQTJCLE9BQWE7O0FBQ3RELFVBQU0sYUFBYSxjQUFjLEtBQUs7QUFDdEMsV0FBTyxjQUFlLGdCQUFXLFNBQVgsWUFBbUIsV0FBVyxXQUFrQjtBQUFBLEVBQ3hFO0FBTU8sV0FBUyxZQUFZLE9BQWlDO0FBQzNELFFBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxTQUFVLFFBQU87QUFDeEQsV0FBTyxNQUFN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QUFPLFFBQVEsVUFBVTtBQUN2RCxnQkFBTSxTQUFTLGdCQUFnQixHQUFHO0FBQ2xDLGNBQUksV0FBVyxNQUFNO0FBQ25CLG9CQUFRLHVDQUF1QyxHQUFHLGNBQWM7QUFBQSxVQUNsRTtBQUNBLGdCQUFNO0FBQUEsUUFDUjtBQUVBLGVBQVEsVUFBa0IsR0FBRztBQUM3QjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLEtBQUssVUFBVTtBQUNiLFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLGlDQUFpQztBQUFBLFFBQzNDO0FBQ0EsY0FBTSxZQUFZLEtBQUssSUFBSSxHQUFHLE9BQU8sVUFBVSxNQUFNO0FBQ3JELGtCQUFVO0FBQUEsVUFDUjtBQUFBLFVBQ0EsR0FBRztBQUFBLFVBQ0gsR0FBSSxjQUFjLEdBQUcsUUFBUSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUc7QUFBQSxRQUFBO0FBRTdEO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSztBQUNILFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLG1DQUFtQztBQUFBLFFBQzdDO0FBQ0EsWUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLFNBQVMsVUFBVSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUc7QUFDeEQsb0JBQVUsS0FBSyxjQUFjLFVBQVUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUEsUUFDN0Q7QUFDQTtBQUFBLE1BRUYsS0FBSztBQUNILFlBQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLGtCQUFRLHdDQUF3QztBQUFBLFFBQ2xEO0FBRUEsaUJBQVMsSUFBSSxVQUFVLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM5QyxjQUFJLFVBQVUsVUFBVSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUc7QUFDckMsc0JBQVUsT0FBTyxHQUFHLENBQUM7QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFDQTtBQUFBLE1BRUY7QUFDRSxjQUFNLFFBQVEsMkJBQTRCLEdBQVcsSUFBSSxFQUFFO0FBQUEsSUFBQTtBQUFBLEVBRWpFO0FBd0JPLFdBQVMsU0FBUyxLQUFvQixRQUFvQixTQUFpQzs7QUFDaEcsVUFBTSxlQUFjLHdDQUFTLGdCQUFULFlBQXdCO0FBQzVDLGVBQVcsTUFBTSxLQUFLO0FBQ3BCLGNBQVEsUUFBUSxJQUFJLFdBQVc7QUFBQSxJQUNqQztBQUFBLEVBQ0Y7Ozs7Ozs7Ozs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNSw2LDcsOF19
|