mobx-keystone-yjs 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,25 +1,29 @@
1
- # Change Log
2
-
3
- ## 1.4.0
4
-
5
- - Added `YjsTextModel` as a way to use `Y.Text` as if it were a node.
6
-
7
- ## 1.3.1
8
-
9
- - Added `boundObject` to `yjsBindingContext` so it's easier to access the root bound object from the context.
10
-
11
- ## 1.3.0
12
-
13
- - Frozen values will be stored as plain values in Y.js instead of being deeply converted to Y.js Maps/Arrays, etc. This means storing/fetching frozen values should be faster, require less memory and probably require less space in the Y.js state.
14
-
15
- ## 1.2.0
16
-
17
- - Added `yjsBindingContext` so bound objects offer a context with the Y.js doc, bound object, etc.
18
-
19
- ## 1.1.0
20
-
21
- - Added the `convertJsonToYjsData`, `applyJsonArrayToYArray` and `applyJsonObjectToYMap` functions to help with first migrations from snapshots to Y.js states.
22
-
23
- ## 1.0.0
24
-
25
- - First public release.
1
+ # Change Log
2
+
3
+ ## 1.5.0
4
+
5
+ - Added undefined to accepted primitive "JSON" types.
6
+
7
+ ## 1.4.0
8
+
9
+ - Added `YjsTextModel` as a way to use `Y.Text` as if it were a node.
10
+
11
+ ## 1.3.1
12
+
13
+ - Added `boundObject` to `yjsBindingContext` so it's easier to access the root bound object from the context.
14
+
15
+ ## 1.3.0
16
+
17
+ - Frozen values will be stored as plain values in Y.js instead of being deeply converted to Y.js Maps/Arrays, etc. This means storing/fetching frozen values should be faster, require less memory and probably require less space in the Y.js state.
18
+
19
+ ## 1.2.0
20
+
21
+ - Added `yjsBindingContext` so bound objects offer a context with the Y.js doc, bound object, etc.
22
+
23
+ ## 1.1.0
24
+
25
+ - Added the `convertJsonToYjsData`, `applyJsonArrayToYArray` and `applyJsonObjectToYMap` functions to help with first migrations from snapshots to Y.js states.
26
+
27
+ ## 1.0.0
28
+
29
+ - First public release.
@@ -32,6 +32,9 @@ function failure(msg) {
32
32
  }
33
33
  const yjsBindingContext = createContext(void 0);
34
34
  const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
