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,6 +1,6 @@
1
1
  (function(global, factory) {
2
2
  typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("mobx"), require("mobx-keystone"), require("yjs")) : typeof define === "function" && define.amd ? define(["exports", "mobx", "mobx-keystone", "yjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["mobx-keystone-yjs"] = {}, global.mobx, global["mobx-keystone"], global.yjs));
3
- })(this, function(exports2, mobx, mobxKeystone, Y) {
3
+ })(this, (function(exports2, mobx, mobxKeystone, Y) {
4
4
  "use strict";var __defProp = Object.defineProperty;
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);
@@ -22,26 +22,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
22
22
  return Object.freeze(n);
23
23
  }
24
24
  const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
25
- function __decorate(decorators, target, key, desc) {
26
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
28
- 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;
29
- return c > 3 && r && Object.defineProperty(target, key, r), r;
30
- }
31
- typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
32
- var e = new Error(message);
33
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
34
- };
35
- class MobxKeystoneYjsError extends Error {
36
- constructor(msg) {
37
- super(msg);
38
- Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
39
- }
40
- }
41
- function failure(msg) {
42
- return new MobxKeystoneYjsError(msg);
43
- }
44
- const yjsBindingContext = mobxKeystone.createContext(void 0);
45
25
  const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
46
26
  const getYjsCollectionAtom = (yjsCollection) => {
47
27
  return yjsCollectionAtoms.get(yjsCollection);
@@ -54,6 +34,22 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
54
34
  }
55
35
  return atom;
56
36
  };
