@stemy/backend 2.9.6 → 3.0.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.
@@ -46,9 +46,10 @@ export class Asset extends BaseEntity {
46
46
  params = params || {};
47
47
  // Get default crop info
48
48
  const crop = Asset.toCropRegion(meta.crop);
49
- // Return back the stream if there is no params and no default crop exists
50
- if (Object.keys(params).length == 0 && !crop)
49
+ // Return the stream if there is no params and no default crop exists
50
+ if ((meta === null || meta === void 0 ? void 0 : meta.extension) === "svg" || (Object.keys(params).length == 0 && !crop)) {
51
51
  return stream;
52
+ }
52
53
  // Parse params
53
54
  params.rotation = isNaN(params.rotation) ? 0 : Math.round(params.rotation / 90) * 90;
54
55
  params.canvasScaleX = isNaN(params.canvasScaleX) ? 1 : Number(params.canvasScaleX);
@@ -63,51 +64,43 @@ export class Asset extends BaseEntity {
63
64
  const cropBefore = Asset.toCropRegion(params.cropBefore || (params.crop ? meta.cropBefore : null));
64
65
  const cropAfter = Asset.toCropRegion(params.cropAfter || (params.crop ? meta.cropAfter : null));
65
66
  // Get metadata
66
- const imgMeta = yield sharp(buffer).metadata();
67
- let width = imgMeta.width;
68
- let height = imgMeta.height;
67
+ let img = sharp(buffer);
68
+ let { width, height } = yield img.metadata();
69
69
  // Crop before resize
70
70
  if (cropBefore) {
71
- buffer = yield sharp(buffer)
72
- .extract(cropBefore)
73
- .toBuffer();
74
71
  width = cropBefore.width;
75
72
  height = cropBefore.height;
73
+ img = img.extract(cropBefore);
76
74
  }
77
75
  else if (crop) {
78
- buffer = yield sharp(buffer)
79
- .extract(crop)
80
- .toBuffer();
81
76
  width = crop.width;
82
77
  height = crop.height;
78
+ img = img.extract(crop);
83
79
  }
84
80
  // Resize canvas
85
- if (params.canvasScaleX !== 1 || params.canvasScaleY !== 1) {
81
+ const canvasScaleX = (meta === null || meta === void 0 ? void 0 : meta.canvasScaleX) || 1;
82
+ const canvasScaleY = (meta === null || meta === void 0 ? void 0 : meta.canvasScaleY) || 1;
83
+ if (params.canvasScaleX !== canvasScaleX || params.canvasScaleY !== canvasScaleY) {
86
84
  width = Math.round(width * params.canvasScaleX);
87
85
  height = Math.round(height * params.canvasScaleY);
88
- buffer = yield sharp(buffer)
89
- .resize({ width, height, background: "#00000000", fit: "contain" })
90
- .toBuffer();
86
+ img = img.resize({ width, height, background: "#00000000", fit: "contain" });
91
87
  }
92
88
  // Resize image
93
89
  if (params.scaleX !== 1 || params.scaleY !== 1) {
94
90
  width = Math.round(width * params.scaleX);
95
91
  height = Math.round(height * params.scaleY);
96
- buffer = yield sharp(buffer)
97
- .resize({ width, height, background: "#00000000", fit: "fill" })
98
- .toBuffer();
92
+ img = img.resize({ width, height, background: "#00000000", fit: "fill" });
99
93
  }
100
94
  // Crop after resize
101
95
  if (cropAfter) {
102
- buffer = yield sharp(buffer)
103
- .extract(cropAfter)
104
- .toBuffer();
96
+ img = img.extract(cropAfter);
105
97
  }
106
98
  // Rotate
107
99
  if (params.rotation !== 0) {
108
- buffer = yield sharp(buffer).rotate(params.rotation).toBuffer();
100
+ buffer = yield img.toBuffer();
101
+ img = sharp(buffer).rotate(params.rotation);
109
102
  }
110
- return bufferToStream(buffer);
103
+ return bufferToStream(yield img.toBuffer());
111
104
  }
112
105
  catch (e) {
113
106
  console.log("Asset image conversion error", e);
@@ -158,4 +151,4 @@ export class Asset extends BaseEntity {
158
151
  });
159
152
  }
160
153
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxNQUFnQixNQUFNLE9BQU8sQ0FBQztBQU1yQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFNLGFBQWEsR0FBRztJQUNsQixDQUFDLEVBQUUsUUFBUTtJQUNYLENBQUMsRUFBRSxRQUFRO0lBQ1gsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsUUFBUTtDQUNkLENBQUM7QUFFRixNQUFNLE9BQU8sS0FBTSxTQUFRLFVBQWtCO0lBOEd6QyxZQUFZLEVBQVksRUFDWixJQUFxQixFQUNyQixVQUFzQixFQUNaLE1BQW9CO1FBQ3RDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRFYsV0FBTSxHQUFOLE1BQU0sQ0FBYztJQUUxQyxDQUFDO0lBakhTLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBaUM7UUFDM0QsSUFBSSxJQUFJLEdBQUcsUUFBMEIsQ0FBQztRQUN0QyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQixJQUFJO2dCQUNBLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQWtCLENBQUMsQ0FBQzthQUN6QztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FB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UUFBUSxDQUFDLFNBQTRCLElBQUk7O1lBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsQ0FBQztLQUFBO0lBRUssYUFBYSxDQUFDLE1BQTBCLEVBQUUsUUFBcUI7O1lBQ2pFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxDQUFDO0tBQUE7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaGFycF8sIHtSZWdpb259IGZyb20gXCJzaGFycFwiO1xyXG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XHJcbmltcG9ydCB7Q29sbGVjdGlvbiwgR3JpZEZTQnVja2V0fSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldENyb3BJbmZvLCBJQXNzZXRJbWFnZVBhcmFtcywgSUFzc2V0TWV0YX0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2J1ZmZlclRvU3RyZWFtLCBkZWxldGVGcm9tQnVja2V0LCBpc0Jvb2xlYW4sIGlzSW50ZXJmYWNlLCBpc1N0cmluZywgc3RyZWFtVG9CdWZmZXJ9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5jb25zdCBzaGFycCA9IHNoYXJwXztcclxuY29uc3QgY3JvcEludGVyZmFjZSA9IHtcclxuICAgIHg6IFwibnVtYmVyXCIsXHJcbiAgICB5OiBcIm51bWJlclwiLFxyXG4gICAgdzogXCJudW1iZXJcIixcclxuICAgIGg6IFwibnVtYmVyXCJcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldCBleHRlbmRzIEJhc2VFbnRpdHk8SUFzc2V0PiBpbXBsZW1lbnRzIElBc3NldCB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyB0b0Nyb3BSZWdpb24oY3JvcEluZm86IHN0cmluZyB8IElBc3NldENyb3BJbmZvKTogUmVnaW9uIHtcclxuICAgICAgICBsZXQgY3JvcCA9IGNyb3BJbmZvIGFzIElBc3NldENyb3BJbmZvO1xyXG4gICAgICAgIGlmIChpc1N0cmluZyhjcm9wSW5mbykpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNyb3AgPSBKU09OLnBhcnNlKGNyb3BJbmZvIGFzIHN0cmluZyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNJbnRlcmZhY2UoY3JvcCwgY3JvcEludGVyZmFjZSkpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKGNyb3AudyksXHJcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChjcm9wLmgpLFxyXG4gICAgICAgICAgICB0b3A6IE1hdGgucm91bmQoY3JvcC55KSxcclxuICAgICAgICAgICAgbGVmdDogTWF0aC5yb3VuZChjcm9wLngpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGFzeW5jIHRvSW1hZ2Uoc3RyZWFtOiBSZWFkYWJsZSwgbWV0YT86IElBc3NldE1ldGEsIHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcclxuXHJcbiAgICAgICAgLy8gR2V0IGRlZmF1bHQgY3JvcCBpbmZvXHJcbiAgICAgICAgY29uc3QgY3JvcCA9IEFzc2V0LnRvQ3JvcFJlZ2lvbihtZXRhLmNyb3ApO1xyXG5cclxuICAgICAgICAvLyBSZXR1cm4gYmFjayB0aGUgc3RyZWFtIGlmIHRoZXJlIGlzIG5vIHBhcmFtcyBhbmQgbm8gZGVmYXVsdCBjcm9wIGV4aXN0c1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PSAwICYmICFjcm9wKSByZXR1cm4gc3RyZWFtO1xyXG5cclxuICAgICAgICAvLyBQYXJzZSBwYXJhbXNcclxuICAgICAgICBwYXJhbXMucm90YXRpb24gPSBpc05hTihwYXJhbXMucm90YXRpb24pID8gMCA6IE1hdGgucm91bmQocGFyYW1zLnJvdGF0aW9uIC8gOTApICogOTA7XHJcbiAgICAgICAgcGFyYW1zLmNhbnZhc1NjYWxlWCA9IGlzTmFOKHBhcmFtcy5jYW52YXNTY2FsZVgpID8gMSA6IE51bWJlcihwYXJhbXMuY2FudmFzU2NhbGVYKTtcclxuICAgICAgICBwYXJhbXMuY2FudmFzU2NhbGVZID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVkpO1xyXG4gICAgICAgIHBhcmFtcy5zY2FsZVggPSBpc05hTihwYXJhbXMuc2NhbGVYKSA/IDEgOiBOdW1iZXIocGFyYW1zLnNjYWxlWCk7XHJcbiAgICAgICAgcGFyYW1zLnNjYWxlWSA9IGlzTmFOKHBhcmFtcy5zY2FsZVkpID8gMSA6IE51bWJlcihwYXJhbXMuc2NhbGVZKTtcclxuICAgICAgICBwYXJhbXMuY3JvcCA9IGlzQm9vbGVhbihwYXJhbXMuY3JvcCkgPyBwYXJhbXMuY3JvcCA6IHBhcmFtcy5jcm9wID09IFwidHJ1ZVwiO1xyXG5cclxuICAgICAgICAvLyBUcnkgdG8gbW9kaWZ5IGltYWdlXHJcbiAgICAgICAgbGV0IGJ1ZmZlciA9IGF3YWl0IHN0cmVhbVRvQnVmZmVyKHN0cmVhbSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gR2V0IGNyb3AgaW5mb1xyXG4gICAgICAgICAgICBjb25zdCBjcm9wQmVmb3JlID0gQXNzZXQudG9Dcm9wUmVnaW9uKHBhcmFtcy5jcm9wQmVmb3JlIHx8IChwYXJhbXMuY3JvcCA/IG1ldGEuY3JvcEJlZm9yZSA6IG51bGwpKTtcclxuICAgICAgICAgICAgY29uc3QgY3JvcEFmdGVyID0gQXNzZXQudG9Dcm9wUmVnaW9uKHBhcmFtcy5jcm9wQWZ0ZXIgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQWZ0ZXIgOiBudWxsKSk7XHJcbiAgICAgICAgICAgIC8vIEdldCBtZXRhZGF0YVxyXG4gICAgICAgICAgICBjb25zdCBpbWdNZXRhID0gYXdhaXQgc2hhcnAoYnVmZmVyKS5tZXRhZGF0YSgpO1xyXG4gICAgICAgICAgICBsZXQgd2lkdGggPSBpbWdNZXRhLndpZHRoO1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaW1nTWV0YS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIC8vIENyb3AgYmVmb3JlIHJlc2l6ZVxyXG4gICAgICAgICAgICBpZiAoY3JvcEJlZm9yZSkge1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leHRyYWN0KGNyb3BCZWZvcmUpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRvQnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGNyb3BCZWZvcmUud2lkdGg7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBjcm9wQmVmb3JlLmhlaWdodDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjcm9wKSB7XHJcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBhd2FpdCBzaGFycChidWZmZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgLmV4dHJhY3QoY3JvcClcclxuICAgICAgICAgICAgICAgICAgICAudG9CdWZmZXIoKTtcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gY3JvcC53aWR0aDtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGNyb3AuaGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJlc2l6ZSBjYW52YXNcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5jYW52YXNTY2FsZVggIT09IDEgfHwgcGFyYW1zLmNhbnZhc1NjYWxlWSAhPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcGFyYW1zLmNhbnZhc1NjYWxlWCk7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5jYW52YXNTY2FsZVkpO1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXNpemUoe3dpZHRoLCBoZWlnaHQsIGJhY2tncm91bmQ6IFwiIzAwMDAwMDAwXCIsIGZpdDogXCJjb250YWluXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIC50b0J1ZmZlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJlc2l6ZSBpbWFnZVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLnNjYWxlWCAhPT0gMSB8fCBwYXJhbXMuc2NhbGVZICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBwYXJhbXMuc2NhbGVYKTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogcGFyYW1zLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBhd2FpdCBzaGFycChidWZmZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlc2l6ZSh7d2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZDogXCIjMDAwMDAwMDBcIiwgZml0OiBcImZpbGxcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnRvQnVmZmVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ3JvcCBhZnRlciByZXNpemVcclxuICAgICAgICAgICAgaWYgKGNyb3BBZnRlcikge1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKVxyXG4gICAgICAgICAgICAgICAgICAgIC5leHRyYWN0KGNyb3BBZnRlcilcclxuICAgICAgICAgICAgICAgICAgICAudG9CdWZmZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBSb3RhdGVcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5yb3RhdGlvbiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKS5yb3RhdGUocGFyYW1zLnJvdGF0aW9uKS50b0J1ZmZlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBidWZmZXJUb1N0cmVhbShidWZmZXIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBc3NldCBpbWFnZSBjb252ZXJzaW9uIGVycm9yXCIsIGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyVG9TdHJlYW0oYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpbGVuYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5maWxlbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGVudFR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbnRlbnRUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtZXRhZGF0YSgpOiBJQXNzZXRNZXRhIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1ldGFkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzdHJlYW0oKTogUmVhZGFibGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ1Y2tldC5vcGVuRG93bmxvYWRTdHJlYW0odGhpcy5tSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBPYmplY3RJZCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IFBhcnRpYWw8SUFzc2V0PixcclxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYnVja2V0OiBHcmlkRlNCdWNrZXQpIHtcclxuICAgICAgICBzdXBlcihpZCwgZGF0YSwgY29sbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5saW5rKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZyb21CdWNrZXQodGhpcy5idWNrZXQsIHRoaXMubUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCdWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICByZXR1cm4gc3RyZWFtVG9CdWZmZXIodGhpcy5zdHJlYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkKG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXRhZGF0YSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIG1ldGFkYXRhLmRvd25sb2FkQ291bnQgPSBpc05hTihtZXRhZGF0YS5kb3dubG9hZENvdW50KSB8fCAhbWV0YWRhdGEuZmlyc3REb3dubG9hZFxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiBtZXRhZGF0YS5kb3dubG9hZENvdW50ICsgMTtcclxuICAgICAgICBtZXRhZGF0YS5maXJzdERvd25sb2FkID0gbWV0YWRhdGEuZmlyc3REb3dubG9hZCB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIG1ldGFkYXRhLmxhc3REb3dubG9hZCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm1JZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEltYWdlKHBhcmFtczogSUFzc2V0SW1hZ2VQYXJhbXMgPSBudWxsKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiBBc3NldC50b0ltYWdlKHRoaXMuc3RyZWFtLCB0aGlzLm1ldGFkYXRhLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gQXNzZXQudG9JbWFnZShhd2FpdCB0aGlzLmRvd25sb2FkKG1ldGFkYXRhKSwgdGhpcy5tZXRhZGF0YSwgcGFyYW1zKTtcclxuICAgIH1cclxufVxyXG4iXX0=
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxNQUFnQixNQUFNLE9BQU8sQ0FBQztBQU1yQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFNLGFBQWEsR0FBRztJQUNsQixDQUFDLEVBQUUsUUFBUTtJQUNYLENBQUMsRUFBRSxRQUFRO0lBQ1gsQ0FBQyxFQUFFLFFBQVE7SUFDWCxDQUFDLEVBQUUsUUFBUTtDQUNkLENBQUM7QUFFRixNQUFNLE9BQU8sS0FBTSxTQUFRLFVBQWtCO0lBd0d6QyxZQUFZLEVBQVksRUFDWixJQUFxQixFQUNyQixVQUFzQixFQUNaLE1BQW9CO1FBQ3RDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRFYsV0FBTSxHQUFOLE1BQU0sQ0FBYztJQUUxQyxDQUFDO0lBM0dELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBaUM7UUFDakQsSUFBSSxJQUFJLEdBQUcsUUFBMEIsQ0FBQztRQUN0QyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQixJQUFJO2dCQUNBLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQWtCLENBQUMsQ0FBQzthQUN6QztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FB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QztZQUNyRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRUssUUFBUSxDQUFDLFNBQTRCLElBQUk7O1lBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsQ0FBQztLQUFBO0lBRUssYUFBYSxDQUFDLE1BQTBCLEVBQUUsUUFBcUI7O1lBQ2pFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxDQUFDO0tBQUE7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaGFycF8sIHtSZWdpb259IGZyb20gXCJzaGFycFwiO1xyXG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XHJcbmltcG9ydCB7Q29sbGVjdGlvbiwgR3JpZEZTQnVja2V0fSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldENyb3BJbmZvLCBJQXNzZXRJbWFnZVBhcmFtcywgSUFzc2V0TWV0YX0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2J1ZmZlclRvU3RyZWFtLCBkZWxldGVGcm9tQnVja2V0LCBpc0Jvb2xlYW4sIGlzSW50ZXJmYWNlLCBpc1N0cmluZywgc3RyZWFtVG9CdWZmZXJ9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5jb25zdCBzaGFycCA9IHNoYXJwXztcclxuY29uc3QgY3JvcEludGVyZmFjZSA9IHtcclxuICAgIHg6IFwibnVtYmVyXCIsXHJcbiAgICB5OiBcIm51bWJlclwiLFxyXG4gICAgdzogXCJudW1iZXJcIixcclxuICAgIGg6IFwibnVtYmVyXCJcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldCBleHRlbmRzIEJhc2VFbnRpdHk8SUFzc2V0PiBpbXBsZW1lbnRzIElBc3NldCB7XHJcblxyXG4gICAgc3RhdGljIHRvQ3JvcFJlZ2lvbihjcm9wSW5mbzogc3RyaW5nIHwgSUFzc2V0Q3JvcEluZm8pOiBSZWdpb24ge1xyXG4gICAgICAgIGxldCBjcm9wID0gY3JvcEluZm8gYXMgSUFzc2V0Q3JvcEluZm87XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNyb3BJbmZvKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY3JvcCA9IEpTT04ucGFyc2UoY3JvcEluZm8gYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc0ludGVyZmFjZShjcm9wLCBjcm9wSW50ZXJmYWNlKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQoY3JvcC53KSxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKGNyb3AuaCksXHJcbiAgICAgICAgICAgIHRvcDogTWF0aC5yb3VuZChjcm9wLnkpLFxyXG4gICAgICAgICAgICBsZWZ0OiBNYXRoLnJvdW5kKGNyb3AueClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhc3luYyB0b0ltYWdlKHN0cmVhbTogUmVhZGFibGUsIG1ldGE/OiBJQXNzZXRNZXRhLCBwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcyk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XHJcblxyXG4gICAgICAgIC8vIEdldCBkZWZhdWx0IGNyb3AgaW5mb1xyXG4gICAgICAgIGNvbnN0IGNyb3AgPSBBc3NldC50b0Nyb3BSZWdpb24obWV0YS5jcm9wKTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBzdHJlYW0gaWYgdGhlcmUgaXMgbm8gcGFyYW1zIGFuZCBubyBkZWZhdWx0IGNyb3AgZXhpc3RzXHJcbiAgICAgICAgaWYgKG1ldGE/LmV4dGVuc2lvbiA9PT0gXCJzdmdcIiB8fCAoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT0gMCAmJiAhY3JvcCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBhcnNlIHBhcmFtc1xyXG4gICAgICAgIHBhcmFtcy5yb3RhdGlvbiA9IGlzTmFOKHBhcmFtcy5yb3RhdGlvbikgPyAwIDogTWF0aC5yb3VuZChwYXJhbXMucm90YXRpb24gLyA5MCkgKiA5MDtcclxuICAgICAgICBwYXJhbXMuY2FudmFzU2NhbGVYID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWCkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVgpO1xyXG4gICAgICAgIHBhcmFtcy5jYW52YXNTY2FsZVkgPSBpc05hTihwYXJhbXMuY2FudmFzU2NhbGVZKSA/IDEgOiBOdW1iZXIocGFyYW1zLmNhbnZhc1NjYWxlWSk7XHJcbiAgICAgICAgcGFyYW1zLnNjYWxlWCA9IGlzTmFOKHBhcmFtcy5zY2FsZVgpID8gMSA6IE51bWJlcihwYXJhbXMuc2NhbGVYKTtcclxuICAgICAgICBwYXJhbXMuc2NhbGVZID0gaXNOYU4ocGFyYW1zLnNjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5zY2FsZVkpO1xyXG4gICAgICAgIHBhcmFtcy5jcm9wID0gaXNCb29sZWFuKHBhcmFtcy5jcm9wKSA/IHBhcmFtcy5jcm9wIDogcGFyYW1zLmNyb3AgPT0gXCJ0cnVlXCI7XHJcblxyXG4gICAgICAgIC8vIFRyeSB0byBtb2RpZnkgaW1hZ2VcclxuICAgICAgICBsZXQgYnVmZmVyID0gYXdhaXQgc3RyZWFtVG9CdWZmZXIoc3RyZWFtKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBHZXQgY3JvcCBpbmZvXHJcbiAgICAgICAgICAgIGNvbnN0IGNyb3BCZWZvcmUgPSBBc3NldC50b0Nyb3BSZWdpb24ocGFyYW1zLmNyb3BCZWZvcmUgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQmVmb3JlIDogbnVsbCkpO1xyXG4gICAgICAgICAgICBjb25zdCBjcm9wQWZ0ZXIgPSBBc3NldC50b0Nyb3BSZWdpb24ocGFyYW1zLmNyb3BBZnRlciB8fCAocGFyYW1zLmNyb3AgPyBtZXRhLmNyb3BBZnRlciA6IG51bGwpKTtcclxuICAgICAgICAgICAgLy8gR2V0IG1ldGFkYXRhXHJcbiAgICAgICAgICAgIGxldCBpbWcgPSBzaGFycChidWZmZXIpO1xyXG4gICAgICAgICAgICBsZXQge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgaW1nLm1ldGFkYXRhKCk7XHJcbiAgICAgICAgICAgIC8vIENyb3AgYmVmb3JlIHJlc2l6ZVxyXG4gICAgICAgICAgICBpZiAoY3JvcEJlZm9yZSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBjcm9wQmVmb3JlLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3JvcEJlZm9yZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wQmVmb3JlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjcm9wKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGNyb3Aud2lkdGg7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBjcm9wLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGltZyA9IGltZy5leHRyYWN0KGNyb3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJlc2l6ZSBjYW52YXNcclxuICAgICAgICAgICAgY29uc3QgY2FudmFzU2NhbGVYID0gbWV0YT8uY2FudmFzU2NhbGVYIHx8IDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1NjYWxlWSA9IG1ldGE/LmNhbnZhc1NjYWxlWSB8fCAxO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmNhbnZhc1NjYWxlWCAhPT0gY2FudmFzU2NhbGVYIHx8IHBhcmFtcy5jYW52YXNTY2FsZVkgIT09IGNhbnZhc1NjYWxlWSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcGFyYW1zLmNhbnZhc1NjYWxlWCk7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5jYW52YXNTY2FsZVkpO1xyXG4gICAgICAgICAgICAgICAgaW1nID0gaW1nLnJlc2l6ZSh7d2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZDogXCIjMDAwMDAwMDBcIiwgZml0OiBcImNvbnRhaW5cIn0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFJlc2l6ZSBpbWFnZVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLnNjYWxlWCAhPT0gMSB8fCBwYXJhbXMuc2NhbGVZICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBwYXJhbXMuc2NhbGVYKTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogcGFyYW1zLnNjYWxlWSk7XHJcbiAgICAgICAgICAgICAgICBpbWcgPSBpbWcucmVzaXplKHt3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kOiBcIiMwMDAwMDAwMFwiLCBmaXQ6IFwiZmlsbFwifSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ3JvcCBhZnRlciByZXNpemVcclxuICAgICAgICAgICAgaWYgKGNyb3BBZnRlcikge1xyXG4gICAgICAgICAgICAgICAgaW1nID0gaW1nLmV4dHJhY3QoY3JvcEFmdGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBSb3RhdGVcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5yb3RhdGlvbiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgaW1nLnRvQnVmZmVyKCk7XHJcbiAgICAgICAgICAgICAgICBpbWcgPSBzaGFycChidWZmZXIpLnJvdGF0ZShwYXJhbXMucm90YXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBidWZmZXJUb1N0cmVhbShhd2FpdCBpbWcudG9CdWZmZXIoKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFzc2V0IGltYWdlIGNvbnZlcnNpb24gZXJyb3JcIiwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBidWZmZXJUb1N0cmVhbShidWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZmlsZW5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmZpbGVuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29udGVudFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1ldGFkYXRhKCk6IElBc3NldE1ldGEge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWV0YWRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHN0cmVhbSgpOiBSZWFkYWJsZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVja2V0Lm9wZW5Eb3dubG9hZFN0cmVhbSh0aGlzLm1JZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IE9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogUGFydGlhbDxJQXNzZXQ+LFxyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBidWNrZXQ6IEdyaWRGU0J1Y2tldCkge1xyXG4gICAgICAgIHN1cGVyKGlkLCBkYXRhLCBjb2xsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1bmxpbmsoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gZGVsZXRlRnJvbUJ1Y2tldCh0aGlzLmJ1Y2tldCwgdGhpcy5tSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gICAgICAgIHJldHVybiBzdHJlYW1Ub0J1ZmZlcih0aGlzLnN0cmVhbSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZG93bmxvYWQobWV0YWRhdGE/OiBJQXNzZXRNZXRhKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIG1ldGFkYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLm1ldGFkYXRhLCBtZXRhZGF0YSB8fCB7fSk7XHJcbiAgICAgICAgbWV0YWRhdGEuZG93bmxvYWRDb3VudCA9IGlzTmFOKG1ldGFkYXRhLmRvd25sb2FkQ291bnQpIHx8ICFtZXRhZGF0YS5maXJzdERvd25sb2FkXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IG1ldGFkYXRhLmRvd25sb2FkQ291bnQgKyAxO1xyXG4gICAgICAgIG1ldGFkYXRhLmZpcnN0RG93bmxvYWQgPSBtZXRhZGF0YS5maXJzdERvd25sb2FkIHx8IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgbWV0YWRhdGEubGFzdERvd25sb2FkID0gbmV3IERhdGUoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlT25lKHtfaWQ6IHRoaXMubUlkfSwgeyRzZXQ6IHttZXRhZGF0YX19KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0SW1hZ2UocGFyYW1zOiBJQXNzZXRJbWFnZVBhcmFtcyA9IG51bGwpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIEFzc2V0LnRvSW1hZ2UodGhpcy5zdHJlYW0sIHRoaXMubWV0YWRhdGEsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZG93bmxvYWRJbWFnZShwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcywgbWV0YWRhdGE/OiBJQXNzZXRNZXRhKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiBBc3NldC50b0ltYWdlKGF3YWl0IHRoaXMuZG93bmxvYWQobWV0YWRhdGEpLCB0aGlzLm1ldGFkYXRhLCBwYXJhbXMpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,65 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { ObjectId } from "bson";
11
+ import { bufferToStream } from "../../utils";
12
+ import { Asset } from "./asset";
13
+ export class TempAsset {
14
+ constructor(buffer, filename, contentType, metadata) {
15
+ this.buffer = buffer;
16
+ this.filename = filename;
17
+ this.contentType = contentType;
18
+ this.metadata = metadata;
19
+ this.id = new ObjectId().toHexString();
20
+ }
21
+ get stream() {
22
+ return bufferToStream(this.buffer);
23
+ }
24
+ unlink() {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ throw new Error(`Temp asset '${this.id}' can not be removed!`);
27
+ });
28
+ }
29
+ getBuffer() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return this.buffer;
32
+ });
33
+ }
34
+ download(metadata) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ return this.stream;
37
+ });
38
+ }
39
+ downloadImage(params, metadata) {
40
+ Object.assign(this.metadata, metadata || {});
41
+ return Asset.toImage(this.stream, this.metadata, params);
42
+ }
43
+ getImage(params) {
44
+ return this.downloadImage(params);
45
+ }
46
+ save() {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ return this;
49
+ });
50
+ }
51
+ load() {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ return this;
54
+ });
55
+ }
56
+ toJSON() {
57
+ return {
58
+ id: this.id,
59
+ filename: this.filename,
60
+ contentType: this.contentType,
61
+ metadata: this.metadata
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGllcy90ZW1wLWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHOUIsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sT0FBTyxTQUFTO0lBUWxCLFlBQXNCLE1BQWMsRUFBVyxRQUFnQixFQUFXLFdBQW1CLEVBQVcsUUFBb0I7UUFBdEcsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFXLGFBQVEsR0FBUixRQUFRLENBQVE7UUFBVyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUFXLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDeEgsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFORCxJQUFJLE1BQU07UUFDTixPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQU1LLE1BQU07O1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDbkUsQ0FBQztLQUFBO0lBRUssU0FBUzs7WUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRUssUUFBUSxDQUFDLFFBQXFCOztZQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBRUQsYUFBYSxDQUFDLE1BQTBCLEVBQUUsUUFBcUI7UUFDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxRQUFRLENBQUMsTUFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFSyxJQUFJOztZQUNOLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7S0FBQTtJQUVLLElBQUk7O1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRUQsTUFBTTtRQUNGLE9BQU87WUFDSCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMxQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWFkYWJsZX0gZnJvbSBcInN0cmVhbVwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQgQnVmZmVyIGZyb20gXCJidWZmZXJcIjtcclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldEltYWdlUGFyYW1zLCBJQXNzZXRNZXRhfSBmcm9tIFwiLi4vLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7YnVmZmVyVG9TdHJlYW19IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Fzc2V0fSBmcm9tIFwiLi9hc3NldFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRlbXBBc3NldCBpbXBsZW1lbnRzIElBc3NldCB7XHJcblxyXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gYnVmZmVyVG9TdHJlYW0odGhpcy5idWZmZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBidWZmZXI6IEJ1ZmZlciwgcmVhZG9ubHkgZmlsZW5hbWU6IHN0cmluZywgcmVhZG9ubHkgY29udGVudFR5cGU6IHN0cmluZywgcmVhZG9ubHkgbWV0YWRhdGE6IElBc3NldE1ldGEpIHtcclxuICAgICAgICB0aGlzLmlkID0gbmV3IE9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1bmxpbmsoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbXAgYXNzZXQgJyR7dGhpcy5pZH0nIGNhbiBub3QgYmUgcmVtb3ZlZCFgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRCdWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZG93bmxvYWQobWV0YWRhdGE/OiBJQXNzZXRNZXRhKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcclxuICAgIH1cclxuXHJcbiAgICBkb3dubG9hZEltYWdlKHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zLCBtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm1ldGFkYXRhLCBtZXRhZGF0YSB8fCB7fSk7XHJcbiAgICAgICAgcmV0dXJuIEFzc2V0LnRvSW1hZ2UodGhpcy5zdHJlYW0sIHRoaXMubWV0YWRhdGEsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRJbWFnZShwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkKCk6IFByb21pc2U8dGhpcz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRvSlNPTigpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudFR5cGUsXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -20,21 +20,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
20
  });
