mobx-keystone-yjs 1.5.4 → 1.5.5

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.
@@ -1,29 +1,9 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { createAtom, reaction, observe, computed, action, runInAction } from "mobx";
5
- import { createContext, types, Model, tProp, frozen, getParentToChildPath, onSnapshot, model, modelSnapshotOutWithMetadata, applyPatches, onPatches, onGlobalPatches, fromSnapshot } from "mobx-keystone";
4
+ import { createAtom, reaction, observe, computed, action } from "mobx";
5
+ import { createContext, Model, tProp, types, frozen, getParentToChildPath, onSnapshot, model, modelSnapshotOutWithMetadata, applyPatches, onPatches, onGlobalPatches, fromSnapshot } from "mobx-keystone";
6
6
  import * as Y from "yjs";
7
- function __decorate(decorators, target, key, desc) {
8
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11
- return c > 3 && r && Object.defineProperty(target, key, r), r;
12
- }
13
- typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
14
- var e = new Error(message);
15
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
16
- };
17
- class MobxKeystoneYjsError extends Error {
18
- constructor(msg) {
19
- super(msg);
20
- Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
21
- }
22
- }
23
- function failure(msg) {
24
- return new MobxKeystoneYjsError(msg);
25
- }
26
- const yjsBindingContext = createContext(void 0);
27
7
  const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
28
8
  const getYjsCollectionAtom = (yjsCollection) => {
29
9
  return yjsCollectionAtoms.get(yjsCollection);
@@ -36,6 +16,22 @@ const getOrCreateYjsCollectionAtom = (yjsCollection) => {
36
16
  }
37
17
  return atom;
38
18
  };
19
+ function isYjsValueDeleted(yjsValue) {
20
+ var _a, _b;
21
+ if (yjsValue instanceof Y.AbstractType) {
22
+ return !!((_a = yjsValue._item) == null ? void 0 : _a.deleted) || !!((_b = yjsValue.doc) == null ? void 0 : _b.isDestroyed);
23
+ }
24
+ return false;
25
+ }
26
+ class MobxKeystoneYjsError extends Error {
27
+ constructor(msg) {
28
+ super(msg);
29
+ Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
30
+ }
31
+ }
32
+ function failure(msg) {
33
+ return new MobxKeystoneYjsError(msg);
34
+ }
39
35
  function resolveYjsPath(yjsObject, path) {
40
36
  let currentYjsObject = yjsObject;
41
37
  path.forEach((pathPart, i) => {
@@ -48,14 +44,29 @@ function resolveYjsPath(yjsObject, path) {
48
44
  const key = Number(pathPart);
49
45
  currentYjsObject = currentYjsObject.get(key);
50
46
  } else {
51
- throw failure(`Y.Map or Y.Array was expected at path ${JSON.stringify(path.slice(0, i))} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`);
47
+ throw failure(
48
+ `Y.Map or Y.Array was expected at path ${JSON.stringify(
49
+ path.slice(0, i)
50
+ )} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`
51
+ );
52
52
  }
53
53
  });
54
54
  return currentYjsObject;
55
55
  }
56
+ const yjsBindingContext = createContext(void 0);
57
+ var __defProp2 = Object.defineProperty;
58
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
59
+ var __decorateClass = (decorators, target, key, kind) => {
60
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
61
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
62
+ if (decorator = decorators[i])
63
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
64
+ if (kind && result) __defProp2(target, key, result);
65
+ return result;
66
+ };
56
67
  const deltaListType = types.array(types.frozen(types.unchecked()));
57
68
  const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