37
+ function isYjsValueDeleted(yjsValue) {
38
+ var _a, _b;
39
+ if (yjsValue instanceof Y__namespace.AbstractType) {
40
+ return !!((_a = yjsValue._item) == null ? void 0 : _a.deleted) || !!((_b = yjsValue.doc) == null ? void 0 : _b.isDestroyed);
41
+ }
42
+ return false;
43
+ }
44
+ class MobxKeystoneYjsError extends Error {
45
+ constructor(msg) {
46
+ super(msg);
47
+ Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
48
+ }
49
+ }
50
+ function failure(msg) {
51
+ return new MobxKeystoneYjsError(msg);
52
+ }
57
53
  function resolveYjsPath(yjsObject, path) {
58
54
  let currentYjsObject = yjsObject;
59
55
  path.forEach((pathPart, i) => {
@@ -66,14 +62,29 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
66
62
  const key = Number(pathPart);
67
63
  currentYjsObject = currentYjsObject.get(key);
68
64
  } else {
69
- 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`);
65
+ throw failure(
66
+ `Y.Map or Y.Array was expected at path ${JSON.stringify(
67
+ path.slice(0, i)
68
+ )} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`
69
+ );
70
70
  }
71
71
  });
72
72
  return currentYjsObject;
73
73
  }
74
+ const yjsBindingContext = mobxKeystone.createContext(void 0);
75
+ var __defProp2 = Object.defineProperty;
76
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
77
+ var __decorateClass = (decorators, target, key, kind) => {
78
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
79
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
80
+ if (decorator = decorators[i])
81
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
82
+ if (kind && result) __defProp2(target, key, result);
83
+ return result;
84
+ };
74
85
  const deltaListType = mobxKeystone.types.array(mobxKeystone.types.frozen(mobxKeystone.types.unchecked()));
75
86
  const yjsTextModelId = "mobx-keystone-yjs/YjsTextModel";
76
- exports2.YjsTextModel = class YjsTextModel2 extends mobxKeystone.Model({
87
+ exports2.YjsTextModel = class YjsTextModel extends mobxKeystone.Model({
77
88
  deltaList: mobxKeystone.tProp(deltaListType, () => [])
78
89
  }) {
79
90
  constructor() {
@@ -97,13 +108,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
97
108
  ]
98
109
  });
99
110
  }
100
- /**
101
- * The Y.js path from the bound object to the YjsTextModel instance.
102
- */
103
111
  get _yjsObjectPath() {
104
112
  const ctx = yjsBindingContext.get(this);
105
113
  if ((ctx == null ? void 0 : ctx.boundObject) == null) {
106
- throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
114
+ throw failure(
115
+ "the YjsTextModel instance must be part of a bound object before it can be accessed"
116
+ );
107
117
  }
108
118
  const path = mobxKeystone.getParentToChildPath(ctx.boundObject, this);
109
119
  if (!path) {
@@ -111,17 +121,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
111
121
  }
112
122
  return path;
113
123
  }
114
- /**
115
- * The Yjs.Text object present at this mobx-keystone node's path.
116
- */
117
124
  get _yjsObjectAtPath() {
118
125
  const path = this._yjsObjectPath;
119
126
  const ctx = yjsBindingContext.get(this);
120
127
  return resolveYjsPath(ctx.yjsObject, path);
121
128
  }
122
- /**
123
- * The Yjs.Text object represented by this mobx-keystone node.
124
- */
125
129
  get yjsText() {
126
130
  const yjsObject = this._yjsObjectAtPath;
127
131
  if (!(yjsObject instanceof Y__namespace.Text)) {
@@ -129,13 +133,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
129
133
  }
130
134
  return yjsObject;
131
135
  }
132
- /**
133
- * The text value of the Yjs.Text object.
134
- * Shortcut for `yjsText.toString()`, but computed.
135
- */
136
136
  get text() {
137
137
  this.yjsTextChangedAtom.reportObserved();
138
- return this.yjsText.toString();
138
+ const ctx = yjsBindingContext.get(this);
139
+ if ((ctx == null ? void 0 : ctx.boundObject) != null) {
140
+ try {
141
+ const yjsTextString = this.yjsText.toString();
142
+ if (yjsTextString !== "" || this.deltaList.length === 0) {
143
+ return yjsTextString;
144
+ }
145
+ } catch {
146
+ }
147
+ }
148
+ return this.deltaListToText();
149
+ }
150
+ deltaListToText() {
151
+ const doc = new Y__namespace.Doc();
152
+ const text = doc.getText();
153
+ this.deltaList.forEach((d) => {
154
+ text.applyDelta(d.data);
155
+ });
156
+ return text.toString();
139
157
  }
140
158
  onInit() {
141
159
  const shouldReplicateToYjs = (ctx) => {
@@ -144,29 +162,36 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
144
162
  let reapplyDeltasToYjsText = false;
145
163
  const newDeltas = [];
146
164
  let disposeObserveDeltaList;
147
- const disposeReactionToDeltaListRefChange = mobx.reaction(() => this.$.deltaList, (deltaList) => {
148
- disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
149
- disposeObserveDeltaList = void 0;
150
- disposeObserveDeltaList = mobx.observe(deltaList, (change) => {
151
- if (reapplyDeltasToYjsText) {
152
- return;
153
- }
154
- if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
155
- return;
156
- }
157
- if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
158
- newDeltas.push(...change.added);
159
- } else {
160
- reapplyDeltasToYjsText = true;
161
- }
162
- });
163
- }, { fireImmediately: true });
165
+ const disposeReactionToDeltaListRefChange = mobx.reaction(
166
+ () => this.$.deltaList,
167
+ (deltaList) => {
168
+ disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
169
+ disposeObserveDeltaList = void 0;
170
+ disposeObserveDeltaList = mobx.observe(deltaList, (change) => {
171
+ if (reapplyDeltasToYjsText) {
172
+ return;
173
+ }
174
+ if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
175
+ return;
176
+ }
177
+ if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
178
+ newDeltas.push(...change.added);
179
+ } else {
180
+ reapplyDeltasToYjsText = true;
181
+ }
182
+ });
183
+ },
184
+ { fireImmediately: true }
185
+ );
164
186
  const disposeOnSnapshot = mobxKeystone.onSnapshot(this, () => {
165
187
  try {
166
188
  if (reapplyDeltasToYjsText) {
167
189
  const ctx = yjsBindingContext.get(this);
168
190
  if (shouldReplicateToYjs(ctx)) {
169
191
  const { yjsText } = this;
192
+ if (isYjsValueDeleted(yjsText)) {
193
+ throw failure("cannot reapply deltas to deleted Yjs.Text");
194
+ }
170
195
  ctx.yjsDoc.transact(() => {
171
196
  if (yjsText.length > 0) {
172
197
  yjsText.delete(0, yjsText.length);
@@ -180,6 +205,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
180
205
  const ctx = yjsBindingContext.get(this);
181
206
  if (shouldReplicateToYjs(ctx)) {
182
207
  const { yjsText } = this;
208
+ if (isYjsValueDeleted(yjsText)) {
209
+ throw failure("cannot reapply deltas to deleted Yjs.Text");
210
+ }
183
211
  ctx.yjsDoc.transact(() => {
184
212
  newDeltas.forEach((frozenDeltas) => {
185
213
  yjsText.applyDelta(frozenDeltas.data);
@@ -192,7 +220,10 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
192
220
  newDeltas.length = 0;
193
221
  }
194
222
  });
195
- const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(() => this.yjsText, this.yjsTextChangedAtom);
223
+ const diposeYjsTextChangedAtom = hookYjsTextChangedAtom(
224
+ () => this.yjsText,
225
+ this.yjsTextChangedAtom
226
+ );
196
227
  return () => {
197
228
  disposeOnSnapshot();
198
229
  disposeReactionToDeltaListRefChange();
@@ -202,19 +233,19 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
202
233
  };
203
234
  }
204
235
  };
205
- __decorate([
236
+ __decorateClass([
206
237
  mobx.computed
207
- ], exports2.YjsTextModel.prototype, "_yjsObjectPath", null);
208
- __decorate([
238
+ ], exports2.YjsTextModel.prototype, "_yjsObjectPath", 1);
239
+ __decorateClass([
209
240
  mobx.computed
210
- ], exports2.YjsTextModel.prototype, "_yjsObjectAtPath", null);
211
- __decorate([
241
+ ], exports2.YjsTextModel.prototype, "_yjsObjectAtPath", 1);
242
+ __decorateClass([
212
243
  mobx.computed
213
- ], exports2.YjsTextModel.prototype, "yjsText", null);
214
- __decorate([
244
+ ], exports2.YjsTextModel.prototype, "yjsText", 1);
245
+ __decorateClass([
215
246
  mobx.computed
216
- ], exports2.YjsTextModel.prototype, "text", null);
217
- exports2.YjsTextModel = __decorate([
247
+ ], exports2.YjsTextModel.prototype, "text", 1);
248
+ exports2.YjsTextModel = __decorateClass([
218
249
  mobxKeystone.model(yjsTextModelId)
219
250
  ], exports2.YjsTextModel);
220
251
  const DecoratedYjsTextModel = exports2.YjsTextModel;
@@ -223,25 +254,30 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
223
254
  const observeFn = () => {
224
255
  textChangedAtom.reportChanged();
225
256
  };
226
- const disposeReactionToYTextChange = mobx.reaction(() => {
227
- try {
228
- return getYjsText();
229
- } catch {
230
- return void 0;
231
- }
232
- }, (yjsText) => {
233
- disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
234
- disposeObserveYjsText = void 0;
235
- if (yjsText) {
236
- yjsText.observe(observeFn);
237
- disposeObserveYjsText = () => {
238
- yjsText.unobserve(observeFn);
239
- };
257
+ const disposeReactionToYTextChange = mobx.reaction(
258
+ () => {
259
+ try {
260
+ const yjsText = getYjsText();
261
+ return isYjsValueDeleted(yjsText) ? void 0 : yjsText;
262
+ } catch {
263
+ return void 0;
264
+ }
265
+ },
266
+ (yjsText) => {
267
+ disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
268
+ disposeObserveYjsText = void 0;
269
+ if (yjsText) {
270
+ yjsText.observe(observeFn);
271
+ disposeObserveYjsText = () => {
272
+ yjsText.unobserve(observeFn);
273
+ };
274
+ }
275
+ textChangedAtom.reportChanged();
276
+ },
277
+ {
278
+ fireImmediately: true
240
279
  }
241
- textChangedAtom.reportChanged();
242
- }, {
243
- fireImmediately: true
244
- });
280
+ );
245
281
  return () => {
246
282
  disposeReactionToYTextChange();
247
283
  disposeObserveYjsText == null ? void 0 : disposeObserveYjsText();
@@ -259,60 +295,71 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
259
295
  return !isPlainArray(v) && typeof v === "object" && v !== null;
260
296
  }
261
297
  function convertJsonToYjsData(v) {
262
- return mobx.runInAction(() => {
263
- if (isPlainPrimitive(v)) {
298
+ if (isPlainPrimitive(v)) {
299
+ return v;
300
+ }
301
+ if (isPlainArray(v)) {
302
+ const arr = new Y__namespace.Array();
303
+ applyJsonArrayToYArray(arr, v);
304
+ return arr;
305
+ }
306
+ if (isPlainObject(v)) {
307
+ if (v.$frozen === true) {
264
308
  return v;
265
309
  }
266
- if (isPlainArray(v)) {
267
- const arr = new Y__namespace.Array();
268
- applyJsonArrayToYArray(arr, v);
269
- return arr;
270
- }
271
- if (isPlainObject(v)) {
272
- if (v.$frozen === true) {
273
- return v;
274
- }
275
- if (v.$modelType === yjsTextModelId) {
276
- const text = new Y__namespace.Text();
277
- const yjsTextModel = v;
278
- yjsTextModel.deltaList.forEach((frozenDeltas) => {
279
- text.applyDelta(frozenDeltas.data);
280
- });
281
- return text;
282
- }
283
- const map = new Y__namespace.Map();
284
- applyJsonObjectToYMap(map, v);
285
- return map;
310
+ if (v.$modelType === yjsTextModelId) {
311
+ const text = new Y__namespace.Text();
312
+ const yjsTextModel = v;
313
+ yjsTextModel.deltaList.forEach((frozenDeltas) => {
314
+ text.applyDelta(frozenDeltas.data);
315
+ });
316
+ return text;
286
317
  }
287
- throw new Error(`unsupported value type: ${v}`);
288
- });
318
+ const map = new Y__namespace.Map();
319
+ applyJsonObjectToYMap(map, v);
320
+ return map;
321
+ }
322
+ throw new Error(`unsupported value type: ${v}`);
289
323
  }
290
- const applyJsonArrayToYArray = mobx.action((dest, source) => {
324
+ const applyJsonArrayToYArray = (dest, source) => {
291
325
  dest.push(source.map(convertJsonToYjsData));
292
- });
293
- const applyJsonObjectToYMap = mobx.action((dest, source) => {
326
+ };
327
+ const applyJsonObjectToYMap = (dest, source) => {
294
328
  Object.entries(source).forEach(([k, v]) => {
295
329
  dest.set(k, convertJsonToYjsData(v));
296
330
  });
297
- });
331
+ };
298
332
  function applyMobxKeystonePatchToYjsObject(patch, yjs) {
333
+ if (isYjsValueDeleted(yjs)) {
334
+ throw failure("cannot apply patch to deleted Yjs value");
335
+ }
299
336
  if (patch.path.length > 1) {
300
337
  const [key, ...rest] = patch.path;
301
338
  if (yjs instanceof Y__namespace.Map) {
302
339
  const child = yjs.get(String(key));
303
340
  if (child === void 0) {
304
- throw failure(`invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`);
341
+ throw failure(
342
+ `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
343
+ );
305
344
  }
306
345
  applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
307
346
  } else if (yjs instanceof Y__namespace.Array) {
308
347
  const child = yjs.get(Number(key));
309
348
  if (child === void 0) {
310
- throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
349
+ throw failure(
350
+ `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
351
+ patch
352
+ )}`
353
+ );
311
354
  }
312
355
  applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
313
356
  } else if (yjs instanceof Y__namespace.Text) ;