35
+ const getYjsCollectionAtom = (yjsCollection) => {
36
+ return yjsCollectionAtoms.get(yjsCollection);
37
+ };
35
38
  const getOrCreateYjsCollectionAtom = (yjsCollection) => {
36
39
  let atom = yjsCollectionAtoms.get(yjsCollection);
37
40
  if (!atom) {
@@ -88,7 +91,7 @@ let YjsTextModel = class YjsTextModel2 extends Model({
88
91
  */
89
92
  get _yjsObjectPath() {
90
93
  const ctx = yjsBindingContext.get(this);
91
- if (!ctx || ctx.boundObject == null) {
94
+ if ((ctx == null ? void 0 : ctx.boundObject) == null) {
92
95
  throw failure("the YjsTextModel instance must be part of a bound object before it can be accessed");
93
96
  }
94
97
  const path = getParentToChildPath(ctx.boundObject, this);
@@ -133,21 +136,19 @@ let YjsTextModel = class YjsTextModel2 extends Model({
133
136
  const disposeReactionToDeltaListRefChange = reaction(() => this.$.deltaList, (deltaList) => {
134
137
  disposeObserveDeltaList == null ? void 0 : disposeObserveDeltaList();
135
138
  disposeObserveDeltaList = void 0;
136
- if (deltaList) {
137
- disposeObserveDeltaList = observe(this.$.deltaList, (change) => {
138
- if (reapplyDeltasToYjsText) {
139
- return;
140
- }
141
- if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
142
- return;
143
- }
144
- if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
145
- newDeltas.push(...change.added);
146
- } else {
147
- reapplyDeltasToYjsText = true;
148
- }
149
- });
150
- }
139
+ disposeObserveDeltaList = observe(deltaList, (change) => {
140
+ if (reapplyDeltasToYjsText) {
141
+ return;
142
+ }
143
+ if (!shouldReplicateToYjs(yjsBindingContext.get(this))) {
144
+ return;
145
+ }
146
+ if (change.type === "splice" && change.removedCount === 0 && change.addedCount > 0 && change.index === this.deltaList.length) {
147
+ newDeltas.push(...change.added);
148
+ } else {
149
+ reapplyDeltasToYjsText = true;
150
+ }
151
+ });
151
152
  }, { fireImmediately: true });
152
153
  const disposeOnSnapshot = onSnapshot(this, () => {
153
154
  try {
@@ -236,26 +237,26 @@ function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
236
237
  disposeObserveYjsText = void 0;
237
238
  };
238
239
  }
239
- function isJsonPrimitive(v) {
240
+ function isJsonPrimitiveWithUndefined(v) {
240
241
  const t = typeof v;
241
- return t === "string" || t === "number" || t === "boolean" || v === null;
242
+ return t === "string" || t === "number" || t === "boolean" || v === null || v === void 0;
242
243
  }
243
- function isJsonArray(v) {
244
+ function isJsonArrayWithUndefined(v) {
244
245
  return Array.isArray(v);
245
246
  }
246
- function isJsonObject(v) {
247
- return !isJsonArray(v) && typeof v === "object";
247
+ function isJsonObjectWithUndefined(v) {
248
+ return !isJsonArrayWithUndefined(v) && typeof v === "object";
248
249
  }
249
250
  function convertJsonToYjsData(v) {
250
- if (v === void 0 || isJsonPrimitive(v)) {
251
+ if (v === void 0 || isJsonPrimitiveWithUndefined(v)) {
251
252
  return v;
252
253
  }
253
- if (isJsonArray(v)) {
254
+ if (isJsonArrayWithUndefined(v)) {
254
255
  const arr = new Y.Array();
255
256
  applyJsonArrayToYArray(arr, v);
256
257
  return arr;
257
258
  }
258
- if (isJsonObject(v)) {
259
+ if (isJsonObjectWithUndefined(v)) {
259
260
  if (v.$frozen === true) {
260
261
  return v;
261
262
  }
@@ -323,9 +324,10 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
323
324
  switch (patch.op) {
324
325
  case "replace": {
325
326
  if (key === "length") {
326
- if (yjs.length > patch.value) {
327
- const toDelete = yjs.length - patch.value;
328
- yjs.delete(patch.value, toDelete);
327
+ const newLength = patch.value;
328
+ if (yjs.length > newLength) {
329
+ const toDelete = yjs.length - newLength;
330
+ yjs.delete(newLength, toDelete);
329
331
  } else if (yjs.length < patch.value) {
330
332
  const toInsert = patch.value - yjs.length;
331
333
  yjs.insert(yjs.length, Array(toInsert).fill(void 0));
@@ -351,7 +353,7 @@ function applyMobxKeystonePatchToYjsObject(patch, yjs) {
351
353
  } else if (yjs instanceof Y.Text)
352
354
  ;
353
355
  else {
354
- throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
356
+ throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`);
355
357
  }
356
358
  } else {
357
359
  throw failure(`invalid patch path, it cannot be empty`);
@@ -489,11 +491,12 @@ function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
489
491
  const observeDeepCb = action((events) => {
490
492
  const patches = [];
491
493
  events.forEach((event) => {
494
+ var _a;
492
495
  if (event.transaction.origin !== yjsOrigin) {
493
496
  patches.push(...convertYjsEventToPatches(event));
494
497
  }
495
498
  if (event.target instanceof Y.Map || event.target instanceof Y.Array) {
496
- getOrCreateYjsCollectionAtom(event.target).reportChanged();
499
+ (_a = getYjsCollectionAtom(event.target)) == null ? void 0 : _a.reportChanged();
497
500
  }
498
501
  });
499
502
  if (patches.length > 0) {
@@ -567,4 +570,4 @@ export {
567
570
  yjsBindingContext,
568
571
  yjsTextModelId
569
572
  };
570
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5cclxuLyoqXHJcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgeWpzRG9jOiBZLkRvY1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICAgKi9cclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxyXG4gICAqL1xyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IEFueVR5cGVcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgdHJhbnNhY3Rpb25zLlxyXG4gICAqL1xyXG4gIHlqc09yaWdpbjogc3ltYm9sXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duIHwgdW5kZWZpbmVkXHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXHJcbiAgICovXHJcbiAgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZTogYm9vbGVhblxyXG59XHJcblxyXG4vKipcclxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgeWpzQmluZGluZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXHJcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5cclxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXHJcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbik6IElBdG9tID0+IHtcclxuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcclxuICBpZiAoIWF0b20pIHtcclxuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXHJcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXHJcbiAgfVxyXG4gIHJldHVybiBhdG9tXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XHJcbiAgbGV0IGN1cnJlbnRZanNPYmplY3Q6IHVua25vd24gPSB5anNPYmplY3RcclxuXHJcbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xyXG4gICAgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxyXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxyXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcclxuICAgICAgY29uc3Qga2V5ID0gTnVtYmVyKHBhdGhQYXJ0KVxyXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxyXG4gICAgICAgICl9IGluIG9yZGVyIHRvIHJlc29sdmUgcGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSwgYnV0IGdvdCAke2N1cnJlbnRZanNPYmplY3R9IGluc3RlYWRgXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9KVxyXG5cclxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxyXG59XHJcbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgRnJvemVuLFxyXG4gIE1vZGVsLFxyXG4gIGZyb3plbixcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBtb2RlbCxcclxuICBvblNuYXBzaG90LFxyXG4gIHRQcm9wLFxyXG4gIHR5cGVzLFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcclxuaW1wb3J0IHsgcmVzb2x2ZVlqc1BhdGggfSBmcm9tIFwiLi9yZXNvbHZlWWpzUGF0aFwiXHJcblxyXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cclxuLy8gd2UgdXNlIGZyb3plbiBzbyB0aGF0IHdlIGNhbiByZXVzZSBlYWNoIGRlbHRhIGNoYW5nZVxyXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxyXG5cclxuZXhwb3J0IGNvbnN0IHlqc1RleHRNb2RlbElkID0gXCJtb2J4LWtleXN0b25lLXlqcy9ZanNUZXh0TW9kZWxcIlxyXG5cclxuLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZSBtb2RlbCB0aGF0IHJlcHJlc2VudHMgYSBZanMuVGV4dCBvYmplY3QuXHJcbiAqL1xyXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXHJcbmV4cG9ydCBjbGFzcyBZanNUZXh0TW9kZWwgZXh0ZW5kcyBNb2RlbCh7XHJcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXHJcbn0pIHtcclxuICAvKipcclxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cclxuICAgKi9cclxuICBzdGF0aWMgd2l0aFRleHQodGV4dDogc3RyaW5nKTogWWpzVGV4dE1vZGVsIHtcclxuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcclxuICAgICAgZGVsdGFMaXN0OiBbXHJcbiAgICAgICAgZnJvemVuKFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdKSxcclxuICAgICAgXSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xyXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcbiAgICBpZiAoIWN0eCB8fCBjdHguYm91bmRPYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXRoXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5feWpzT2JqZWN0UGF0aFxyXG5cclxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcclxuXHJcbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXHJcbiAgICovXHJcbiAgQGNvbXB1dGVkXHJcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcclxuICAgIGNvbnN0IHlqc09iamVjdCA9IHRoaXMuX3lqc09iamVjdEF0UGF0aFxyXG5cclxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShgWS5UZXh0IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkodGhpcy5feWpzT2JqZWN0UGF0aCl9YClcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geWpzT2JqZWN0XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgeWpzVGV4dENoYW5nZWRBdG9tID0gY3JlYXRlQXRvbShcInlqc1RleHRDaGFuZ2VkQXRvbVwiKVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgWWpzLlRleHQgb2JqZWN0LlxyXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxyXG4gICAqL1xyXG4gIEBjb21wdXRlZFxyXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXHJcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XHJcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcclxuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcclxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXHJcblxyXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuXHJcbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxyXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxyXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXHJcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcclxuXHJcbiAgICAgICAgaWYgKGRlbHRhTGlzdCkge1xyXG4gICAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKHRoaXMuJC5kZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcclxuICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcclxuICAgICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxyXG4gICAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcclxuICAgICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcclxuICAgICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxyXG4gICAgKVxyXG5cclxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxyXG5cclxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xyXG5cclxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcclxuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcclxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXHJcblxyXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcclxuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXHJcblxyXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXHJcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxyXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXHJcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxyXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxyXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxyXG5cclxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cclxuLy8gYnkgdGhlIGRlY29yYXRvclxyXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcclxuXHJcbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XHJcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcclxuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcclxuICAgICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZ2V0WWpzVGV4dCgpXHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICh5anNUZXh0KSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXHJcblxyXG4gICAgICBpZiAoeWpzVGV4dCkge1xyXG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXHJcblxyXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9ICgpID0+IHtcclxuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiAoKSA9PiB7XHJcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcclxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKc29uVmFsdWUsIEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcclxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuXHJcbmZ1bmN0aW9uIGlzSnNvblByaW1pdGl2ZSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25QcmltaXRpdmUge1xyXG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxyXG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pzb25BcnJheSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25BcnJheSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcclxufVxyXG5cclxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHY6IEpzb25WYWx1ZSk6IHYgaXMgSnNvbk9iamVjdCB7XHJcbiAgcmV0dXJuICFpc0pzb25BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cclxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXHJcbiAqIEZyb3plbiB2YWx1ZXMgYXJlIGEgc3BlY2lhbCBjYXNlIGFuZCB0aGV5IGFyZSBrZXB0IGFzIGltbXV0YWJsZSBwbGFpbiB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlKSB7XHJcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmUodikpIHtcclxuICAgIHJldHVybiB2XHJcbiAgfVxyXG5cclxuICBpZiAoaXNKc29uQXJyYXkodikpIHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcclxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxyXG4gICAgcmV0dXJuIGFyclxyXG4gIH1cclxuXHJcbiAgaWYgKGlzSnNvbk9iamVjdCh2KSkge1xyXG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAvLyBmcm96ZW4gdmFsdWUsIHNhdmUgYXMgaW1tdXRhYmxlIG9iamVjdFxyXG4gICAgICByZXR1cm4gdlxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcclxuICAgICAgY29uc3QgeWpzVGV4dE1vZGVsID0gdiBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cclxuICAgICAgeWpzVGV4dE1vZGVsLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcclxuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiB0ZXh0XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcclxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXHJcbiAgICByZXR1cm4gbWFwXHJcbiAgfVxyXG5cclxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXkpIHtcclxuICBkZXN0LnB1c2goc291cmNlLm1hcChjb252ZXJ0SnNvblRvWWpzRGF0YSkpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25PYmplY3RUb1lNYXAoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSnNvbk9iamVjdCkge1xyXG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xyXG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXHJcblxyXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgcGF0Y2hcclxuICAgICAgICAgICl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XHJcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgKX1gXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxyXG5cclxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXHJcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcclxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XHJcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUpXSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xyXG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtwYXRjaC5wYXRoWzBdfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNEYXRhVG9Kc29uKFxyXG4gIHlqc0RhdGE6IFkuQXJyYXk8dW5rbm93bj4gfCBZLk1hcDx1bmtub3duPiB8IFkuVGV4dCB8IHVua25vd25cclxuKTogSnNvblZhbHVlIHtcclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXHJcbiAgfVxyXG5cclxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxyXG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XHJcbiAgICAgIG9ialtrXSA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIG9ialxyXG4gIH1cclxuXHJcbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcclxuICAgIGNvbnN0IGRlbHRhcyA9IHlqc0RhdGEudG9EZWx0YSgpXHJcblxyXG4gICAgcmV0dXJuIG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEoWWpzVGV4dE1vZGVsLCB7XHJcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcclxuICAgIH0pIGFzIEpzb25WYWx1ZVxyXG4gIH1cclxuXHJcbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcclxuICByZXR1cm4geWpzRGF0YSBhcyBKc29uVmFsdWVcclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XHJcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxyXG5cclxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cclxuXHJcbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xyXG4gICAgbGV0IHJldGFpbiA9IDBcclxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XHJcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcclxuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxyXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldGFpbisrXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XHJcbiAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIFwiZGVsdGFMaXN0XCIsIC0xIC8qIGxhc3QgaXRlbSAqL11cclxuICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICBwYXRoLFxyXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRjaGVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlKSB7XHJcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdCB8IEpzb25BcnJheVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXHJcbmltcG9ydCB7XHJcbiAgQW55RGF0YU1vZGVsLFxyXG4gIEFueU1vZGVsLFxyXG4gIEFueVN0YW5kYXJkVHlwZSxcclxuICBNb2RlbENsYXNzLFxyXG4gIFBhdGNoLFxyXG4gIFR5cGVUb0RhdGEsXHJcbiAgYXBwbHlQYXRjaGVzLFxyXG4gIGZyb21TbmFwc2hvdCxcclxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcclxuICBvbkdsb2JhbFBhdGNoZXMsXHJcbiAgb25QYXRjaGVzLFxyXG4gIG9uU25hcHNob3QsXHJcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxyXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxyXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxyXG4gICAqL1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XHJcbiAgLyoqXHJcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cclxuICAgKi9cclxuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxyXG59KToge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGJvdW5kT2JqZWN0OiBUeXBlVG9EYXRhPFRUeXBlPlxyXG4gIC8qKlxyXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxyXG4gICAqL1xyXG4gIGRpc3Bvc2UoKTogdm9pZFxyXG4gIC8qKlxyXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXHJcbiAgICovXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxyXG5cclxuICBjb25zdCBiaW5kaW5nQ29udGV4dDogWWpzQmluZGluZ0NvbnRleHQgPSB7XHJcbiAgICB5anNEb2MsXHJcbiAgICB5anNPYmplY3QsXHJcbiAgICBtb2J4S2V5c3RvbmVUeXBlLFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXHJcblxyXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XHJcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcclxuICAgIH0sXHJcbiAgfVxyXG5cclxuICBjb25zdCB5anNKc29uID0gY29udmVydFlqc0RhdGFUb0pzb24oeWpzT2JqZWN0KVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcclxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyBhbnkpLFxyXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XHJcbiAgICAgIClcclxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxyXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxyXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCkucmVwb3J0Q2hhbmdlZCgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcclxuICB9KVxyXG5cclxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XHJcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XHJcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xyXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgYXJyYXlPZkFycmF5T2ZQYXRjaGVzLmZvckVhY2goKGFycmF5T2ZQYXRjaGVzKSA9PiB7XHJcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxN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
573
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIE1vZGVsLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHtcbiAgSnNvbkFycmF5V2l0aFVuZGVmaW5lZCxcbiAgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsXG4gIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwianNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uQXJyYXlXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfCB1bmRlZmluZWQpOiBZanNEYXRhIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyciBhcyBZanNEYXRhXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRleHRcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcCBhcyBZanNEYXRhXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXlXaXRoVW5kZWZpbmVkKSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwianNvblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWRcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCxcbn0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHwgSnNvbkFycmF5V2l0aFVuZGVmaW5lZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFNuYXBzaG90SW5PZixcbiAgVHlwZVRvRGF0YSxcbiAgYXBwbHlQYXRjaGVzLFxuICBmcm9tU25hcHNob3QsXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBvbkdsb2JhbFBhdGNoZXMsXG4gIG9uUGF0Y2hlcyxcbiAgb25TbmFwc2hvdCxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGdldFlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IFlqc0RhdGEsIGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QgYXMgWWpzRGF0YSlcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQzVDO0FBQ08sU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEsNEJBQTRCLEVBQUUsS0FBSztBQUNSLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsSUFBQSxX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