58
- let YjsTextModel = class YjsTextModel2 extends Model({
69
+ let YjsTextModel = class extends Model({
59
70
  deltaList: tProp(deltaListType, () => [])
60
71
  }) {
61
72
  constructor() {
@@ -79,13 +90,12 @@ let YjsTextModel = class YjsTextModel2 extends Model({
79
90
  ]
80
91
  });
81
92
  }
82
- /**
83
- * The Y.js path from the bound object to the YjsTextModel instance.
84
- */
85
93
  get _yjsObjectPath() {
86
94
  const ctx = yjsBindingContext.get(this);
87
95
  if ((ctx == null ? void 0 : ctx.boundObject) == null) {
88
- throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
96
+ throw failure(
97
+ "the YjsTextModel instance must be part of a bound object before it can be accessed"
98
+ );
89
99
  }
90
100
  const path = getParentToChildPath(ctx.boundObject, this);
91
101
  if (!path) {
@@ -93,17 +103,11 @@ let YjsTextModel = class YjsTextModel2 extends Model({
93
103
  }
94
104
  return path;
95
105
  }
96
- /**
97
- * The Yjs.Text object present at this mobx-keystone node's path.
98
- */
99
106
  get _yjsObjectAtPath() {
100
107
  const path = this._yjsObjectPath;
101
108
  const ctx = yjsBindingContext.get(this);
102
109
  return resolveYjsPath(ctx.yjsObject, path);
103
110
  }
104
- /**
105
- * The Yjs.Text object represented by this mobx-keystone node.
106
- */
107
111
  get yjsText() {
108
112
  const yjsObject = this._yjsObjectAtPath;
109
113
  if (!(yjsObject instanceof Y.Text)) {
@@ -111,13 +115,27 @@ let YjsTextModel = class YjsTextModel2 extends Model({
111
115
  }
112
116
  return yjsObject;
113
117
  }
114
- /**
115
- * The text value of the Yjs.Text object.
116
- * Shortcut for `yjsText.toString()`, but computed.
117
- */
118
118
  get text() {
119
119
  this.yjsTextChangedAtom.reportObserved();
120
- return this.yjsText.toString();
120
+ const ctx = yjsBindingContext.get(this);
121
+ if ((ctx == null ? void 0 : ctx.boundObject) != null) {
122
+ try {
123
+ const yjsTextString = this.yjsText.toString();
124
+ if (yjsTextString !== "" || this.deltaList.length === 0) {
125
+ return yjsTextString;
126
+ }
127
+ } catch {
128
+ }
129
+ }
130
+ return this.deltaListToText();
131
+ }
132
+ deltaListToText() {
133
+ const doc = new Y.Doc();
134
+ const text = doc.getText();
135
+ this.deltaList.forEach((d) => {
136
+ text.applyDelta(d.data);
137
+ });
138
+ return text.toString();
121
139
  }
122
140
  onInit() {
123
141
  const shouldReplicateToYjs = (ctx) => {
@@ -126,29 +144,36 @@ let YjsTextModel = class YjsTextModel2 extends Model({
126
144
  let reapplyDeltasToYjsText = false;
127
145
  const newDeltas = [];
128
146
  let disposeObserveDeltaList;
129
- const disposeReactionToDeltaListRefChange = reaction(() => this.$.deltaList, (deltaList) => {
130
- disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
131
- disposeObserveDeltaList = void 0;
132
- disposeObserveDeltaList = observe(deltaList, (change) => {
133
- if (reapplyDeltasToYjsText) {
134
- return;
135
- }
136
- if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
137
- return;
138
- }
139
- if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
140
- newDeltas.push(...change.added);
141
- } else {
142
- reapplyDeltasToYjsText = true;
143
- }
144
- });
145
- }, { fireImmediately: true });
147
+ const disposeReactionToDeltaListRefChange = reaction(
148
+ () => this.$.deltaList,
149
+ (deltaList) => {
150
+ disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
151
+ disposeObserveDeltaList = void 0;
152
+ disposeObserveDeltaList = observe(deltaList, (change) => {
153
+ if (reapplyDeltasToYjsText) {
154
+ return;
155
+ }
156
+ if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
157
+ return;
158
+ }
159
+ if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
160
+ newDeltas.push(...change.added);
161
+ } else {
162
+ reapplyDeltasToYjsText = true;
163
+ }
164
+ });
165
+ },
166
+ { fireImmediately: true }
167
+ );
146
168
  const disposeOnSnapshot = onSnapshot(this, () => {
147
169
  try {
148
170
  if (reapplyDeltasToYjsText) {
149
171
  const ctx = yjsBindingContext.get(this);
150
172
  if (shouldReplicateToYjs(ctx)) {
151
173
  const { yjsText } = this;
174
+ if (isYjsValueDeleted(yjsText)) {
175
+ throw failure("cannot reapply deltas to deleted Yjs.Text");
176
+ }
152
177
  ctx.yjsDoc.transact(() => {
153
178
  if (yjsText.length > 0) {
154
179
  yjsText.delete(0, yjsText.length);
@@ -162,6 +187,9 @@ let YjsTextModel = class YjsTextModel2 extends Model({
162
187
  const ctx = yjsBindingContext.get(this);
163
188
  if (shouldReplicateToYjs(ctx)) {
164
189
  const { yjsText } = this;
190
+ if (isYjsValueDeleted(yjsText)) {
191
+ throw failure("cannot reapply deltas to deleted Yjs.Text");
192
+ }
165
193
  ctx.yjsDoc.transact(() => {
166
194
  newDeltas.forEach((frozenDeltas) => {
167
195
  yjsText.applyDelta(frozenDeltas.data);
@@ -174,7 +202,10 @@ let YjsTextModel = class YjsTextModel2 extends Model({
174
202
  newDeltas.length = 0;
175
203
  }
176
204
  });
177
- const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(() => this.yjsText, this.yjsTextChangedAtom);
205
+ const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
206
+ () => this.yjsText,
207
+ this.yjsTextChangedAtom
208
+ );
178
209
  return () => {
179
210
  disposeOnSnapshot();
180
211
  disposeReactionToDeltaListRefChange();
@@ -184,19 +215,19 @@ let YjsTextModel = class YjsTextModel2 extends Model({
184
215
  };
185
216
  }
186
217
  };
187
- __decorate([
218
+ __decorateClass([
188
219
  computed
189
- ], YjsTextModel.prototype, "_yjsObjectPath", null);
190
- __decorate([
220
+ ], YjsTextModel.prototype, "_yjsObjectPath", 1);
221
+ __decorateClass([
191
222
  computed
192
- ], YjsTextModel.prototype, "_yjsObjectAtPath", null);
193
- __decorate([
223
+ ], YjsTextModel.prototype, "_yjsObjectAtPath", 1);
224
+ __decorateClass([
194
225
  computed
195
- ], YjsTextModel.prototype, "yjsText", null);
196
- __decorate([
226
+ ], YjsTextModel.prototype, "yjsText", 1);
227
+ __decorateClass([
197
228
  computed
198
- ], YjsTextModel.prototype, "text", null);
199
- YjsTextModel = __decorate([
229
+ ], YjsTextModel.prototype, "text", 1);
230
+ YjsTextModel = __decorateClass([
200
231
  model(yjsTextModelId)
201
232
  ], YjsTextModel);
202
233
  const DecoratedYjsTextModel = YjsTextModel;
@@ -205,25 +236,30 @@ function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
205
236
  const observeFn = () => {
206
237
  textChangedAtom.reportChanged();
207
238
  };
208
- const disposeReactionToYTextChange = reaction(() => {
209
- try {
210
- return getYjsText();
211
- } catch {
212
- return void 0;
213
- }
214
- }, (yjsText) => {
215
- disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
216
- disposeObserveYjsText = void 0;
217
- if (yjsText) {
218
- yjsText.observe(observeFn);
219
- disposeObserveYjsText = () => {
220
- yjsText.unobserve(observeFn);
221
- };
239
+ const disposeReactionToYTextChange = reaction(
240
+ () => {
241
+ try {
242
+ const yjsText = getYjsText();
243
+ return isYjsValueDeleted(yjsText) ? void 0 : yjsText;
244
+ } catch {
245
+ return void 0;
246
+ }
247
+ },
248
+ (yjsText) => {
249
+ disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
250
+ disposeObserveYjsText = void 0;
251
+ if (yjsText) {
252
+ yjsText.observe(observeFn);
253
+ disposeObserveYjsText = () => {
254
+ yjsText.unobserve(observeFn);
255
+ };
256
+ }
257
+ textChangedAtom.reportChanged();
258
+ },
259
+ {
260
+ fireImmediately: true
222
261
  }
223
- textChangedAtom.reportChanged();
224
- }, {
225
- fireImmediately: true
226
- });
262
+ );
227
263
  return () => {
228
264
  disposeReactionToYTextChange();
229
265
  disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
@@ -241,60 +277,71 @@ function isPlainObject(v) {
241
277
  return !isPlainArray(v) && typeof v === "object" && v !== null;
242
278
  }
243
279
  function convertJsonToYjsData(v) {
244
- return runInAction(() => {
245
- if (isPlainPrimitive(v)) {
280
+ if (isPlainPrimitive(v)) {
281
+ return v;
282
+ }
283
+ if (isPlainArray(v)) {
284
+ const arr = new Y.Array();
285
+ applyJsonArrayToYArray(arr, v);
286
+ return arr;
287
+ }
288
+ if (isPlainObject(v)) {
289
+ if (v.$frozen === true) {
246
290
  return v;
247
291
  }
248
- if (isPlainArray(v)) {
249
- const arr = new Y.Array();
250
- applyJsonArrayToYArray(arr, v);
251
- return arr;
252
- }
253
- if (isPlainObject(v)) {
254
- if (v.$frozen === true) {
255
- return v;
256
- }
257
- if (v.$modelType === yjsTextModelId) {
258
- const text = new Y.Text();
259
- const yjsTextModel = v;
260
- yjsTextModel.deltaList.forEach((frozenDeltas) => {
261
- text.applyDelta(frozenDeltas.data);
262
- });
263
- return text;
264
- }
265
- const map = new Y.Map();
266
- applyJsonObjectToYMap(map, v);
267
- return map;
292
+ if (v.$modelType === yjsTextModelId) {
293
+ const text = new Y.Text();
294
+ const yjsTextModel = v;
295
+ yjsTextModel.deltaList.forEach((frozenDeltas) => {
296
+ text.applyDelta(frozenDeltas.data);
297
+ });
298
+ return text;
268
299
  }
269
- throw new Error(`unsupported value type: ${v}`);
270
- });
300
+ const map = new Y.Map();
301
+ applyJsonObjectToYMap(map, v);
302
+ return map;
303
+ }
304
+ throw new Error(`unsupported value type: ${v}`);
271
305
  }
272
- const applyJsonArrayToYArray = action((dest, source) => {
306
+ const applyJsonArrayToYArray = (dest, source) => {
273
307
  dest.push(source.map(convertJsonToYjsData));
274
- });
275
- const applyJsonObjectToYMap = action((dest, source) => {
308
+ };
309
+ const applyJsonObjectToYMap = (dest, source) => {
276
310
  Object.entries(source).forEach(([k, v]) => {
277
311
  dest.set(k, convertJsonToYjsData(v));
278
312
  });
279
- });
313
+ };
280
314
  function applyMobxKeystonePatchToYjsObject(patch, yjs) {
315
+ if (isYjsValueDeleted(yjs)) {
316
+ throw failure("cannot apply patch to deleted Yjs value");
317
+ }
281
318
  if (patch.path.length > 1) {
282
319
  const [key, ...rest] = patch.path;
283
320
  if (yjs instanceof Y.Map) {
284
321
  const child = yjs.get(String(key));
285
322
  if (child === void 0) {
286
- throw failure(`invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`);
323
+ throw failure(
324
+ `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
325
+ );
287
326
  }
288
327
  applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
289
328
  } else if (yjs instanceof Y.Array) {
290
329
  const child = yjs.get(Number(key));
291
330
  if (child === void 0) {
292
- throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
331
+ throw failure(
332
+ `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
333
+ patch
334
+ )}`
335
+ );
293
336
  }
294
337
  applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
295
338
  } else if (yjs instanceof Y.Text) ;
296
339
  else {
297
- throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
340
+ throw failure(
341
+ `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
342
+ patch
343
+ )}`
344
+ );
298
345
  }
299
346
  } else if (patch.path.length === 1) {
300
347
  if (yjs instanceof Y.Map) {
@@ -346,7 +393,9 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
346
393
  }
347
394
  } else if (yjs instanceof Y.Text) ;
348
395
  else {
349
- throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`);
396
+ throw failure(
397
+ `invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`
398
+ );
350
399
  }
351
400
  } else {
352
401
  throw failure(`invalid patch path, it cannot be empty`);
@@ -382,14 +431,14 @@ function convertYjsEventToPatches(event) {
382
431
  patches.push({
383
432
  op: "add",
384
433
  path,
385
- value: toPlainValue(source.get(key))
434
+ value: convertYjsDataToJson(source.get(key))
386
435
  });
387
436
  break;
388
437
  case "update":
389
438
  patches.push({
390
439
  op: "replace",
391
440
  path,
392
- value: toPlainValue(source.get(key))
441
+ value: convertYjsDataToJson(source.get(key))
393
442
  });
394
443
  break;
395
444
  case "delete":
@@ -424,7 +473,7 @@ function convertYjsEventToPatches(event) {
424
473
  patches.push({
425
474
  op: "add",
426
475
  path,
427
- value: toPlainValue(v)
476
+ value: convertYjsDataToJson(v)
428
477
  });
429
478
  retain++;
430
479
  });
@@ -445,15 +494,12 @@ function convertYjsEventToPatches(event) {
445
494
  }
446
495
  return patches;
447
496
  }
448
- function toPlainValue(v) {
449
- if (v instanceof Y.Map || v instanceof Y.Array) {
450
- return v.toJSON();
451
- } else {
452
- return v;
453
- }
454
- }
455
- function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
456
- const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
497
+ function bindYjsToMobxKeystone({
498
+ yjsDoc,
499
+ yjsObject,
500
+ mobxKeystoneType
501
+ }) {
502
+ const yjsOrigin = /* @__PURE__ */ Symbol("bindYjsToMobxKeystoneTransactionOrigin");
457
503
  let applyingYjsChangesToMobxKeystone = 0;
458
504
  const bindingContext = {
459
505
  yjsDoc,
@@ -473,7 +519,10 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
473
519
  initializationGlobalPatches.push({ target, patches });
474
520
  });
475
521
  try {
476
- const boundObject2 = yjsBindingContext.apply(() => fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
522
+ const boundObject2 = yjsBindingContext.apply(
523
+ () => fromSnapshot(mobxKeystoneType, yjsJson),
524
+ bindingContext
525
+ );
477
526
  yjsBindingContext.set(boundObject2, { ...bindingContext, boundObject: boundObject2 });
478
527
  return boundObject2;
479
528
  } finally {
@@ -515,6 +564,9 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
515
564
  }
516
565
  const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
517
566
  pendingArrayOfArrayOfPatches = [];
567
+ if (isYjsValueDeleted(yjsObject)) {
568
+ return;
569
+ }
518
570
  yjsDoc.transact(() => {
519
571
  arrayOfArrayOfPatches.forEach((arrayOfPatches) => {
520
572
  arrayOfPatches.forEach((patch) => {
@@ -535,21 +587,27 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
535
587
  const parentToChildPath = getParentToChildPath(boundObject, target);
536
588
  if (parentToChildPath !== void 0) {
537
589
  patches.forEach((patch) => {
538
- applyMobxKeystonePatchToYjsObject({
539
- ...patch,
540
- path: [...parentToChildPath, ...patch.path]
541
- }, yjsObject);
590
+ applyMobxKeystonePatchToYjsObject(
591
+ {
592
+ ...patch,
593
+ path: [...parentToChildPath, ...patch.path]
594
+ },
595
+ yjsObject
596
+ );
542
597
  });
543
598
  }
544
599
  });
545
600
  }, yjsOrigin);
601
+ const dispose = () => {
602
+ yjsDoc.off("destroy", dispose);
603
+ disposeOnPatches();
604
+ disposeOnSnapshot();
605
+ yjsObject.unobserveDeep(observeDeepCb);
606
+ };
607
+ yjsDoc.on("destroy", dispose);
546
608
  return {
547
609
  boundObject,
548
- dispose: () => {
549
- disposeOnPatches();
550
- disposeOnSnapshot();
551
- yjsObject.unobserveDeep(observeDeepCb);
552
- },
610
+ dispose,
553
611
  yjsOrigin
554
612
  };
555
613
  }
@@ -563,4 +621,4 @@ export {
563
621
  yjsBindingContext,
564
622
  yjsTextModelId
565
623
  };
566
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgRnJvemVuLFxyXG4gIE1vZGVsLFxyXG4gIGZyb3plbixcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBtb2RlbCxcclxuICBvblNuYXBzaG90LFxyXG4gIHRQcm9wLFxyXG4gIHR5cGVzLFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcclxuaW1wb3J0IHsgcmVzb2x2ZVlqc1BhdGggfSBmcm9tIFwiLi9yZXNvbHZlWWpzUGF0aFwiXHJcblxyXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cclxuLy8gd2UgdXNlIGZyb3plbiBzbyB0aGF0IHdlIGNhbiByZXVzZSBlYWNoIGRlbHRhIGNoYW5nZVxyXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxyXG5cclxuZXhwb3J0IGNvbnN0IHlqc1RleHRNb2RlbElkID0gXCJtb2J4LWtleXN0b25lLXlqcy9ZanNUZXh0TW9kZWxcIlxyXG5cclxuLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZSBtb2RlbCB0aGF0IHJlcHJlc2VudHMgYSBZanMuVGV4dCBvYmplY3QuXHJcbiAqL1xyXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXHJcbmV4cG9ydCBjbGFzcyBZanNUZXh0TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XHJcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXHJcbn0pIHtcclxuICAvKipcclxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cclxuICAgKi9cclxuICBzdGF0aWMgd2l0aFRleHQodGV4dDogc3RyaW5nKTogWWpzVGV4dE1vZGVsIHtcclxuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcclxuICAgICAgZGVsdGFMaXN0OiBbXHJcbiAgICAgICAgZnJvemVuKFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdKSxcclxuICAgICAgXSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChjdHguYm91bmRPYmplY3QsIHRoaXMpXHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGhcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcHJlc2VudCBhdCB0aGlzIG1vYngta2V5c3RvbmUgbm9kZSdzIHBhdGguXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdEF0UGF0aCgpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXHJcblxyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpIVxyXG5cclxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG1vYngta2V5c3RvbmUgbm9kZS5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgeWpzVGV4dCgpOiBZLlRleHQge1xyXG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXHJcblxyXG4gICAgaWYgKCEoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB5anNPYmplY3RcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXHJcbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcclxuICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tLnJlcG9ydE9ic2VydmVkKClcclxuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcclxuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xyXG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxyXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cclxuXHJcbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXHJcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXHJcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcclxuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXHJcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXHJcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXHJcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXHJcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxyXG4gICAgKVxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxyXG5cclxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcclxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxyXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXHJcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cclxuLy8gYnkgdGhlIGRlY29yYXRvclxyXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcclxuXHJcbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XHJcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcclxuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZ2V0WWpzVGV4dCgpXHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICh5anNUZXh0KSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBpZiAoeWpzVGV4dCkge1xyXG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9ICgpID0+IHtcclxuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsLCB5anNUZXh0TW9kZWxJZCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5pbXBvcnQgeyBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0IHsgWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0LCBQbGFpblByaW1pdGl2ZSwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IGFjdGlvbiwgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5cbmZ1bmN0aW9uIGlzUGxhaW5QcmltaXRpdmUodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5QcmltaXRpdmUge1xuICBjb25zdCB0ID0gdHlwZW9mIHZcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBpc1BsYWluQXJyYXkodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5BcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5PYmplY3Qge1xuICByZXR1cm4gIWlzUGxhaW5BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwbGFpbiB2YWx1ZSB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBPYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gWS5NYXBzLCBhcnJheXMgdG8gWS5BcnJheXMsIHByaW1pdGl2ZXMgYXJlIHVudG91Y2hlZC5cbiAqIEZyb3plbiB2YWx1ZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGV5IGFyZSBrZXB0IGFzIGltbXV0YWJsZSBwbGFpbiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBQbGFpblZhbHVlKTogWWpzRGF0YSB7XG4gIHJldHVybiBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgaWYgKGlzUGxhaW5QcmltaXRpdmUodikpIHtcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5BcnJheSh2KSkge1xuICAgICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QodikpIHtcbiAgICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgICAgcmV0dXJuIHZcbiAgICAgIH1cblxuICAgICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IG5ldyBZLlRleHQoKVxuICAgICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgdGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICAgIHJldHVybiBtYXBcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxuICB9KVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkgPSBhY3Rpb24oKGRlc3Q6IFkuQXJyYXk8YW55Piwgc291cmNlOiBQbGFpbkFycmF5KSA9PiB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn0pXG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gb2JqZWN0IHRvIGEgWS5NYXAsIHVzaW5nIHRoZSBjb252ZXJ0SnNvblRvWWpzRGF0YSB0byBjb252ZXJ0IHRoZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUpzb25PYmplY3RUb1lNYXAgPSBhY3Rpb24oKGRlc3Q6IFkuTWFwPGFueT4sIHNvdXJjZTogUGxhaW5PYmplY3QpID0+IHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn0pXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuaW1wb3J0IHsgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvSW5zZXJ0IH0pLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5PYmplY3QsIFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxhbnk+IHwgWS5NYXA8YW55PiB8IFkuVGV4dCB8IFBsYWluVmFsdWVcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRZanNEYXRhVG9Kc29uID0gYWN0aW9uKCh5anNEYXRhOiBZanNEYXRhKTogUGxhaW5WYWx1ZSA9PiB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBQbGFpbk9iamVjdCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgUGxhaW5WYWx1ZVxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn0pXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBQbGFpbkFycmF5LCBQbGFpbk9iamVjdCwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgUGxhaW5WYWx1ZSkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgUGxhaW5PYmplY3QgfCBQbGFpbkFycmF5XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBNb2RlbENsYXNzLFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgdW5rbm93biBhcyBTbmFwc2hvdEluT2Y8VHlwZVRvRGF0YTxUVHlwZT4+KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgeyAuLi5iaW5kaW5nQ29udGV4dCwgYm91bmRPYmplY3QgfSlcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlT25HbG9iYWxQYXRjaGVzKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgZ2V0WWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KT8ucmVwb3J0Q2hhbmdlZCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChwYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xuICAgIGlmIChhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXG5cbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgYXJyYXlPZkFycmF5T2ZQYXRjaGVzLmZvckVhY2goKGFycmF5T2ZQYXRjaGVzKSA9PiB7XG4gICAgICAgIGFycmF5T2ZQYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sIHlqc09yaWdpbilcbiAgfSlcblxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXG5cbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcbiAgICAgICAgfVxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5anNPYmplY3RcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSwgeWpzT3JpZ2luKVxuXG4gIHJldHVybiB7XG4gICAgYm91bmRPYmplY3QsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuICAgIH0sXG4gICAgeWpzT3JpZ2luLFxuICB9XG59XG4iXSwibmFtZXMiOlsiWWpzVGV4dE1vZGVsIiwiYm91bmRPYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFBQTtBQUU3RDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQUE7QUFFckMsU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEs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
624
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20udHMiLCIuLi9zcmMvdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWQudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9yZXNvbHZlWWpzUGF0aC50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXRvbSwgY3JlYXRlQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbmNvbnN0IHlqc0NvbGxlY3Rpb25BdG9tcyA9IG5ldyBXZWFrTWFwPFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiwgSUF0b20+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gPT4ge1xuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbiAgaWYgKCFhdG9tKSB7XG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXG4gIH1cbiAgcmV0dXJuIGF0b21cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgWS5qcyB2YWx1ZSBoYXMgYmVlbiBkZWxldGVkIG9yIGl0cyBkb2N1bWVudCBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHlqc1ZhbHVlIFRoZSBZLmpzIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBkZWxldGVkIG9yIGRlc3Ryb3llZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNWYWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoeWpzVmFsdWUgaW5zdGFuY2VvZiBZLkFic3RyYWN0VHlwZSkge1xuICAgIHJldHVybiAhISh5anNWYWx1ZSBhcyBhbnkpLl9pdGVtPy5kZWxldGVkIHx8ICEheWpzVmFsdWUuZG9jPy5pc0Rlc3Ryb3llZFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuIiwiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgZnJvemVuLFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgTW9kZWwsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0U3RyaW5nID0gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gaWYgdGhlIHlqc1RleHQgaXMgZGV0YWNoZWQsIHRvU3RyaW5nKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHNob3VsZCB1c2UgdGhlIGRlbHRhTGlzdCBhcyBhIGZhbGxiYWNrXG4gICAgICAgIGlmICh5anNUZXh0U3RyaW5nICE9PSBcIlwiIHx8IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB5anNUZXh0U3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWxsIGJhY2sgdG8gZGVsdGFMaXN0XG4gICAgcmV0dXJuIHRoaXMuZGVsdGFMaXN0VG9UZXh0KClcbiAgfVxuXG4gIHByaXZhdGUgZGVsdGFMaXN0VG9UZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jID0gbmV3IFkuRG9jKClcbiAgICBjb25zdCB0ZXh0ID0gZG9jLmdldFRleHQoKVxuICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGQpID0+IHtcbiAgICAgIHRleHQuYXBwbHlEZWx0YShkLmRhdGEpXG4gICAgfSlcbiAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxuICAgIH1cblxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxuXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgIClcblxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuICAgICAgICAgICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpKSB7XG4gICAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVhcHBseSBkZWx0YXMgdG8gZGVsZXRlZCBZanMuVGV4dFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmUtY3JlYXRlIHRoZSBZLlRleHQgb2JqZWN0XG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG4gICAgICAgICAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZWFwcGx5IGRlbHRhcyB0byBkZWxldGVkIFlqcy5UZXh0XCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxuICAgICAgKCkgPT4gdGhpcy55anNUZXh0LFxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cbiAgICApXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UoKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxuICAgIH1cbiAgfVxufVxuXG4vLyB3ZSB1c2UgdGhpcyB0cmljayBqdXN0IHRvIGF2b2lkIGEgYmFiZWwgYnVnIHRoYXQgY2F1c2VzIGNsYXNzZXMgdXNlZCBpbnNpZGUgY2xhc3NlcyBub3QgdG8gYmUgb3ZlcnJpZGVuXG4vLyBieSB0aGUgZGVjb3JhdG9yXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcblxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0ID0gZ2V0WWpzVGV4dCgpXG4gICAgICAgIHJldHVybiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSA/IHVuZGVmaW5lZCA6IHlqc1RleHRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuXG5mdW5jdGlvbiBpc1BsYWluUHJpbWl0aXZlKHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluUHJpbWl0aXZlIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNQbGFpbkFycmF5KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluT2JqZWN0IHtcbiAgcmV0dXJuICFpc1BsYWluQXJyYXkodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGxhaW4gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogUGxhaW5WYWx1ZSk6IFlqc0RhdGEge1xuICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkgPSAoZGVzdDogWS5BcnJheTxhbnk+LCBzb3VyY2U6IFBsYWluQXJyYXkpID0+IHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uT2JqZWN0VG9ZTWFwID0gKGRlc3Q6IFkuTWFwPGFueT4sIHNvdXJjZTogUGxhaW5PYmplY3QpID0+IHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anMpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBwYXRjaCB0byBkZWxldGVkIFlqcyB2YWx1ZVwiKVxuICB9XG5cbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBwYXRjaFxuICAgICAgICAgICl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gY2hhbmdlcyB0byBkZWx0YUxpc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhcnJheSBvYnNlcnZlIGluIHRoZSBZanNUZXh0TW9kZWwgY2xhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGNoXG4gICAgICAgICl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gcGF0Y2gudmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IG5ld0xlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBuZXdMZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShuZXdMZW5ndGgsIHRvRGVsZXRlKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmluc2VydCh5anMubGVuZ3RoLCBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b0luc2VydCB9KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcblxuZXhwb3J0IHR5cGUgWWpzRGF0YSA9IFkuQXJyYXk8YW55PiB8IFkuTWFwPGFueT4gfCBZLlRleHQgfCBQbGFpblZhbHVlXG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0WWpzRGF0YVRvSnNvbiA9IGFjdGlvbigoeWpzRGF0YTogWWpzRGF0YSk6IFBsYWluVmFsdWUgPT4ge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogUGxhaW5PYmplY3QgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIFBsYWluVmFsdWVcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59KVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRZanNEYXRhVG9Kc29uKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbihzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIE1vZGVsQ2xhc3MsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgdW5rbm93biBhcyBTbmFwc2hvdEluT2Y8VHlwZVRvRGF0YTxUVHlwZT4+KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgeyAuLi5iaW5kaW5nQ29udGV4dCwgYm91bmRPYmplY3QgfSlcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlT25HbG9iYWxQYXRjaGVzKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgZ2V0WWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KT8ucmVwb3J0Q2hhbmdlZCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChwYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xuICAgIGlmIChhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXG5cbiAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzT2JqZWN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgIHlqc0RvYy5vZmYoXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG4gICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gIH1cblxuICB5anNEb2Mub24oXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlLFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImJvdW5kT2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxNQUFNLHlDQUF5QixRQUFBO0FBS3hCLE1BQU0sdUJBQXVCLENBQ2xDLGtCQUNzQjtBQUN0QixTQUFPLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLTyxNQUFNLCtCQUErQixDQUMxQyxrQkFDVTtBQUNWLE1BQUksT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNyQyx1QkFBbUIsSUFBSSxlQUFlLElBQUk7QUFBQSxFQUM1QztBQUNBLFNBQU87QUFDVDtBQ2xCTyxTQUFTLGtCQUFrQixVQUE0Qjs7QUFDNUQsTUFBSSxv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