21
21
  };
22
22
  import { inject, injectable, injectAll, Lifecycle, scoped } from "tsyringe";
23
- import { Queue, Scheduler, Worker } from "node-resque";
24
23
  import { schedule, validate } from "node-cron";
25
- import ioredis from "ioredis";
24
+ import { socket } from "zeromq";
25
+ import { ObjectId } from "bson";
26
26
  import { DI_CONTAINER, JOB } from "../common-types";
27
- import { getConstructorName, isArray, isObject } from "../utils";
27
+ import { getConstructorName, isArray, isObject, jsonHighlight, promiseTimeout } from "../utils";
28
28
  import { Configuration } from "./configuration";
29
- const IORedis = ioredis;
30
29
  let JobManager = class JobManager {
31
30
  constructor(config, container, jobTypes) {
32
31
  this.config = config;
33
32
  this.container = container;
34
33
  this.jobTypes = jobTypes || [];
35
34
  this.jobs = this.jobTypes.reduce((res, jobType) => {
36
- res[getConstructorName(jobType)] = {
37
- perform: this.toPerformFunction(jobType)
35
+ res[getConstructorName(jobType)] = (jobParams) => {
36
+ const job = this.resolveJobInstance(jobType, jobParams);
37
+ return job.process();
38
38
  };
39
39
  return res;
40
40
  }, {});
@@ -52,31 +52,25 @@ let JobManager = class JobManager {
52
52
  return instance.process();
53
53
  });
54
54
  }
55
- enqueueWithName(name, params = {}, que = "main") {
55
+ enqueueWithName(name, params = {}) {
56
56
  return __awaiter(this, void 0, void 0, function* () {
57
57
  const jobName = yield this.tryResolveFromName(name, params);
58
- yield this.queue.enqueue(que, jobName, [params]);
58
+ return this.sendToWorkers(jobName, params);
59
59
  });
60
60
  }
61
- enqueue(jobType, params = {}, que = "main") {
61
+ enqueue(jobType, params = {}) {
62
62
  return __awaiter(this, void 0, void 0, function* () {
63
63
  const jobName = yield this.tryResolveAndConnect(jobType, params);
64
- yield this.queue.enqueue(que, jobName, [params]);
64
+ return this.sendToWorkers(jobName, params);
65
65
  });
66
66
  }
67
- enqueueAt(timestamp, jobType, params = {}, que = "main") {
67
+ sendToWorkers(jobName, params) {
68
68
  return __awaiter(this, void 0, void 0, function* () {
69
- const jobName = yield this.tryResolveAndConnect(jobType, params);
70
- yield this.queue.enqueueAt(timestamp, que, jobName, [params]);
71
- });
72
- }
73
- enqueueIn(time, jobType, params = {}, que = "main") {
74
- return __awaiter(this, void 0, void 0, function* () {
75
- const jobName = yield this.tryResolveAndConnect(jobType, params);
76
- yield this.queue.enqueueIn(time, que, jobName, [params]);
69
+ const publisher = yield this.scheduler;
70
+ yield publisher.send([jobName, JSON.stringify(params), new ObjectId().toHexString()]);
77
71
  });
78
72
  }
79
- schedule(minute, hour, dayOfMonth, month, dayOfWeek, jobType, params = {}, que = "main") {
73
+ schedule(minute, hour, dayOfMonth, month, dayOfWeek, jobType, params = {}) {
80
74
  const expression = [minute, hour, dayOfMonth, month, dayOfWeek].map(t => {
81
75
  if (isObject(t)) {
82
76
  const range = t;
@@ -93,19 +87,38 @@ let JobManager = class JobManager {
93
87
  return null;
94
88
  }
95
89
  return schedule(expression, () => {
96
- this.enqueue(jobType, params, que).catch(e => {
90
+ this.enqueue(jobType, params).catch(e => {
97
91
  console.log(`Can't enqueue job: '${jobName}' because: ${e}`);
98
92
  });
99
93
  });
100
94
  }
101
95
  startProcessing() {
102
- return __awaiter(this, void 0, void 0, function* () {
103
- this.initialize();
104
- yield this.worker.connect();
105
- yield this.worker.start();
106
- yield this.scheduler.connect();
107
- yield this.scheduler.start();
108
- });
96
+ const host = this.config.resolve("zmqRemoteHost");
97
+ this.worker = socket("pull");
98
+ this.worker.connect(host);
99
+ this.worker.on("message", (name, args, uniqueId) => __awaiter(this, void 0, void 0, function* () {
100
+ try {
101
+ const jobName = name.toString("utf8");
102
+ const jobParams = JSON.parse(args.toString("utf8"));
103
+ const timerId = uniqueId === null || uniqueId === void 0 ? void 0 : uniqueId.toString("utf8");
104
+ const jobNameLog = `\x1b[36m"${jobName}"\x1b[0m`;
105
+ const jobArgsLog = `\n${jsonHighlight(jobParams)}\n`;
106
+ console.time(timerId);
107
+ console.timeLog(timerId, `Started working on background job: ${jobNameLog} with args: ${jobArgsLog}`);
108
+ try {
109
+ yield Promise.race([this.jobs[jobName](jobParams), promiseTimeout(15000, true)]);
110
+ console.timeLog(timerId, `Finished working on background job: ${jobNameLog} with args: ${jobArgsLog}`);
111
+ }
112
+ catch (e) {
113
+ console.timeLog(timerId, `Background job failed: ${jobNameLog} with args: ${jobArgsLog}${e.message}\n\n`);
114
+ }
115
+ console.timeEnd(timerId);
116
+ }
117
+ catch (e) {
118
+ console.log(`Failed to start job: ${e.message}`);
119
+ }
120
+ }));
121
+ console.log(`Waiting for jobs at: ${host}`);
109
122
  }
110
123
  tryResolve(jobType, params) {
111
124
  const jobName = getConstructorName(jobType);
@@ -120,47 +133,6 @@ let JobManager = class JobManager {
120
133
  }
121
134
  return jobName;
122
135
  }
123
- initialize() {
124
- if (this.queue)
125
- return;
126
- const config = this.config;
127
- const options = { password: config.resolve("redisPassword") };
128
- const sentinels = config.resolve("redisSentinels");
129
- const redis = !sentinels
130
- ? null
131
- : new IORedis({
132
- sentinels,
133
- name: config.resolve("redisCluster"),
134
- });
135
- const connection = {
136
- pkg: "ioredis",
137
- host: config.resolve("redisHost"),
138
- password: options.password,
139
- port: config.resolve("redisPort"),
140
- namespace: config.resolve("redisNamespace"),
141
- redis,
142
- options
143
- };
144
- const queues = config.resolve("workQueues");
145
- this.queue = new Queue({ connection }, this.jobs);
146
- this.worker = new Worker({ connection, queues }, this.jobs);
147
- this.worker.on("job", (queue, job) => {
148
- console.log(`working job ${queue} ${JSON.stringify(job)}`);
149
- });
150
- this.worker.on("reEnqueue", (queue, job, plugin) => {
151
- console.log(`reEnqueue job (${plugin}) ${queue} ${JSON.stringify(job)}`);
152
- });
153
- this.worker.on("success", (queue, job, result, duration) => {
154
- console.log(`job success ${queue} ${JSON.stringify(job)} >> ${result} (${duration}ms)`);
155
- });
156
- this.worker.on("failure", (queue, job, failure, duration) => {
157
- console.log(`job failure ${queue} ${JSON.stringify(job)} >> ${failure} (${duration}ms)`);
158
- });
159
- this.worker.on("error", (error, queue, job) => {
160
- console.log(`error ${queue} ${JSON.stringify(job)} >> ${error}`);
161
- });
162
- this.scheduler = new Scheduler({ connection }, this.jobs);
163
- }
164
136
  tryResolveFromName(jobName, params) {
165
137
  const jobType = this.jobTypes.find(type => {
166
138
  return getConstructorName(type) == jobName;
@@ -172,10 +144,14 @@ let JobManager = class JobManager {
172
144
  }
173
145
  tryResolveAndConnect(jobType, params) {
174
146
  return __awaiter(this, void 0, void 0, function* () {
175
- this.initialize();
176
- const jobName = this.tryResolve(jobType, params);
177
- yield this.queue.connect();
178
- return jobName;
147
+ this.scheduler = this.scheduler || new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
148
+ const port = this.config.resolve("zmqPort");
149
+ const publisher = socket("push");
150
+ yield publisher.bind(`tcp://0.0.0.0:${port}`);
151
+ console.log(`Publisher bound to port: ${port}`);
152
+ resolve(publisher);
153
+ }));
154
+ return this.tryResolve(jobType, params);
179
155
  });
180
156
  }
181
157
  resolveJobInstance(jobType, params) {
@@ -186,12 +162,6 @@ let JobManager = class JobManager {
186
162
  container.register(jobType, jobType);
187
163
  return container.resolve(jobType);
188
164
  }
189
- toPerformFunction(jobType) {
190
- return (jobParams) => {
191
- const job = this.resolveJobInstance(jobType, jobParams);
192
- return job.process();
193
- };
194
- }
195
165
  };
196
166
  JobManager = __decorate([
197
167
  injectable(),
@@ -200,4 +170,4 @@ JobManager = __decorate([
200
170
  __metadata("design:paramtypes", [Configuration, Object, Array])
201
171
  ], JobManager);
202
172
  export { JobManager };
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFzQixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9GLE9BQU8sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBa0IsR0FBRyxFQUFxRCxNQUFNLGlCQUFpQixDQUFDO0FBQ3RILE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFJWCxVQUFVLFNBQVYsVUFBVTtJQVFuQixZQUFxQixNQUFxQixFQUFpQyxTQUE4QixFQUFrQixRQUFzQjtRQUE1SCxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQWlDLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBQ3JHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzlDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHO2dCQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9B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RUFBRSxDQUFDO1lBQzNCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVTLGtCQUFrQixDQUFDLE9BQW1CLEVBQUUsTUFBaUI7UUFDL0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDN0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRVMsaUJBQWlCLENBQUMsT0FBbUI7UUFDM0MsT0FBTyxDQUFDLFNBQW9CLEVBQUUsRUFBRTtZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQTtJQUNMLENBQUM7Q0FDSixDQUFBO0FBN0tZLFVBQVU7SUFGdEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFTZSxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQSxFQUEyQyxXQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQ0FBN0YsYUFBYTtHQVJqQyxVQUFVLENBNkt0QjtTQTdLWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUsIGluamVjdEFsbCwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge1F1ZXVlLCBTY2hlZHVsZXIsIFdvcmtlcn0gZnJvbSBcIm5vZGUtcmVzcXVlXCI7XHJcbmltcG9ydCB7c2NoZWR1bGUsIHZhbGlkYXRlfSBmcm9tIFwibm9kZS1jcm9uXCI7XHJcbmltcG9ydCBpb3JlZGlzIGZyb20gXCJpb3JlZGlzXCI7XHJcbmltcG9ydCB7RElfQ09OVEFJTkVSLCBJSm9iLCBJSm9iVGFzaywgSk9CLCBKb2JQYXJhbXMsIEpvYlNjaGVkdWxlUmFuZ2UsIEpvYlNjaGVkdWxlVGltZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2dldENvbnN0cnVjdG9yTmFtZSwgaXNBcnJheSwgaXNPYmplY3R9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcclxuXHJcbmNvbnN0IElPUmVkaXMgPSBpb3JlZGlzO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBKb2JNYW5hZ2VyIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgam9iczogYW55O1xyXG4gICAgcHJvdGVjdGVkIHF1ZXVlOiBRdWV1ZTtcclxuICAgIHByb3RlY3RlZCB3b3JrZXI6IFdvcmtlcjtcclxuICAgIHByb3RlY3RlZCBzY2hlZHVsZXI6IFNjaGVkdWxlcjtcclxuICAgIHByb3RlY3RlZCBqb2JUeXBlczogVHlwZTxJSm9iPltdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgQGluamVjdChESV9DT05UQUlORVIpIHJlYWRvbmx5IGNvbnRhaW5lcjogRGVwZW5kZW5jeUNvbnRhaW5lciwgQGluamVjdEFsbChKT0IpIGpvYlR5cGVzOiBUeXBlPElKb2I+W10pIHtcclxuICAgICAgICB0aGlzLmpvYlR5cGVzID0gam9iVHlwZXMgfHwgW107XHJcbiAgICAgICAgdGhpcy5qb2JzID0gdGhpcy5qb2JUeXBlcy5yZWR1Y2UoKHJlcywgam9iVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICByZXNbZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpXSA9IHtcclxuICAgICAgICAgICAgICAgIHBlcmZvcm06IHRoaXMudG9QZXJmb3JtRnVuY3Rpb24oam9iVHlwZSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzcyhqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBsZXQgaW5zdGFuY2U6IElKb2IgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCByZXNvbHZlIHBhcmFtcyBmb3Igam9iOiAke2pvYk5hbWV9LCB3aXRoIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfS4gUmVhc29uOiAke2V9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb2Nlc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlV2l0aE5hbWUobmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlRnJvbU5hbWUobmFtZSwgcGFyYW1zKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmVucXVldWUocXVlLCBqb2JOYW1lLCBbcGFyYW1zXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5xdWV1ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZW5xdWV1ZShxdWUsIGpvYk5hbWUsIFtwYXJhbXNdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlQXQodGltZXN0YW1wOiBudW1iZXIsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30sIHF1ZTogc3RyaW5nID0gXCJtYWluXCIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBhd2FpdCB0aGlzLnRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5lbnF1ZXVlQXQodGltZXN0YW1wLCBxdWUsIGpvYk5hbWUsIFtwYXJhbXNdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlSW4odGltZTogbnVtYmVyLCBqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBxdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gYXdhaXQgdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZW5xdWV1ZUluKHRpbWUsIHF1ZSwgam9iTmFtZSwgW3BhcmFtc10pO1xyXG4gICAgfVxyXG5cclxuICAgIHNjaGVkdWxlKG1pbnV0ZTogSm9iU2NoZWR1bGVUaW1lLCBob3VyOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mTW9udGg6IEpvYlNjaGVkdWxlVGltZSwgbW9udGg6IEpvYlNjaGVkdWxlVGltZSwgZGF5T2ZXZWVrOiBKb2JTY2hlZHVsZVRpbWUsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30sIHF1ZTogc3RyaW5nID0gXCJtYWluXCIpOiBJSm9iVGFzayB7XHJcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFttaW51dGUsIGhvdXIsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdLm1hcCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHQgYXMgSm9iU2NoZWR1bGVSYW5nZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtyYW5nZS5taW4gfHwgMH0tJHtyYW5nZS5tYXggfHwgMH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5qb2luKFwiLFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7dH1gO1xyXG4gICAgICAgIH0pLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgaWYgKCF2YWxpZGF0ZShleHByZXNzaW9uKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2FuJ3Qgc2NoZWR1bGUgdGhlIHRhc2s6ICcke2pvYk5hbWV9JyBiZWNhdXNlIHRpbWUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlKGV4cHJlc3Npb24sICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbnF1ZXVlKGpvYlR5cGUsIHBhcmFtcywgcXVlKS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDYW4ndCBlbnF1ZXVlIGpvYjogJyR7am9iTmFtZX0nIGJlY2F1c2U6ICR7ZX1gKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRQcm9jZXNzaW5nKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZXIuY29ubmVjdCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMud29ya2VyLnN0YXJ0KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zY2hlZHVsZXIuY29ubmVjdCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2NoZWR1bGVyLnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5UmVzb2x2ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZShqb2JUeXBlKTtcclxuICAgICAgICBpZiAoIXRoaXMuam9ic1tqb2JOYW1lXSkge1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgZmluZCBqb2Igd2l0aCBuYW1lOiAke2pvYk5hbWV9IHNvIGl0IGNhbid0IGJlIGVucXVldWVkIWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqb2JOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtwYXNzd29yZDogY29uZmlnLnJlc29sdmUoXCJyZWRpc1Bhc3N3b3JkXCIpfTtcclxuICAgICAgICBjb25zdCBzZW50aW5lbHM6IEFycmF5PHtob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcn0+ID0gY29uZmlnLnJlc29sdmUoXCJyZWRpc1NlbnRpbmVsc1wiKTtcclxuICAgICAgICBjb25zdCByZWRpcyA9ICFzZW50aW5lbHNcclxuICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgIDogbmV3IElPUmVkaXMoe1xyXG4gICAgICAgICAgICAgICAgc2VudGluZWxzLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogY29uZmlnLnJlc29sdmUoXCJyZWRpc0NsdXN0ZXJcIiksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XHJcbiAgICAgICAgICAgIHBrZzogXCJpb3JlZGlzXCIsXHJcbiAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5yZXNvbHZlKFwicmVkaXNIb3N0XCIpLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcclxuICAgICAgICAgICAgcG9ydDogY29uZmlnLnJlc29sdmUoXCJyZWRpc1BvcnRcIiksXHJcbiAgICAgICAgICAgIG5hbWVzcGFjZTogY29uZmlnLnJlc29sdmUoXCJyZWRpc05hbWVzcGFjZVwiKSxcclxuICAgICAgICAgICAgcmVkaXMsXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHF1ZXVlcyA9IGNvbmZpZy5yZXNvbHZlKFwid29ya1F1ZXVlc1wiKTtcclxuICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IFF1ZXVlKHtjb25uZWN0aW9ufSwgdGhpcy5qb2JzKTtcclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIoe2Nvbm5lY3Rpb24sIHF1ZXVlc30sIHRoaXMuam9icyk7XHJcbiAgICAgICAgdGhpcy53b3JrZXIub24oXCJqb2JcIiwgKHF1ZXVlLCBqb2IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYHdvcmtpbmcgam9iICR7cXVldWV9ICR7SlNPTi5zdHJpbmdpZnkoam9iKX1gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLndvcmtlci5vbihcInJlRW5xdWV1ZVwiLCAocXVldWUsIGpvYiwgcGx1Z2luKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGByZUVucXVldWUgam9iICgke3BsdWdpbn0pICR7cXVldWV9ICR7SlNPTi5zdHJpbmdpZnkoam9iKX1gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLndvcmtlci5vbihcInN1Y2Nlc3NcIiwgKHF1ZXVlLCBqb2IsIHJlc3VsdCwgZHVyYXRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBgam9iIHN1Y2Nlc3MgJHtxdWV1ZX0gJHtKU09OLnN0cmluZ2lmeShqb2IpfSA+PiAke3Jlc3VsdH0gKCR7ZHVyYXRpb259bXMpYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwiZmFpbHVyZVwiLCAocXVldWUsIGpvYiwgZmFpbHVyZSwgZHVyYXRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBgam9iIGZhaWx1cmUgJHtxdWV1ZX0gJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgICAgICAgICBqb2JcclxuICAgICAgICAgICAgICAgICl9ID4+ICR7ZmFpbHVyZX0gKCR7ZHVyYXRpb259bXMpYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwiZXJyb3JcIiwgKGVycm9yLCBxdWV1ZSwgam9iKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciAke3F1ZXVlfSAke0pTT04uc3RyaW5naWZ5KGpvYil9ICA+PiAke2Vycm9yfWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcih7Y29ubmVjdGlvbn0sIHRoaXMuam9icyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVGcm9tTmFtZShqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBjb25zdCBqb2JUeXBlID0gdGhpcy5qb2JUeXBlcy5maW5kKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGUpID09IGpvYk5hbWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFqb2JUeXBlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB0eXBlIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB0cnlSZXNvbHZlQW5kQ29ubmVjdChqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IHRoaXMudHJ5UmVzb2x2ZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuY29ubmVjdCgpO1xyXG4gICAgICAgIHJldHVybiBqb2JOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBJSm9iIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCB7dXNlVmFsdWU6IHBhcmFtc1tuYW1lXX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihqb2JUeXBlLCBqb2JUeXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5yZXNvbHZlKGpvYlR5cGUpIGFzIElKb2I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRvUGVyZm9ybUZ1bmN0aW9uKGpvYlR5cGU6IFR5cGU8SUpvYj4pOiBGdW5jdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBqb2IgPSB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBqb2JQYXJhbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gam9iLnByb2Nlc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFzQixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9GLE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQVMsTUFBTSxRQUFRLENBQUM7QUFDdEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUMsWUFBWSxFQUFrQixHQUFHLEVBQXFELE1BQU0saUJBQWlCLENBQUM7QUFDdEgsT0FBTyxFQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM5RixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7SUFJakMsVUFBVSxTQUFWLFVBQVU7SUFPbkIsWUFBcUIsTUFBcUIsRUFBaUMsU0FBOEIsRUFBa0IsUUFBc0I7UUFBNUgsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFpQyxjQUFTLEdBQVQsU0FBUyxDQUFxQjtRQUNyRyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQW9CLEVBQUUsRUFBRTtnQkFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixD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QUFvQixFQUFFLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBUyxDQUFDO0lBQzlDLENBQUM7Q0FDSixDQUFBO0FBeklZLFVBQVU7SUFGdEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFRZSxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQSxFQUEyQyxXQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQ0FBN0YsYUFBYTtHQVBqQyxVQUFVLENBeUl0QjtTQXpJWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdGFibGUsIGluamVjdEFsbCwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge3NjaGVkdWxlLCB2YWxpZGF0ZX0gZnJvbSBcIm5vZGUtY3JvblwiO1xyXG5pbXBvcnQge3NvY2tldCwgU29ja2V0fSBmcm9tIFwiemVyb21xXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7RElfQ09OVEFJTkVSLCBJSm9iLCBJSm9iVGFzaywgSk9CLCBKb2JQYXJhbXMsIEpvYlNjaGVkdWxlUmFuZ2UsIEpvYlNjaGVkdWxlVGltZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2dldENvbnN0cnVjdG9yTmFtZSwgaXNBcnJheSwgaXNPYmplY3QsIGpzb25IaWdobGlnaHQsIHByb21pc2VUaW1lb3V0fSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIEpvYk1hbmFnZXIge1xyXG5cclxuICAgIHByb3RlY3RlZCBqb2JzOiB7W25hbWU6IHN0cmluZ106IChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4gUHJvbWlzZTxhbnk+fTtcclxuICAgIHByb3RlY3RlZCBzY2hlZHVsZXI6IFByb21pc2U8U29ja2V0PjtcclxuICAgIHByb3RlY3RlZCB3b3JrZXI6IFNvY2tldDtcclxuICAgIHByb3RlY3RlZCBqb2JUeXBlczogVHlwZTxJSm9iPltdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgQGluamVjdChESV9DT05UQUlORVIpIHJlYWRvbmx5IGNvbnRhaW5lcjogRGVwZW5kZW5jeUNvbnRhaW5lciwgQGluamVjdEFsbChKT0IpIGpvYlR5cGVzOiBUeXBlPElKb2I+W10pIHtcclxuICAgICAgICB0aGlzLmpvYlR5cGVzID0gam9iVHlwZXMgfHwgW107XHJcbiAgICAgICAgdGhpcy5qb2JzID0gdGhpcy5qb2JUeXBlcy5yZWR1Y2UoKHJlcywgam9iVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICByZXNbZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpXSA9IChqb2JQYXJhbXM6IEpvYlBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgam9iUGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqb2IucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3Moam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlOiBJSm9iID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xyXG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9jZXNzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5xdWV1ZVdpdGhOYW1lKG5hbWU6IHN0cmluZywgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGF3YWl0IHRoaXMudHJ5UmVzb2x2ZUZyb21OYW1lKG5hbWUsIHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvV29ya2Vycyhqb2JOYW1lLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVucXVldWUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGF3YWl0IHRoaXMudHJ5UmVzb2x2ZUFuZENvbm5lY3Qoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Xb3JrZXJzKGpvYk5hbWUsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlbmRUb1dvcmtlcnMoam9iTmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgdGhpcy5zY2hlZHVsZXI7XHJcbiAgICAgICAgYXdhaXQgcHVibGlzaGVyLnNlbmQoW2pvYk5hbWUsIEpTT04uc3RyaW5naWZ5KHBhcmFtcyksIG5ldyBPYmplY3RJZCgpLnRvSGV4U3RyaW5nKCldKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2hlZHVsZShtaW51dGU6IEpvYlNjaGVkdWxlVGltZSwgaG91cjogSm9iU2NoZWR1bGVUaW1lLCBkYXlPZk1vbnRoOiBKb2JTY2hlZHVsZVRpbWUsIG1vbnRoOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mV2VlazogSm9iU2NoZWR1bGVUaW1lLCBqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogSUpvYlRhc2sge1xyXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbbWludXRlLCBob3VyLCBkYXlPZk1vbnRoLCBtb250aCwgZGF5T2ZXZWVrXS5tYXAodCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh0KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0IGFzIEpvYlNjaGVkdWxlUmFuZ2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cmFuZ2UubWluIHx8IDB9LSR7cmFuZ2UubWF4IHx8IDB9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh0KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuam9pbihcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGAke3R9YDtcclxuICAgICAgICB9KS5qb2luKFwiIFwiKTtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGUoZXhwcmVzc2lvbikpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYENhbid0IHNjaGVkdWxlIHRoZSB0YXNrOiAnJHtqb2JOYW1lfScgYmVjYXVzZSB0aW1lIGV4cHJlc3Npb24gaXMgaW52YWxpZC5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2hlZHVsZShleHByZXNzaW9uLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5xdWV1ZShqb2JUeXBlLCBwYXJhbXMpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENhbid0IGVucXVldWUgam9iOiAnJHtqb2JOYW1lfScgYmVjYXVzZTogJHtlfWApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydFByb2Nlc3NpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJ6bXFSZW1vdGVIb3N0XCIpO1xyXG4gICAgICAgIHRoaXMud29ya2VyID0gc29ja2V0KFwicHVsbFwiKTtcclxuICAgICAgICB0aGlzLndvcmtlci5jb25uZWN0KGhvc3QpO1xyXG4gICAgICAgIHRoaXMud29ya2VyLm9uKFwibWVzc2FnZVwiLCBhc3luYyAobmFtZTogQnVmZmVyLCBhcmdzOiBCdWZmZXIsIHVuaXF1ZUlkOiBCdWZmZXIpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBuYW1lLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlBhcmFtcyA9IEpTT04ucGFyc2UoYXJncy50b1N0cmluZyhcInV0ZjhcIikpIGFzIEpvYlBhcmFtcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVySWQgPSB1bmlxdWVJZD8udG9TdHJpbmcoXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgam9iTmFtZUxvZyA9IGBcXHgxYlszNm1cIiR7am9iTmFtZX1cIlxceDFiWzBtYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYkFyZ3NMb2cgPSBgXFxuJHtqc29uSGlnaGxpZ2h0KGpvYlBhcmFtcyl9XFxuYDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWUodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVMb2codGltZXJJZCwgYFN0YXJ0ZWQgd29ya2luZyBvbiBiYWNrZ3JvdW5kIGpvYjogJHtqb2JOYW1lTG9nfSB3aXRoIGFyZ3M6ICR7am9iQXJnc0xvZ31gKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFt0aGlzLmpvYnNbam9iTmFtZV0oam9iUGFyYW1zKSwgcHJvbWlzZVRpbWVvdXQoMTUwMDAsIHRydWUpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHRpbWVySWQsIGBGaW5pc2hlZCB3b3JraW5nIG9uIGJhY2tncm91bmQgam9iOiAke2pvYk5hbWVMb2d9IHdpdGggYXJnczogJHtqb2JBcmdzTG9nfWApO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUxvZyh0aW1lcklkLCBgQmFja2dyb3VuZCBqb2IgZmFpbGVkOiAke2pvYk5hbWVMb2d9IHdpdGggYXJnczogJHtqb2JBcmdzTG9nfSR7ZS5tZXNzYWdlfVxcblxcbmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVySWQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHN0YXJ0IGpvYjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgV2FpdGluZyBmb3Igam9icyBhdDogJHtob3N0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeVJlc29sdmUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmpvYnNbam9iTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IHJlc29sdmUgcGFyYW1zIGZvciBqb2I6ICR7am9iTmFtZX0sIHdpdGggcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9LiBSZWFzb246ICR7ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gam9iTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdHJ5UmVzb2x2ZUZyb21OYW1lKGpvYk5hbWU6IHN0cmluZywgcGFyYW1zOiBKb2JQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGNvbnN0IGpvYlR5cGUgPSB0aGlzLmpvYlR5cGVzLmZpbmQodHlwZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25zdHJ1Y3Rvck5hbWUodHlwZSkgPT0gam9iTmFtZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWpvYlR5cGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHR5cGUgd2l0aCBuYW1lOiAke2pvYk5hbWV9IHNvIGl0IGNhbid0IGJlIGVucXVldWVkIWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHRyeVJlc29sdmVBbmRDb25uZWN0KGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyIHx8IG5ldyBQcm9taXNlPGFueT4oYXN5bmMgcmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUG9ydFwiKTtcclxuICAgICAgICAgICAgY29uc3QgcHVibGlzaGVyID0gc29ja2V0KFwicHVzaFwiKTtcclxuICAgICAgICAgICAgYXdhaXQgcHVibGlzaGVyLmJpbmQoYHRjcDovLzAuMC4wLjA6JHtwb3J0fWApXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQdWJsaXNoZXIgYm91bmQgdG8gcG9ydDogJHtwb3J0fWApO1xyXG4gICAgICAgICAgICByZXNvbHZlKHB1Ymxpc2hlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJ5UmVzb2x2ZShqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBJSm9iIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCB7dXNlVmFsdWU6IHBhcmFtc1tuYW1lXX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihqb2JUeXBlLCBqb2JUeXBlKTtcclxuICAgICAgICByZXR1cm4gY29udGFpbmVyLnJlc29sdmUoam9iVHlwZSkgYXMgSUpvYjtcclxuICAgIH1cclxufVxyXG4iXX0=