314
357
  else {
315
- throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
358
+ throw failure(
359
+ `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
360
+ patch
361
+ )}`
362
+ );
316
363
  }
317
364
  } else if (patch.path.length === 1) {
318
365
  if (yjs instanceof Y__namespace.Map) {
@@ -364,7 +411,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
364
411
  }
365
412
  } else if (yjs instanceof Y__namespace.Text) ;
366
413
  else {
367
- throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`);
414
+ throw failure(
415
+ `invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`
416
+ );
368
417
  }
369
418
  } else {
370
419
  throw failure(`invalid patch path, it cannot be empty`);
@@ -400,14 +449,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
400
449
  patches.push({
401
450
  op: "add",
402
451
  path,
403
- value: toPlainValue(source.get(key))
452
+ value: convertYjsDataToJson(source.get(key))
404
453
  });
405
454
  break;
406
455
  case "update":
407
456
  patches.push({
408
457
  op: "replace",
409
458
  path,
410
- value: toPlainValue(source.get(key))
459
+ value: convertYjsDataToJson(source.get(key))
411
460
  });
412
461
  break;
413
462
  case "delete":
@@ -442,7 +491,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
442
491
  patches.push({
443
492
  op: "add",
444
493
  path,
445
- value: toPlainValue(v)
494
+ value: convertYjsDataToJson(v)
446
495
  });
447
496
  retain++;
448
497
  });
@@ -463,15 +512,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
463
512
  }
464
513
  return patches;
465
514
  }
466
- function toPlainValue(v) {
467
- if (v instanceof Y__namespace.Map || v instanceof Y__namespace.Array) {
468
- return v.toJSON();
469
- } else {
470
- return v;
471
- }
472
- }
473
- function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
474
- const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
515
+ function bindYjsToMobxKeystone({
516
+ yjsDoc,
517
+ yjsObject,
518
+ mobxKeystoneType
519
+ }) {
520
+ const yjsOrigin = /* @__PURE__ */ Symbol("bindYjsToMobxKeystoneTransactionOrigin");
475
521
  let applyingYjsChangesToMobxKeystone = 0;
476
522
  const bindingContext = {
477
523
  yjsDoc,
@@ -491,7 +537,10 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
491
537
  initializationGlobalPatches.push({ target, patches });
492
538
  });
493
539
  try {
494
- const boundObject2 = yjsBindingContext.apply(() => mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
540
+ const boundObject2 = yjsBindingContext.apply(
541
+ () => mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson),
542
+ bindingContext
543
+ );
495
544
  yjsBindingContext.set(boundObject2, { ...bindingContext, boundObject: boundObject2 });
496
545
  return boundObject2;
497
546
  } finally {
@@ -533,6 +582,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
533
582
  }
534
583
  const arrayOfArrayOfPatches = pendingArrayOfArrayOfPatches;
535
584
  pendingArrayOfArrayOfPatches = [];
585
+ if (isYjsValueDeleted(yjsObject)) {
586
+ return;
587
+ }
536
588
  yjsDoc.transact(() => {
537
589
  arrayOfArrayOfPatches.forEach((arrayOfPatches) => {
538
590
  arrayOfPatches.forEach((patch) => {
@@ -553,21 +605,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
553
605
  const parentToChildPath = mobxKeystone.getParentToChildPath(boundObject, target);
554
606
  if (parentToChildPath !== void 0) {
555
607
  patches.forEach((patch) => {
556
- applyMobxKeystonePatchToYjsObject({
557
- ...patch,
558
- path: [...parentToChildPath, ...patch.path]
559
- }, yjsObject);
608
+ applyMobxKeystonePatchToYjsObject(
609
+ {
610
+ ...patch,
611
+ path: [...parentToChildPath, ...patch.path]
612
+ },
613
+ yjsObject
614
+ );
560
615
  });
561
616
  }
562
617
  });
563
618
  }, yjsOrigin);
619
+ const dispose = () => {
620
+ yjsDoc.off("destroy", dispose);
621
+ disposeOnPatches();
622
+ disposeOnSnapshot();
623
+ yjsObject.unobserveDeep(observeDeepCb);
624
+ };
625
+ yjsDoc.on("destroy", dispose);
564
626
  return {
565
627
  boundObject,
566
- dispose: () => {
567
- disposeOnPatches();
568
- disposeOnSnapshot();
569
- yjsObject.unobserveDeep(observeDeepCb);
570
- },
628
+ dispose,
571
629
  yjsOrigin
572
630
  };
573
631
  }
@@ -579,5 +637,5 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
579
637
  exports2.yjsBindingContext = yjsBindingContext;
580
638
  exports2.yjsTextModelId = yjsTextModelId;
581
639
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
582
- });
583
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcclxuaW1wb3J0IHtcclxuICBGcm96ZW4sXHJcbiAgTW9kZWwsXHJcbiAgZnJvemVuLFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG1vZGVsLFxyXG4gIG9uU25hcHNob3QsXHJcbiAgdFByb3AsXHJcbiAgdHlwZXMsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcclxuXHJcbi8vIERlbHRhW11bXSwgc2luY2UgZWFjaCBzaW5nbGUgY2hhbmdlIGlzIGEgRGVsdGFbXVxyXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXHJcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXHJcblxyXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXHJcblxyXG4vKipcclxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cclxuICovXHJcbkBtb2RlbCh5anNUZXh0TW9kZWxJZClcclxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcclxuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcclxufSkge1xyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxyXG4gICAqL1xyXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xyXG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xyXG4gICAgICBkZWx0YUxpc3Q6IFtcclxuICAgICAgICBmcm96ZW4oW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpbnNlcnQ6IHRleHQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0pLFxyXG4gICAgICBdLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBcInRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgbXVzdCBiZSBwYXJ0IG9mIGEgYm91bmQgb2JqZWN0IGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWRcIlxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcclxuICAgIGlmICghcGF0aCkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIGlzIG5vdCBhdmFpbGFibGVcIilcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0aFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcclxuXHJcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXHJcblxyXG4gICAgcmV0dXJuIHJlc29sdmVZanNQYXRoKGN0eC55anNPYmplY3QsIHBhdGgpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XHJcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcclxuXHJcbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHlqc09iamVjdFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXRvbSB0aGF0IGdldHMgY2hhbmdlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIFkuanMgdGV4dCBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cclxuICAgKiBTaG9ydGN1dCBmb3IgYHlqc1RleHQudG9TdHJpbmcoKWAsIGJ1dCBjb21wdXRlZC5cclxuICAgKi9cclxuICBAY29tcHV0ZWRcclxuICBnZXQgdGV4dCgpOiBzdHJpbmcge1xyXG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxyXG4gICAgcmV0dXJuIHRoaXMueWpzVGV4dC50b1N0cmluZygpXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xyXG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XHJcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxyXG5cclxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcclxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XHJcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xyXG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcclxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxyXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcclxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xyXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxyXG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcclxuXHJcbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcclxuXHJcbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXHJcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcclxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cclxuICAgIClcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxyXG4vLyBieSB0aGUgZGVjb3JhdG9yXHJcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxyXG5cclxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcclxuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xyXG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgKHlqc1RleHQpID0+IHtcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgIGlmICh5anNUZXh0KSB7XHJcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcclxuXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmlyZUltbWVkaWF0ZWx5OiB0cnVlLFxyXG4gICAgfVxyXG4gIClcclxuXHJcbiAgcmV0dXJuICgpID0+IHtcclxuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxyXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgYWN0aW9uLCBydW5JbkFjdGlvbiB9IGZyb20gXCJtb2J4XCJcblxuZnVuY3Rpb24gaXNQbGFpblByaW1pdGl2ZSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpblByaW1pdGl2ZSB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5BcnJheSh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbkFycmF5IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2OiBQbGFpblZhbHVlKTogdiBpcyBQbGFpbk9iamVjdCB7XG4gIHJldHVybiAhaXNQbGFpbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGxcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBsYWluIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IFBsYWluVmFsdWUpOiBZanNEYXRhIHtcbiAgcmV0dXJuIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2KSkge1xuICAgICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxuICAgICAgICByZXR1cm4gdlxuICAgICAgfVxuXG4gICAgICBpZiAodi4kbW9kZWxUeXBlID09PSB5anNUZXh0TW9kZWxJZCkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiB0ZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgICAgcmV0dXJuIG1hcFxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG4gIH0pXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uQXJyYXlUb1lBcnJheSA9IGFjdGlvbigoZGVzdDogWS5BcnJheTxhbnk+LCBzb3VyY2U6IFBsYWluQXJyYXkpID0+IHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufSlcblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbk9iamVjdFRvWU1hcCA9IGFjdGlvbigoZGVzdDogWS5NYXA8YW55Piwgc291cmNlOiBQbGFpbk9iamVjdCkgPT4ge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufSlcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5pbXBvcnQgeyBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHBhdGNoLnZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gbmV3TGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUobmV3TGVuZ3RoLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkuZnJvbSh7IGxlbmd0aDogdG9JbnNlcnQgfSkuZmlsbCh1bmRlZmluZWQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSldKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgYXJyYXlgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIGEgWWpzVGV4dE1vZGVsLCBkbyBub3RoaW5nXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke1N0cmluZyhwYXRjaC5wYXRoWzBdKX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcbiAgfVxufVxuIiwiaW1wb3J0IHsgbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBQbGFpbk9iamVjdCwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5pbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5cbmV4cG9ydCB0eXBlIFlqc0RhdGEgPSBZLkFycmF5PGFueT4gfCBZLk1hcDxhbnk+IHwgWS5UZXh0IHwgUGxhaW5WYWx1ZVxuXG5leHBvcnQgY29uc3QgY29udmVydFlqc0RhdGFUb0pzb24gPSBhY3Rpb24oKHlqc0RhdGE6IFlqc0RhdGEpOiBQbGFpblZhbHVlID0+IHtcbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHlqc0RhdGEubWFwKCh2KSA9PiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSlcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICBjb25zdCBvYmo6IFBsYWluT2JqZWN0ID0ge31cbiAgICB5anNEYXRhLmZvckVhY2goKHYsIGspID0+IHtcbiAgICAgIG9ialtrXSA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpXG4gICAgfSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgIGNvbnN0IGRlbHRhcyA9IHlqc0RhdGEudG9EZWx0YSgpIGFzIHVua25vd25bXVxuXG4gICAgcmV0dXJuIG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEoWWpzVGV4dE1vZGVsLCB7XG4gICAgICBkZWx0YUxpc3Q6IGRlbHRhcy5sZW5ndGggPiAwID8gW3sgJGZyb3plbjogdHJ1ZSwgZGF0YTogZGVsdGFzIH1dIDogW10sXG4gICAgfSkgYXMgdW5rbm93biBhcyBQbGFpblZhbHVlXG4gIH1cblxuICAvLyBhc3N1bWUgaXQncyBhIHByaW1pdGl2ZVxuICByZXR1cm4geWpzRGF0YVxufSlcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQ6IFkuWUV2ZW50PGFueT4pOiBQYXRjaFtdIHtcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG5cbiAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXRcblxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXG5cbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXRhaW4rK1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllUZXh0RXZlbnQpIHtcbiAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIFwiZGVsdGFMaXN0XCIsIC0xIC8qIGxhc3QgaXRlbSAqL11cbiAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICBwYXRoLFxuICAgICAgdmFsdWU6IHsgJGZyb3plbjogdHJ1ZSwgZGF0YTogZXZlbnQuZGVsdGEgfSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXNcbn1cblxuZnVuY3Rpb24gdG9QbGFpblZhbHVlKHY6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBQbGFpblZhbHVlKSB7XG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4gdi50b0pTT04oKSBhcyBQbGFpbk9iamVjdCB8IFBsYWluQXJyYXlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdlxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIE1vZGVsQ2xhc3MsXG4gIFBhdGNoLFxuICBTbmFwc2hvdEluT2YsXG4gIFR5cGVUb0RhdGEsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgb25HbG9iYWxQYXRjaGVzLFxuICBvblBhdGNoZXMsXG4gIG9uU25hcHNob3QsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBnZXRZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuPih7XG4gIHlqc0RvYyxcbiAgeWpzT2JqZWN0LFxuICBtb2J4S2V5c3RvbmVUeXBlLFxufToge1xuICAvKipcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXG4gICAqL1xuICB5anNEb2M6IFkuRG9jXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdClcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVDb250ZXh0IiwiY3JlYXRlQXRvbSIsIlkiLCJ0eXBlcyIsIllqc1RleHRNb2RlbCIsIk1vZGVsIiwidFByb3AiLCJmcm96ZW4iLCJnZXRQYXJlbnRUb0NoaWxkUGF0aCIsInJlYWN0aW9uIiwib2JzZXJ2ZSIsIm9uU25hcHNob3QiLCJjb21wdXRlZCIsImV4cG9ydHMiLCJtb2RlbCIsInJ1bkluQWN0aW9uIiwiYWN0aW9uIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBR00sTUFBTyw2QkFBNkIsTUFBSztBQUFBLElBQzdDLFlBQVksS0FBVztBQUNyQixZQUFNLEdBQUc7QUFHRixhQUFBLGVBQWUsTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBQUE7QUFBQSxFQUU3RDtBQUtLLFdBQVUsUUFBUSxLQUFXO0FBQzFCLFdBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUFBLEVBQ3JDO0FDd0JhLFFBQUEsb0JBQW9CQSwyQkFBNkMsTUFBUztBQ3RDdkYsUUFBTSx5Q0FBeUI7QUFLbEIsUUFBQSx1QkFB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
640
+ }));
641
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZC50cyIsIi4uL3NyYy91dGlscy9lcnJvci50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBZLmpzIHZhbHVlIGhhcyBiZWVuIGRlbGV0ZWQgb3IgaXRzIGRvY3VtZW50IGRlc3Ryb3llZC5cbiAqXG4gKiBAcGFyYW0geWpzVmFsdWUgVGhlIFkuanMgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGRlbGV0ZWQgb3IgZGVzdHJveWVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWWpzVmFsdWVEZWxldGVkKHlqc1ZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh5anNWYWx1ZSBpbnN0YW5jZW9mIFkuQWJzdHJhY3RUeXBlKSB7XG4gICAgcmV0dXJuICEhKHlqc1ZhbHVlIGFzIGFueSkuX2l0ZW0/LmRlbGV0ZWQgfHwgISF5anNWYWx1ZS5kb2M/LmlzRGVzdHJveWVkXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgQW55VHlwZSwgY3JlYXRlQ29udGV4dCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWWpzQmluZGluZ0NvbnRleHQge1xuICAvKipcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXG4gICAqL1xuICB5anNEb2M6IFkuRG9jXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcblxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IEFueVR5cGVcblxuICAvKipcbiAgICogVGhlIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgdHJhbnNhY3Rpb25zLlxuICAgKi9cbiAgeWpzT3JpZ2luOiBzeW1ib2xcblxuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogdW5rbm93blxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgYXBwbHlpbmcgWS5qcyBjaGFuZ2VzIHRvIHRoZSBtb2J4LWtleXN0b25lIG1vZGVsLlxuICAgKi9cbiAgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZTogYm9vbGVhblxufVxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4iLCJpbXBvcnQgeyBjb21wdXRlZCwgY3JlYXRlQXRvbSwgSUF0b20sIG9ic2VydmUsIHJlYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgRnJvemVuLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBNb2RlbCxcbiAgbW9kZWwsXG4gIG9uU25hcHNob3QsXG4gIHRQcm9wLFxuICB0eXBlcyxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgaXNZanNWYWx1ZURlbGV0ZWQgfSBmcm9tIFwiLi4vdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWRcIlxuaW1wb3J0IHsgcmVzb2x2ZVlqc1BhdGggfSBmcm9tIFwiLi9yZXNvbHZlWWpzUGF0aFwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbi8vIERlbHRhW11bXSwgc2luY2UgZWFjaCBzaW5nbGUgY2hhbmdlIGlzIGEgRGVsdGFbXVxuLy8gd2UgdXNlIGZyb3plbiBzbyB0aGF0IHdlIGNhbiByZXVzZSBlYWNoIGRlbHRhIGNoYW5nZVxuY29uc3QgZGVsdGFMaXN0VHlwZSA9IHR5cGVzLmFycmF5KHR5cGVzLmZyb3plbih0eXBlcy51bmNoZWNrZWQ8dW5rbm93bltdPigpKSlcblxuZXhwb3J0IGNvbnN0IHlqc1RleHRNb2RlbElkID0gXCJtb2J4LWtleXN0b25lLXlqcy9ZanNUZXh0TW9kZWxcIlxuXG4vKipcbiAqIEEgbW9ieC1rZXlzdG9uZSBtb2RlbCB0aGF0IHJlcHJlc2VudHMgYSBZanMuVGV4dCBvYmplY3QuXG4gKi9cbkBtb2RlbCh5anNUZXh0TW9kZWxJZClcbmV4cG9ydCBjbGFzcyBZanNUZXh0TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XG4gIGRlbHRhTGlzdDogdFByb3AoZGVsdGFMaXN0VHlwZSwgKCkgPT4gW10pLFxufSkge1xuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFlqc1RleHRNb2RlbCBpbnN0YW5jZSB3aXRoIGEgc2ltcGxlIHRleHQuXG4gICAqL1xuICBzdGF0aWMgd2l0aFRleHQodGV4dDogc3RyaW5nKTogWWpzVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRlZFlqc1RleHRNb2RlbCh7XG4gICAgICBkZWx0YUxpc3Q6IFtcbiAgICAgICAgZnJvemVuKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnNlcnQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICBdLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogVGhlIFkuanMgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0UGF0aCgpIHtcbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBcInRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgbXVzdCBiZSBwYXJ0IG9mIGEgYm91bmQgb2JqZWN0IGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWRcIlxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChjdHguYm91bmRPYmplY3QsIHRoaXMpXG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFwiYSBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIGlzIG5vdCBhdmFpbGFibGVcIilcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcHJlc2VudCBhdCB0aGlzIG1vYngta2V5c3RvbmUgbm9kZSdzIHBhdGguXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdEF0UGF0aCgpOiB1bmtub3duIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5feWpzT2JqZWN0UGF0aFxuXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpIVxuXG4gICAgcmV0dXJuIHJlc29sdmVZanNQYXRoKGN0eC55anNPYmplY3QsIHBhdGgpXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIG1vYngta2V5c3RvbmUgbm9kZS5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgeWpzVGV4dCgpOiBZLlRleHQge1xuICAgIGNvbnN0IHlqc09iamVjdCA9IHRoaXMuX3lqc09iamVjdEF0UGF0aFxuXG4gICAgaWYgKCEoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSkge1xuICAgICAgdGhyb3cgZmFpbHVyZShgWS5UZXh0IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkodGhpcy5feWpzT2JqZWN0UGF0aCl9YClcbiAgICB9XG5cbiAgICByZXR1cm4geWpzT2JqZWN0XG4gIH1cblxuICAvKipcbiAgICogQXRvbSB0aGF0IGdldHMgY2hhbmdlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIFkuanMgdGV4dCBjaGFuZ2VzLlxuICAgKi9cbiAgeWpzVGV4dENoYW5nZWRBdG9tID0gY3JlYXRlQXRvbShcInlqc1RleHRDaGFuZ2VkQXRvbVwiKVxuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgWWpzLlRleHQgb2JqZWN0LlxuICAgKiBTaG9ydGN1dCBmb3IgYHlqc1RleHQudG9TdHJpbmcoKWAsIGJ1dCBjb21wdXRlZC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tLnJlcG9ydE9ic2VydmVkKClcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHlqc1RleHRTdHJpbmcgPSB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxuICAgICAgICAvLyBpZiB0aGUgeWpzVGV4dCBpcyBkZXRhY2hlZCwgdG9TdHJpbmcoKSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICAvLyBpbiB0aGF0IGNhc2Ugd2Ugc2hvdWxkIHVzZSB0aGUgZGVsdGFMaXN0IGFzIGEgZmFsbGJhY2tcbiAgICAgICAgaWYgKHlqc1RleHRTdHJpbmcgIT09IFwiXCIgfHwgdGhpcy5kZWx0YUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHlqc1RleHRTdHJpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGZhbGwgYmFja1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZhbGwgYmFjayB0byBkZWx0YUxpc3RcbiAgICByZXR1cm4gdGhpcy5kZWx0YUxpc3RUb1RleHQoKVxuICB9XG5cbiAgcHJpdmF0ZSBkZWx0YUxpc3RUb1RleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb2MgPSBuZXcgWS5Eb2MoKVxuICAgIGNvbnN0IHRleHQgPSBkb2MuZ2V0VGV4dCgpXG4gICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgdGV4dC5hcHBseURlbHRhKGQuZGF0YSlcbiAgICB9KVxuICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG4gICAgICAgICAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZWFwcGx5IGRlbHRhcyB0byBkZWxldGVkIFlqcy5UZXh0XCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcbiAgICAgICAgICAgIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHJlYXBwbHkgZGVsdGFzIHRvIGRlbGV0ZWQgWWpzLlRleHRcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHlqc1RleHQgPSBnZXRZanNUZXh0KClcbiAgICAgICAgcmV0dXJuIGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpID8gdW5kZWZpbmVkIDogeWpzVGV4dFxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgICh5anNUZXh0KSA9PiB7XG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKHlqc1RleHQpIHtcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSAoKSA9PiB7XG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCB7IFlqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBQbGFpbkFycmF5LCBQbGFpbk9iamVjdCwgUGxhaW5QcmltaXRpdmUsIFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5cbmZ1bmN0aW9uIGlzUGxhaW5QcmltaXRpdmUodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5QcmltaXRpdmUge1xuICBjb25zdCB0ID0gdHlwZW9mIHZcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBpc1BsYWluQXJyYXkodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5BcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5PYmplY3Qge1xuICByZXR1cm4gIWlzUGxhaW5BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwbGFpbiB2YWx1ZSB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBPYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gWS5NYXBzLCBhcnJheXMgdG8gWS5BcnJheXMsIHByaW1pdGl2ZXMgYXJlIHVudG91Y2hlZC5cbiAqIEZyb3plbiB2YWx1ZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGV5IGFyZSBrZXB0IGFzIGltbXV0YWJsZSBwbGFpbiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBQbGFpblZhbHVlKTogWWpzRGF0YSB7XG4gIGlmIChpc1BsYWluUHJpbWl0aXZlKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc1BsYWluQXJyYXkodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QodikpIHtcbiAgICBpZiAodi4kZnJvemVuID09PSB0cnVlKSB7XG4gICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxuICAgICAgcmV0dXJuIHZcbiAgICB9XG5cbiAgICBpZiAodi4kbW9kZWxUeXBlID09PSB5anNUZXh0TW9kZWxJZCkge1xuICAgICAgY29uc3QgdGV4dCA9IG5ldyBZLlRleHQoKVxuICAgICAgY29uc3QgeWpzVGV4dE1vZGVsID0gdiBhcyB1bmtub3duIGFzIFNuYXBzaG90T3V0T2Y8WWpzVGV4dE1vZGVsPlxuICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgdGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgfSlcbiAgICAgIHJldHVybiB0ZXh0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcbiAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uQXJyYXlUb1lBcnJheSA9IChkZXN0OiBZLkFycmF5PGFueT4sIHNvdXJjZTogUGxhaW5BcnJheSkgPT4ge1xuICBkZXN0LnB1c2goc291cmNlLm1hcChjb252ZXJ0SnNvblRvWWpzRGF0YSkpXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gb2JqZWN0IHRvIGEgWS5NYXAsIHVzaW5nIHRoZSBjb252ZXJ0SnNvblRvWWpzRGF0YSB0byBjb252ZXJ0IHRoZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUpzb25PYmplY3RUb1lNYXAgPSAoZGVzdDogWS5NYXA8YW55Piwgc291cmNlOiBQbGFpbk9iamVjdCkgPT4ge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgaXNZanNWYWx1ZURlbGV0ZWQgfSBmcm9tIFwiLi4vdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWRcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2g6IFBhdGNoLCB5anM6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqcykpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGFwcGx5IHBhdGNoIHRvIGRlbGV0ZWQgWWpzIHZhbHVlXCIpXG4gIH1cblxuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvSW5zZXJ0IH0pLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgUGxhaW5PYmplY3QsIFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxhbnk+IHwgWS5NYXA8YW55PiB8IFkuVGV4dCB8IFBsYWluVmFsdWVcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRZanNEYXRhVG9Kc29uID0gYWN0aW9uKCh5anNEYXRhOiBZanNEYXRhKTogUGxhaW5WYWx1ZSA9PiB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBQbGFpbk9iamVjdCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgUGxhaW5WYWx1ZVxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn0pXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogY29udmVydFlqc0RhdGFUb0pzb24oc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRZanNEYXRhVG9Kc29uKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBBbnlEYXRhTW9kZWwsXG4gIEFueU1vZGVsLFxuICBBbnlTdGFuZGFyZFR5cGUsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgTW9kZWxDbGFzcyxcbiAgb25HbG9iYWxQYXRjaGVzLFxuICBvblBhdGNoZXMsXG4gIG9uU25hcHNob3QsXG4gIFBhdGNoLFxuICBTbmFwc2hvdEluT2YsXG4gIFR5cGVUb0RhdGEsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBnZXRZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuPih7XG4gIHlqc0RvYyxcbiAgeWpzT2JqZWN0LFxuICBtb2J4S2V5c3RvbmVUeXBlLFxufToge1xuICAvKipcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXG4gICAqL1xuICB5anNEb2M6IFkuRG9jXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdClcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anNPYmplY3QpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgYXJyYXlPZkFycmF5T2ZQYXRjaGVzLmZvckVhY2goKGFycmF5T2ZQYXRjaGVzKSA9PiB7XG4gICAgICAgIGFycmF5T2ZQYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sIHlqc09yaWdpbilcbiAgfSlcblxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXG5cbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcbiAgICAgICAgfVxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5anNPYmplY3RcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSwgeWpzT3JpZ2luKVxuXG4gIGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgeWpzRG9jLm9mZihcImRlc3Ryb3lcIiwgZGlzcG9zZSlcbiAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgfVxuXG4gIHlqc0RvYy5vbihcImRlc3Ryb3lcIiwgZGlzcG9zZSlcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2UsXG4gICAgeWpzT3JpZ2luLFxuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlQXRvbSIsIlkiLCJjcmVhdGVDb250ZXh0IiwidHlwZXMiLCJZanNUZXh0TW9kZWwiLCJNb2RlbCIsInRQcm9wIiwiZnJvemVuIiwiZ2V0UGFyZW50VG9DaGlsZFBhdGgiLCJyZWFjdGlvbiIsIm9ic2VydmUiLCJvblNuYXBzaG90IiwiY29tcHV0ZWQiLCJtb2RlbCIsImFjdGlvbiIsIm1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEiLCJvbkdsb2JhbFBhdGNoZXMiLCJib3VuZE9iamVjdCIsImZyb21TbmFwc2hvdCIsImFwcGx5UGF0Y2hlcyIsIm9uUGF0Y2hlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsUUFB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