@media-quest/engine 0.0.10 → 0.0.11

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.
@@ -2198,7 +2198,7 @@ var isID = (idName, id) => {
2198
2198
  return false;
2199
2199
  return id.length >= MIN_LENGTH;
2200
2200
  };
2201
- var createID = (idName) => {
2201
+ var createIDByName = (idName) => {
2202
2202
  const letters = "abcdefghijklmnopqrstuvyz";
2203
2203
  const all = letters + letters.toUpperCase();
2204
2204
  let result = "";
@@ -2209,7 +2209,7 @@ var createID = (idName) => {
2209
2209
  return result;
2210
2210
  };
2211
2211
  var createTypedIdSingleton = (idName) => {
2212
- const create = () => createID(idName);
2212
+ const create = () => createIDByName(idName);
2213
2213
  const is = (id) => isID(idName, id);
2214
2214
  const validateOrThrow = (id) => {
2215
2215
  if (!is(id)) {
@@ -2242,4 +2242,4 @@ var PageID = createTypedIdSingleton("PAGE");
2242
2242
  SchemaID,
2243
2243
  createTypedIdSingleton
2244
2244
  });
2245
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1YmxpYy1hcGkudHMiLCAiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBTY2hlbWFFbmdpbmUgfSBmcm9tIFwiLi9lbmdpbmUvU2NoZW1hRW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vU2NoZW1hRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzL0RFdmVudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL2ZhY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ydWxlcy9jb25kaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL0RzdGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRGVsZW1lbnQvRFN0eWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9jc3NcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL0lEXCI7XG4iLCAiaW1wb3J0IHsgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvLCBERWxlbWVudER0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGVcIjtcbmltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcbmltcG9ydCB7IFBhZ2VJRCwgU2NoZW1hSUQgfSBmcm9tIFwiLi4vdXRpbHMvSURcIjtcblxuZXhwb3J0IHR5cGUgUGFnZVF1ZVJ1bGVzID0gUnVsZTxQYWdlUXVlQ29tbWFuZCwgbmV2ZXI+O1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFBhZ2VJRDtcbiAgcmVhZG9ubHkgZWxlbWVudHM6IEFycmF5PERFbGVtZW50RHRvPjtcbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZ1tdO1xuICByZWFkb25seSBtYWluVmlkZW9JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSB2aWRlbz86IEFycmF5PERWaWRlb0R0bz47XG4gIHJlYWRvbmx5IGF1ZGlvPzogQXJyYXk8REF1ZGlvRHRvPjtcbiAgcmVhZG9ubHkgYXV0b1BsYXlTZXF1ZW5jZT86IERBdXRvUGxheVNlcXVlbmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTZXF1ZW5jZUR0byB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVzOiBBcnJheTxQYWdlUXVlUnVsZXM+O1xuICByZWFkb25seSBwYWdlczogQXJyYXk8UGFnZUR0bz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFNjaGVtYUlEO1xuICByZWFkb25seSBiYXNlSGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhc2VXaWR0aDogbnVtYmVyO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFnZXM6IFBhZ2VEdG9bXTtcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHN0YXRlUHJvcHM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5Qcm9wPjtcbiAgcmVhZG9ubHkgc3RhdGVRdWVyaWVzPzogUmVhZG9ubHlBcnJheTxEU3RhdGUuU3RhdGVRdWVyeT47XG4gIHJlYWRvbmx5IHN0YXRlRnJvbUV2ZW50OiBSZWFkb25seUFycmF5PERTdGF0ZS5mcm9tRXZlbnRIYW5kbGVyPjtcbiAgcmVhZG9ubHkgcGFnZVNlcXVlbmNlcz86IEFycmF5PFBhZ2VTZXF1ZW5jZUR0bz47XG4gIHJlYWRvbmx5IHByZWRlZmluZWRGYWN0cz86IFJlYWRvbmx5QXJyYXk8RmFjdD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2NoZW1hRHRvIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlc291cmNlcyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYUR0byxcbiAgKToge1xuICAgIHZpZGVvTGlzdDogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+O1xuICAgIGF1ZGlvTGlzdDogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+O1xuICAgIGltYWdlTGlzdDogUmVhZG9ubHlBcnJheTxESW1nRHRvPjtcbiAgfSA9PiB7XG4gICAgY29uc3QgeyBwYWdlcyB9ID0gc2NoZW1hO1xuICAgIGNvbnN0IHZpZGVvTGlzdCA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEVmlkZW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLnZpZGVvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLnZpZGVvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGF1ZGlvTGlzdDogQXJyYXk8REF1ZGlvRHRvPiA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEQXVkaW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLmF1ZGlvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHsgdmlkZW9MaXN0LCBhdWRpb0xpc3QsIGltYWdlTGlzdDogW10gfTtcbiAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBEVGltZXN0YW1wID0gbnVtYmVyICYgeyBfX3RpbWVzdGFtcF9fOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERUaW1lc3RhbXAge1xuICAgIGV4cG9ydCBjb25zdCBub3cgPSAoKSA9PiBEYXRlLm5vdygpIGFzIERUaW1lc3RhbXA7XG4gICAgZXhwb3J0IHR5cGUgRGlmZiA9IG51bWJlciAmIHsgX19kaWZmX186IHRydWUgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhZGRNaWxscyA9ICh0OiBEVGltZXN0YW1wLCBtczogbnVtYmVyKTogRFRpbWVzdGFtcCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHQgKyBNYXRoLmFicyhtcyk7XG4gICAgICAgIHJldHVybiByZXMgYXMgRFRpbWVzdGFtcDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmYgPSAodDE6IERUaW1lc3RhbXAsIHQyOiBEVGltZXN0YW1wKTogRGlmZiA9PiB7XG4gICAgICAgIGNvbnN0IHQxQWJzID0gTWF0aC5hYnModDEpO1xuICAgICAgICBjb25zdCB0MkFicyA9IE1hdGguYWJzKHQyKTtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHQxQWJzIC0gdDJBYnMpIGFzIERpZmY7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBkaWZmTm93ID0gKHQ6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgcmV0dXJuIGRpZmYodCwgbm93KCkpO1xuICAgIH07XG59XG4iLCAiZXhwb3J0IHR5cGUgUmFuZG9tT2JqZWN0SWQgPSBzdHJpbmcgJiB7IHJhbmRvbU9iamVjdElkOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERVdGlsIHtcbiAgICBleHBvcnQgY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgbGV0dGVycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5elwiO1xuICAgICAgICBjb25zdCB1cHBlcmNhc2UgPSBsZXR0ZXJzLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGxldHRlcnMgKyB1cHBlcmNhc2U7XG4gICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGxlbmd0aCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCByYW5kb21PYmplY3RJZCA9ICgpID0+IHJhbmRvbVN0cmluZygzMikgYXMgUmFuZG9tT2JqZWN0SWQ7XG5cbiAgICBleHBvcnQgY29uc3QgZGVsZXRlUHJvcCA9IDxPYmosIEtleSBleHRlbmRzIGtleW9mIE9iaj4ob2JqOiBPYmosIGtleTogS2V5KTogT21pdDxPYmosIEtleT4gPT4ge1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0luUmFuZ2UgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbiAgICB9O1xuICAgIGV4cG9ydCBjb25zdCBpc0luZmluaXR5ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IEluZmluaXR5O1xuICAgIH07XG4gICAgZXhwb3J0IHR5cGUgTm9uRW1wdHlBcnJheTxUPiA9IFtULCAuLi5UW11dO1xuICAgIGV4cG9ydCBjb25zdCBpc05vbkVtcHR5QXJyYXkgPSA8VD4oYXJyYXk6IEFycmF5PFQ+KTogYXJyYXkgaXMgTm9uRW1wdHlBcnJheTxUPiA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbmV2ZXJDaGVjayA9IChhcmdzOiBuZXZlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk9PUFM6IFRoaXMgdmFsdWUgc2xpcHBlZCB0aHJvdWdoIHRoZSBuZXZlci1jaGVja1wiLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKHN0cjogdW5rbm93bik6IHN0ciBpcyBzdHJpbmcgPT4gdHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIjtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLZXkgPSA8VCBleHRlbmRzIHN0cmluZz4ob2JqOiB1bmtub3duLCBrZXk6IFQpOiBvYmogaXMgUmVjb3JkPHR5cGVvZiBrZXksIHVua25vd24+ID0+IHtcbiAgICAgICAgaWYgKCFpc1JlY29yZChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1JlY29yZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzQm9vbCA9IChvYmo6IGJvb2xlYW4pOiBvYmogaXMgYm9vbGVhbiA9PiB0eXBlb2Ygb2JqID09PSBcImJvb2xlYW5cIjtcblxuICAgIGV4cG9ydCBjb25zdCBpc1RydWUgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgdHJ1ZSA9PiBib29sID09PSB0cnVlO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzRmFsc2UgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgZmFsc2UgPT4gYm9vbCA9PT0gZmFsc2U7XG5cbiAgICBleHBvcnQgY29uc3QgaXNEZWZpbmVkID0gKG9iajogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBub3ROdWxsID0gb2JqICE9PSBudWxsO1xuICAgICAgICBjb25zdCBub3RVbmRlZmluZWQgPSBvYmogIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vdE51bGwgJiYgbm90VW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzS2luZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyByZWFkb25seSBraW5kOiBzdHJpbmcgfSA9PiB7XG4gICAgICAgIGlmICghaGFzS2V5KG9iaiwgXCJraW5kXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmoua2luZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmoua2luZC5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzVmFsdWUgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHsgdmFsdWU6IHVua25vd24gfSA9PiB7XG4gICAgICAgIHJldHVybiBoYXNLZXkob2JqLCBcInZhbHVlXCIpO1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKHZhbHVlPzogbnVtYmVyKTogdmFsdWUgaXMgbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3QgaXNOdW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XG4gICAgICAgIGNvbnN0IG5vdE5hTiA9ICFOdW1iZXIuaXNOYU4odmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNOdW1iZXIgJiYgbm90TmFOO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWF4Rm4gPSAodXBwZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCB1cHBlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IG1pbkZuID0gKGxvd2VyTGltaXQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSwgbG93ZXJMaW1pdCk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERDc3Mge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHgge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJweFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFN0cmluZyA9IGAke251bWJlcn1weGAgfCBgJHtudW1iZXJ9JWA7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQZXJjZW50IHtcbiAgICAgICAgcmVhZG9ubHkgX3VuaXQ6IFwicGVyY2VudFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFVuaXQgPSBQeCB8IFBlcmNlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHNjYWxlIHRvIDMlIG9mIGJhc2VTY2FsZVxuICAgICAqIEBwYXJhbSB1bml0XG4gICAgICogQHBhcmFtIHNjYWxlXG4gICAgICovXG4gICAgZXhwb3J0IGNvbnN0IHRvU3RyaW5nID0gKHVuaXQ6IFJlYWRvbmx5PExlbmd0aFVuaXQ+LCBzY2FsZTogbnVtYmVyKTogTGVuZ3RoU3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgY2xhbXBlZFNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIDAuMDMpO1xuICAgICAgICBpZiAodW5pdC5fdW5pdCA9PT0gXCJweFwiKSB7XG4gICAgICAgICAgICBpZiAodW5pdC52YWx1ZSA8IDAuMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjBweFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZCh1bml0LnZhbHVlICogY2xhbXBlZFNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heChyb3VuZGVkLCAxKTtcbiAgICAgICAgICAgIHJldHVybiAoY2xhbXBlZCArIFwicHhcIikgYXMgTGVuZ3RoU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodW5pdC52YWx1ZSArIFwiJVwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0xlbmd0aFVuaXQgPSAodW5pdD86IExlbmd0aFVuaXQpOiB1bml0IGlzIExlbmd0aFVuaXQgPT4ge1xuICAgICAgICBpZiAoIXVuaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bml0S2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJfdW5pdFwiO1xuICAgICAgICBjb25zdCB2YWx1ZUtleToga2V5b2YgTGVuZ3RoVW5pdCA9IFwidmFsdWVcIjtcbiAgICAgICAgY29uc3QgaGFzVW5pdEtleSA9IERVdGlsLmhhc0tleSh1bml0LCB1bml0S2V5KTtcbiAgICAgICAgY29uc3QgaGFzVmFsdWVLZXkgPSBEVXRpbC5oYXNLZXkodW5pdCwgdmFsdWVLZXkpO1xuICAgICAgICByZXR1cm4gaGFzVW5pdEtleSAmJiBoYXNWYWx1ZUtleTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERDc3MgfSBmcm9tIFwiLi9jc3NcIjtcbmltcG9ydCB7IEVsZW1lbnRLZXlOYW1lcyB9IGZyb20gXCIuL0RTdHlsZS11dGlsc1wiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxudHlwZSBEU3R5bGUyID0gQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbmV4cG9ydCBpbnRlcmZhY2UgRFN0eWxlIHtcbiAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogXCJ2aXNpYmxlXCIgfCBcImhpZGRlblwiO1xuICAgIGN1cnNvcjpcbiAgICAgICAgfCBcInBvaW50ZXJcIlxuICAgICAgICB8IFwiaGVscFwiXG4gICAgICAgIHwgXCJjb3B5XCJcbiAgICAgICAgfCBcIndhaXRcIlxuICAgICAgICB8IFwibm90LWFsbG93ZWRcIlxuICAgICAgICB8IFwiY29udGV4dC1tZW51XCJcbiAgICAgICAgfCBcIm1vdmVcIlxuICAgICAgICB8IFwiZ3JhYmJpbmdcIlxuICAgICAgICB8IFwiZ3JhYlwiXG4gICAgICAgIHwgXCJ6b29tLWluXCJcbiAgICAgICAgfCBcInpvb20tb3V0XCJcbiAgICAgICAgfCBcIm5vbmVcIlxuICAgICAgICB8IFwiYXV0b1wiXG4gICAgICAgIHwgXCJkZWZhdWx0XCI7XG5cbiAgICAvLyBQT1NJVElPTlxuICAgIGg6IG51bWJlcjtcbiAgICB3OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcblxuICAgIC8vIEJPUkRFUlNcbiAgICBib3JkZXJTdHlsZTogXCJzb2xpZFwiIHwgXCJub25lXCIgfCBcImRvdHRlZFwiIHwgXCJkYXNoZWRcIjtcbiAgICBib3JkZXJSYWRpdXM6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG4gICAgYm9yZGVyV2lkdGg6IERDc3MuUHg7XG4gICAgYm9yZGVyQ29sb3I6IHN0cmluZztcblxuICAgIG1hcmdpbjogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBwYWRkaW5nOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuXG4gICAgLy8gVHJhbnNsYXRlXG4gICAgdHJhbnNmb3JtOiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlOiBzdHJpbmc7XG5cbiAgICAvLyBURVhUXG4gICAgZm9udFNpemU6IERDc3MuUHg7XG4gICAgdGV4dENvbG9yOiBzdHJpbmc7XG4gICAgZm9udFdlaWdodDogMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwgNjAwIHwgNzAwIHwgODAwIHwgOTAwO1xuICAgIHRleHRBbGlnbjogXCJyaWdodFwiIHwgXCJsZWZ0XCIgfCBcImNlbnRlclwiO1xuICAgIGxldHRlclNwYWNpbmc6IERDc3MuUHg7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0eWxlIHtcbiAgICBleHBvcnQgY29uc3Qgbm9ybWFsaXplID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQpOiBUID0+IHtcbiAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5tYXJnaW4gPSBcIjBcIjtcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGVsLnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhcHBseVN0eWxlcyA9IDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGVsOiBULCBzdHlsZTogUGFydGlhbDxEU3R5bGU+LCBzY2FsZTogbnVtYmVyKTogVCA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHNjYWxlUHggPSBEQ3NzLnRvU3RyaW5nQ3JlKHRoaXMuc2NhbGUpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgICAgICBib3JkZXJTdHlsZSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250V2VpZ2h0LFxuICAgICAgICAgICAgdGV4dENvbG9yLFxuICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgdHJhbnNsYXRlLFxuICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIGxldHRlclNwYWNpbmcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgdmlzaWJpbGl0eSxcbiAgICAgICAgfSA9IHN0eWxlO1xuXG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUuZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jb2xvciA9IHRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dEFsaWduKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlcldpZHRoID0gRENzcy50b1N0cmluZyhib3JkZXJXaWR0aCwgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250V2VpZ2h0KSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gZm9udFdlaWdodCArIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJTdHlsZSA9IGJvcmRlclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250U2l6ZSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuZm9udFNpemUgPSBEQ3NzLnRvU3RyaW5nKGZvbnRTaXplLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSB4ICsgXCIlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSB5ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoaCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIodykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gdyArIFwiJVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERDc3MuaXNMZW5ndGhVbml0KGJvcmRlclJhZGl1cykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclJhZGl1cyA9IERDc3MudG9TdHJpbmcoYm9yZGVyUmFkaXVzLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgZWwuc3R5bGUubGV0dGVyU3BhY2luZyA9IERDc3MudG9TdHJpbmcobGV0dGVyU3BhY2luZywgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJnaW4pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IERDc3MudG9TdHJpbmcobWFyZ2luLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnBhZGRpbmcgPSBEQ3NzLnRvU3RyaW5nKHBhZGRpbmcsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihvcGFjaXR5KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHkgKyBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgLy8gY29uc3QgcHJvcE5hbWVzID0gbmV3IFNldCguLi5FbGVtZW50S2V5TmFtZXMpO1xuICAgIC8vIGV4cG9ydCBjb25zdCB2YWxpZEtleSA9IChrZXlOYW1lOiBzdHJpbmcpID0+IHByb3BOYW1lcy5oYXMoa2V5TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5jb25zdCBBQk9SVF9QTEFZX1RPX0VORCA9IFwiQUJPUlRfUExBWV9UT19FTkRcIjtcbmV4cG9ydCBpbnRlcmZhY2UgQ2FuUGxheVRvRW5kIHtcbiAgICBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGNsYXNzIFZpZGVvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHByaXZhdGUgZHRvPzogRFZpZGVvRHRvO1xuICAgIHByaXZhdGUgZGVmYXVsdFN0eWxlczogUGFydGlhbDxEU3R5bGU+ID0geyBoOiA0NSwgdzogMTAwLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCB5OiA1NSB9O1xuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BBVVNFRF9FVkVOVFwiLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcGxheSh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAgICAgdGhpcy5lbC5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZHVjZXJJZCA9IHRoaXMuZHRvPy5pZCA/PyBcIkRWaWRlb1wiO1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJWSURFT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuXG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKSB7XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5kdG8/LnVybDtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbmRlZE9yRXJyb3JlZCA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBBQk9SVF9QTEFZX1RPX0VORCxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDQVRDSEVEIEFCQk9SVC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJBYm9ydGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUExBWVwiKTtcbiAgICAgICAgICAgIHRoaXMucGxheSh1cmwpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIGZpbmFsbHkgYmxvY2sgcGxheVRvRW5kKCkgY29tcGxldGVkIHZpZGVvSWQ6IFwiICsgdGhpcy5kdG8/LmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBIVE1MVmlkZW9FbGVtZW50LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UgLy8gZHRvPzogRFZpZGVvRHRvXG4gICAgKSB7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbIERfVmlkZW8gXSA6IFwiO1xuICAgICAgICB0aGlzLmVsLmNvbnRyb2xzID0gZmFsc2U7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCB0aGlzLmRlZmF1bHRTdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuXG4gICAgICAgIHRoaXMuZWwub25lbmRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJWSURFT19FTkRFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETyBMT0dHIElOVEVSTkFMIFNUQVRFX0NIQU5HRVMuXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5lbC5vbnBhdXNlID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9ICgpID0+IHt9O1xuICAgICAgICB0aGlzLmVsLm9uY2FucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIlJFQURZIFRPIFBMQVlcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkR1cmF0aW9uOiBcIiArIHRoaXMuZWwuZHVyYXRpb24pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJZDogXCIgKyB0aGlzLmlkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ3VycmVudCBUaW1lOiBcIiArIHRoaXMuZWwuY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJBdWRvUGxheTogXCIgKyB0aGlzLmVsLmF1dG9wbGF5KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0xPQURFRF9NRVRBREFUQV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUT0RPIFVTRSBUSElTIFNZTlRBWD9cbiAgICAgICAgdGhpcy5lbC5vbmR1cmF0aW9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy5lbC5jdXJyZW50VGltZTtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gdGhpcy5lbC52b2x1bWU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5lbC5pc0Nvbm5lY3RlZDtcbiAgICAgICAgY29uc3QgcGxheWJhY2tRdWFsaXR5ID0gdGhpcy5lbC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpO1xuICAgICAgICBjb25zdCBkZWZhdWx0UGxheWJhY2tSYXRlID0gdGhpcy5lbC5kZWZhdWx0UGxheWJhY2tSYXRlO1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLmVsLnBhdXNlZDtcbiAgICAgICAgY29uc3QgcGxheWVkID0gdGhpcy5lbC5wbGF5ZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgcGF1c2VkLFxuICAgICAgICAgICAgcGxheWVkLFxuICAgICAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgICAgICBpc0Nvbm5lY3RlZCxcbiAgICAgICAgICAgIHBsYXliYWNrUXVhbGl0eSxcbiAgICAgICAgICAgIGRlZmF1bHRQbGF5YmFja1JhdGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0RHRvKGR0bzogRFZpZGVvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50RHRvKCk6IERWaWRlb0R0byB8IGZhbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlczogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCBzdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHt9XG59XG4iLCAiaW1wb3J0IHsgQ2FuUGxheVRvRW5kIH0gZnJvbSBcIi4vVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IERBdWRpb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBERXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEQXVkaW8gXTogXCI7XG4gICAgcHJvdGVjdGVkIGR0bzogREF1ZGlvRHRvIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBlbDogSFRNTEF1ZGlvRWxlbWVudDtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyKSB7XG4gICAgICAgIHRoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIik7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIC8vIHRoaXMuZWwub25cbiAgICAgICAgdGhpcy5vbkxvYWQgPSB0aGlzLm9uTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLm9uTG9hZGVkTWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gdGhpcy5vbkxvYWRlZE1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVsLm9ucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkNhblBsYXlUaHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5dGhyb3VnaCA9IHRoaXMub25DYW5QbGF5VGhyb3VnaDtcbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKF8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZWwuc3JjO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB1cmwgfSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoXzogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5maW5pdHkgPSBkdXJhdGlvbiA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb246IHRoaXMuZWwuZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldEF1ZGlvKGR0bzogREF1ZGlvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBFTUlUIEVSUk9SIEVWRU5ULlxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Mb2FkZWRNZXRhZGF0YShfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19NRVRBREFUQV9MT0FERURfRVZFTlRcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fTE9BRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIGV2ZW50LnR5cGUpO1xuICAgIH1cblxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvPy5pZCA/PyBcIkRBdWRpb1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5QbGF5VGhyb3VnaChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19DQU5fUExBWV9USFJPVUdIX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBvblBsYXkoXzogRXZlbnQpIHt9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbGF5KHRoaXMuZWwuc3JjKTtcbiAgICAgICAgICAgIGF3YWl0IGVuZGVkT3JFcnJvcmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gTEVUIFBBUkVOVCBERUFMIFdJVEggRVJST1JTPyBUSEUgTUFOQUdFUj8/IE1BTkFHRVJTIENBTEwgQUJPUlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJBVURJT19FUlJPUl9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZXJyb3I6IGUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgVmlkZW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1ZGlvQ29udGFpbmVyIH0gZnJvbSBcIi4uL0RlbGVtZW50L0F1ZGlvQ29udGFpbmVyXCI7XG5pbXBvcnQgeyBBdXRvUGxheUVsZW1lbnQsIERBdXRvUGxheVNlcXVlbmNlIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuL3Jlc291cmNlLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBBdXRvcGxheVRhc2ssIFNlcXVlbmNlTWFuYWdlciB9IGZyb20gXCIuL3NlcXVlbmNlLW1hbmFnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWVkaWFNYW5hZ2VyIHtcbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKTogdm9pZDtcbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRE1lZGlhTWFuYWdlciBpbXBsZW1lbnRzIElNZWRpYU1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBJTlNUQU5DRV9DT1VOVCA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgTUVESUFfTUFOQUdFUiBdIDogXCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9Db250YWluZXI6IFZpZGVvQ29udGFpbmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvQ29udGFpbmVyOiBBdWRpb0NvbnRhaW5lcjtcbiAgcHJpdmF0ZSBwYWdlRW50ZXI6IERUaW1lc3RhbXA7XG4gIHByaXZhdGUgc2luY2VQYWdlRW50ZXI6IERUaW1lc3RhbXAuRGlmZjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogUGFnZUR0byB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29tbWFuZHM6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlja2VyUmVmOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VxdWVuY2VNYW5hZ2VyOiBTZXF1ZW5jZU1hbmFnZXIgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogSFRNTERpdkVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVCArIDE7XG4gICAgdGhpcy5pbnN0YW5jZU51bWJlciA9IERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQ7XG4gICAgY29uc3QgdmlkZW9FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtcbiAgICB0aGlzLmhvc3RFbC5hcHBlbmQodmlkZW9FbCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lciA9IG5ldyBWaWRlb0NvbnRhaW5lcih2aWRlb0VsLCBldmVudEJ1cywgdGhpcy5zY2FsZSk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lciA9IG5ldyBBdWRpb0NvbnRhaW5lcih0aGlzLmV2ZW50QnVzKTtcbiAgICB0aGlzLnRpY2sgPSB0aGlzLnRpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiB9KTtcbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMucGFnZUVudGVyID0gbm93O1xuICAgIHRoaXMuc2luY2VQYWdlRW50ZXIgPSBEVGltZXN0YW1wLmRpZmYobm93LCBub3cpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGFjdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kSGFuZGxlcihhY3Rpb24pO1xuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMudGlja2VyUmVmID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHt9LCAxMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGFsbCBtZWRpYSB0aGF0IGlzIHBsYXlpbmdcbiAgICovXG4gIGNsZWFyQWxsTWVkaWEoKSB7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIucGF1c2UoKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGNvbnNvbGUubG9nKFwiVE9ETyBERVNUUk9ZIEFMTCBNRURJQVwiKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRpY2tlclJlZik7XG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXJSZWYpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIuZGVzdHJveSgpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKSB7XG4gICAgLy8gVE9ETyBTVE9QIFZJREVPL0FVRElPIFRIQVQgTUlHSFQgQkUgUExBWUlORyBJTiBUSEUgRE9NPz9cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIC8vIFRPRE8gVEhpcyBtaWdodCBiZSBhIGJ1ZyBpZiBzb21lb25lXG5cbiAgICBjb25zdCBzZXEgPSBwYWdlLmF1dG9QbGF5U2VxdWVuY2U7XG4gICAgLy8gdGhpcy5zZXF1ZW5jZSA9IHNlcSA/IFsuLi5zZXEuaXRlbXNdIDogW107XG4gICAgY29uc3QgeyBtYWluVmlkZW9JZCwgYXVkaW8gfSA9IHBhZ2U7XG4gICAgY29uc3QgYXVkaW9FbGVtZW50cyA9IHBhZ2UuYXVkaW87XG5cbiAgICBpZiAobWFpblZpZGVvSWQpIHtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQobWFpblZpZGVvSWQpO1xuICAgICAgaWYgKGR0bykge1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldER0byhkdG8pO1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgLi4uZHRvLnN0eWxlLCB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB9KTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgICAgLy8gSElERT9cbiAgICB9XG4gICAgaWYgKGF1ZGlvRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYXVkaW9FbGVtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGZpcnN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5wbGF5U2VxdWVuY2Uoc2VxKTtcbiAgICB9XG4gICAgLy8gY29uc3QgaGFzVmlkZW8gPVxuICB9XG5cbiAgcHJpdmF0ZSBjb21tYW5kSGFuZGxlcihjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiVklERU9fUExBWV9DT01NQU5EXCIpIHtcbiAgICAgIGNvbnN0IHZpZGVvID0gY29tbWFuZC50YXJnZXRJZDtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMudmlkZW9Db250YWluZXIuZ2V0Q3VycmVudER0bygpO1xuXG4gICAgICBpZiAoZHRvICYmIGR0by5pZCA9PT0gY29tbWFuZC50YXJnZXRJZCkge1xuICAgICAgICBjb25zb2xlLmxvZyh2aWRlbyk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGxheShkdG8udXJsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QQVVTRV9DT01NQU5EXCIpIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJBVURJT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy5hdWRpb0NvbnRhaW5lclxuICAgICAgICAucGxheVRvRW5kKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge30pXG4gICAgICAgIC5jYXRjaCgpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgLy8gdGhpcy5hdWRpb0NvbnRhaW5lci5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBsYXlTZXF1ZW5jZShzZXE6IERBdXRvUGxheVNlcXVlbmNlKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBzZXEuaXRlbXM7XG4gICAgY29uc3QgdGVzdENsb25lID0gWy4uLmVsZW1lbnRzXTtcbiAgICBjb25zdCBmaXJzdCA9IHRlc3RDbG9uZS5wb3AoKTtcblxuICAgIGlmICghZmlyc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICBzZXEuc3RhcnRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjKTtcbiAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGMpO1xuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KERTdGF0ZVByb3BzLm1lZGlhQmxvY2tlZEJ5U2VxdWVuY2Uuc2V0VHJ1ZUNvbW1hbmQpO1xuICAgIC8vIGlmIChzZXEuYmxvY2tVc2VySW5wdXQpIHtcbiAgICAvLyAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2UuZ2V0U2V0VHJ1ZUNvbW1hbmQoKSk7XG4gICAgLy8gfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktdmlkZW9cIikge1xuICAgICAgICBjb25zdCBkdG8gPSB0aGlzLnJlc291cmNlUHJvdmlkZXIuZ2V0VmlkZW9CeUlkKGl0ZW0udmlkZW9JZCk7XG4gICAgICAgIGlmIChkdG8pIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5raW5kID09PSBcImF1dG9wbGF5LWF1ZGlvXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2coaXRlbSk7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRBdWRpb0J5SWQoaXRlbS5hdWRpb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy5hdWRpb0NvbnRhaW5lci5zZXRBdWRpbyhkdG8pO1xuICAgICAgICBhd2FpdCB0aGlzLmF1ZGlvQ29udGFpbmVyLnBsYXlUb0VuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXEuZW5kQ29tbWFuZHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRGYWxzZUNvbW1hbmQpO1xuICAgIC8vIHRoaXMuYWN0aW9uU2VydmljZS5lbWl0KERTdGF0ZVByb3BzLmlucHV0QmxvY2tpbmdCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIEVOREVEXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc2V0UGFnZSgpXG5cbiAgcHJpdmF0ZSB0aWNrKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmlkZW8xLmdldFN0YXRzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQgfSBmcm9tIFwiLi9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kU3RvcmUge1xuICBzdWJzY3JpYmUoY2FsbGJhY2s6ICgpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRTdWJzY3JpYmVyRGF0YSB7XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBjYWxsYmFjazogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIERDb21tYW5kQnVzIGltcGxlbWVudHMgRENvbW1hbmRTdG9yZSwgRENvbW1hbmREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgQ09NTUFORF9CVVMgXSBcIjtcbiAgbG9nQ29tbWFuZHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kTG9nOiBBcnJheTxEQ29tbWFuZCAmIHsgdGltZXN0YW1wOiBEVGltZXN0YW1wIH0+ID0gW107XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDxDb21tYW5kU3Vic2NyaWJlckRhdGE+KCk7XG4gIC8vIHJlYWRvbmx5IHN1YlxuXG4gIHN1YnNjcmliZShjYjogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHN1YjogQ29tbWFuZFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgIH07XG5cbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWIpO1xuICAgIH07XG4gIH1cblxuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICB0aGlzLmNvbW1hbmRMb2cucHVzaCh7IC4uLmNvbW1hbmQsIHRpbWVzdGFtcCB9KTtcbiAgICBpZiAodGhpcy5sb2dDb21tYW5kcykge1xuICAgICAgdGhpcy5sb2dDb21tYW5kKGNvbW1hbmQpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHN1YnNjcmliZXIuY2FsbGJhY2soY29tbWFuZCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IFsuLi50aGlzLmNvbW1hbmRMb2ddLFxuICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgIHN1YnNjcmliZXJzQ291bnQ6IHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiIFwiICsgY29tbWFuZC5raW5kKTtcbiAgICBjb25zb2xlLmxvZyhcIlRhcmdldElEIDogXCIgKyBjb21tYW5kLnRhcmdldElkKTtcbiAgICBjb25zb2xlLmxvZyhjb21tYW5kLnBheWxvYWQpO1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuL0RFdmVudHNcIjtcblxuaW50ZXJmYWNlIFN1YnNjcmliZXJEYXRhIHtcbiAgICByZWFkb25seSBzdWJzY3JpYmVySWQ6IHN0cmluZztcbiAgICByZWFkb25seSBjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50U3RvcmUge1xuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnREaXNwYXRjaGVyIHtcbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIEV2ZW50QnVzIGltcGxlbWVudHMgREV2ZW50U3RvcmUsIERFdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbICBFVkVOVF9CVVMgIF0gOlwiO1xuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChldmVudDogREV2ZW50KSA9PiB2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PFN1YnNjcmliZXJEYXRhPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBvbiBtb2R1bGUgZW5kLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudExvZzogREV2ZW50W10gPSBbXTtcbiAgICBjb25zb2xlTG9nRXZlbnRzID0gZmFsc2U7XG4gICAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgICBzdWJzY3JpYmUoY2I6IChldmVudDogREV2ZW50KSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmFkZChjYik7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJEYXRhOiBTdWJzY3JpYmVyRGF0YSA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJJZCxcbiAgICAgICAgICAgIGNiLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gYWRkZWQ6IFwiICsgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQ6IFwiICsgdGhpcy5zdWJzY3JpYmVycy5zaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gcmVtb3ZlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQgIDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoY2IpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlckRhdGEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgICAgICAgICAgZXZlbnRMb2c6IFsuLi50aGlzLmV2ZW50TG9nXSxcbiAgICAgICAgICAgIHN1YnNjcmliZXJzOiBbLi4udGhpcy5zdWJzY3JpYmVyc10sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZW1pdChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRMb2cucHVzaChldmVudCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NBTExJTkcgRU1JVCcpO1xuICAgICAgICAgICAgZGF0YS5jYihldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGlzLmxvZ0V2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnQoZXZlbnQ6IERFdmVudCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBldmVudC5raW5kKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJQcm9kdWNlcklkOiBcIiArIGV2ZW50LnByb2R1Y2VySWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudC5kYXRhKTtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnRzKCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwKHRoaXMuVEFHICsgXCJMT0dHXCIpO1xuICAgICAgICBjb25zb2xlLnRhYmxlKHRoaXMuZXZlbnRMb2cpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIHJlYWRvbmx5IHRpbWVzdGFtcDogRFRpbWVzdGFtcDtcbiAgICByZWFkb25seSBmYWN0OiBGYWN0O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIGV4cG9ydCBjb25zdCBlcSA9IChhOiBBbnN3ZXJlZFF1ZXN0aW9uLCBiOiBBbnN3ZXJlZFF1ZXN0aW9uKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBhLmZhY3QgPT09IGIuZmFjdDtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VIaXN0b3J5IHtcbiAgICByZWFkb25seSBwYWdlSWQ6IHN0cmluZztcbiAgICByZWFkb25seSBhbnN3ZXJlZFF1ZXN0aW9uczogQW5zd2VyZWRRdWVzdGlvbltdO1xufVxuXG5leHBvcnQgY2xhc3MgSGlzdG9yeVF1ZSB7XG4gICAgcHJpdmF0ZSBoaXN0b3J5OiBQYWdlSGlzdG9yeVtdID0gW107XG5cbiAgICBnZXRGYWN0cygpOiBBcnJheTxGYWN0PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICBjb25zdCBmYWN0cyA9IGFuc3dlcnMubWFwKChhKSA9PiBhLmZhY3QpO1xuICAgICAgICAvLyBUT0RPIEZJTkQgTEFURVNUIEZBQ1QgKGFuc3dlcikgaWYgaGF2ZSBtdWx0aXBsZS5cbiAgICAgICAgcmV0dXJuIGZhY3RzO1xuICAgIH1cblxuICAgIGdldEFuc3dlcnMoKTogQXJyYXk8QW5zd2VyZWRRdWVzdGlvbj4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJzID0gdGhpcy5oaXN0b3J5Lm1hcCgoaCkgPT4gaC5hbnN3ZXJlZFF1ZXN0aW9ucykuZmxhdCgxKTtcbiAgICAgICAgcmV0dXJuIGFuc3dlcnM7XG4gICAgfVxuXG4gICAgYWRkVG9IaXN0b3J5KHBhZ2U6IFBhZ2VIaXN0b3J5KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHBhZ2UpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCB0eXBlIENvbmRpdGlvbiA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYyB8IENvbmRpdGlvbi5Db21wbGV4O1xuXG5leHBvcnQgbmFtZXNwYWNlIENvbmRpdGlvbiB7XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nT3BlcmF0b3IgPSBcImVxXCIgfCBcIm5vdC1lcVwiIHwgXCJsb25nZXItdGhlblwiIHwgXCJzaG9ydGVyLXRoZW5cIjtcblxuICAgIGV4cG9ydCB0eXBlIE51bWVyaWNPcGVyYXRvciA9XG4gICAgICAgIHwgXCJlcVwiXG4gICAgICAgIHwgXCJub3QtZXFcIlxuICAgICAgICB8IFwiZ3JlYXRlci10aGVuXCJcbiAgICAgICAgfCBcImxlc3MtdGhlblwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCJcbiAgICAgICAgfCBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTnVtZXJpYyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJudW1lcmljLWNvbmRpdGlvblwiO1xuICAgICAgICByZWFkb25seSBvcGVyYXRvcjogTnVtZXJpY09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0cmluZyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzdHJpbmctY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBTdHJpbmdPcGVyYXRvcjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbXBsZXgge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImNvbXBsZXgtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgICAgICByZWFkb25seSBzb21lOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIFNpbXBsZSA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYztcblxuICAgIC8qKlxuICAgICAqIEFuIGVtcHR5IGNvbmRpdGlvbiB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlLFxuICAgICAqIEBwYXJhbSBjb25kaXRpb246IENvbmRpdGlvbi5BbnlcbiAgICAgKiBAcGFyYW0gZmFjdHNcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgZXZhbHVhdGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbXBsZXgtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVDb21wbGV4KGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBjb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVDb21wbGV4ID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLkNvbXBsZXgsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChjb25kaXRpb24uc29tZS5sZW5ndGggPT09IDAgJiYgY29uZGl0aW9uLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxTb2x2ZWQgPSBjb25kaXRpb24uYWxsLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvbWVFdmFsdWF0ZWQgPSBjb25kaXRpb24uc29tZS5tYXAoKGNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYWxsUmVzdWx0ID0gYWxsU29sdmVkLmV2ZXJ5KERVdGlsLmlzVHJ1ZSk7XG4gICAgICAgIGNvbnN0IHNvbWVSZXN1bHQgPSBzb21lRXZhbHVhdGVkLmxlbmd0aCA9PT0gMCB8fCBzb21lRXZhbHVhdGVkLnNvbWUoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgcmV0dXJuIHNvbWVSZXN1bHQgJiYgYWxsUmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbi5TaW1wbGUsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3QgPSBmYWN0cy5maW5kKChmKSA9PiBmLnJlZmVyZW5jZUlkID09PSBjb25kaXRpb24ucmVmZXJlbmNlSWQpO1xuICAgICAgICBpZiAoIWZhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwibnVtZXJpYy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVOdW1lcmljKGNvbmRpdGlvbiwgZmFjdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmFjdC5raW5kID09PSBcInN0cmluZy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVTdHJpbmcoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNFbXB0eSA9IChjb21wbGV4OiBDb21wbGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wbGV4LmFsbC5sZW5ndGggPT09IDAgJiYgY29tcGxleC5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVTdHJpbmcgPSAoY29uZGl0aW9uOiBSZWFkb25seTxDb25kaXRpb24uU3RyaW5nPiwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgPT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2hvcnRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsb25nZXItdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlTnVtZXJpYyA9IChjb25kaXRpb246IE51bWVyaWMsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3Qgb3AgPSBjb25kaXRpb24ub3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlID09PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub3QtZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSAhPT0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ3JlYXRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPiBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPj0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGVzcy10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPCBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPD0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IF9nZXRBbGxTaW1wbGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24pOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0+IHtcbiAgICAgICAgY29uc3Qgc2ltcGxlOiBBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9IFtdO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uYWxsKTtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uc29tZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtZXJpYy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGdldEFsbFNpbXBsZUNvbmRpdGlvbnMgPSAoXG4gICAgICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uIHwgQXJyYXk8Q29uZGl0aW9uPlxuICAgICk6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLl9nZXRBbGxTaW1wbGUoY29uZGl0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuL2ZhY3RcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZTxPblN1Y2Nlc3NBY3Rpb24sIE9uRmFpbHVyZUFjdGlvbj4ge1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbj47XG4gIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PE9uU3VjY2Vzc0FjdGlvbj47XG4gIHJlYWRvbmx5IG9uRmFpbHVyZTogUmVhZG9ubHlBcnJheTxPbkZhaWx1cmVBY3Rpb24+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bGUge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHJ1bGUgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSBydWxlXG4gICAqL1xuXG4gIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKHJ1bGU6IFJ1bGU8YW55LCBhbnk+KTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgZW1wdHlDb25kaXRpb25zID0gcnVsZS5hbGwubGVuZ3RoID09PSAwICYmIHJ1bGUuc29tZS5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgZW1wdHlBY3Rpb25zID0gcnVsZS5vblN1Y2Nlc3MubGVuZ3RoID09PSAwICYmIHJ1bGUub25GYWlsdXJlLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gZW1wdHlDb25kaXRpb25zIHx8IGVtcHR5QWN0aW9ucztcbiAgfTtcblxuICBleHBvcnQgY29uc3Qgc29sdmUgPSAocnVsZTogUnVsZTxhbnksIGFueT4sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHJ1bGUuc29tZS5sZW5ndGggPT09IDAgJiYgcnVsZS5hbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUT0RPIFJFVFVSTiBXQVJOSU5HPyBPUiBMT0dHSU5HID9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb21lU29sdmVkID0gcnVsZS5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCBmYWN0cykpO1xuXG4gICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVTb2x2ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVTb2x2ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuXG4gICAgY29uc3QgYWxsU29sdmVkID0gcnVsZS5hbGwubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSkuZXZlcnkoRFV0aWwuaXNUcnVlKTtcblxuICAgIHJldHVybiBhbGxTb2x2ZWQgJiYgc29tZVJlc3VsdDtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gXCIuL3J1bGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gIG1hdGNoaW5nOiBSZWFkb25seUFycmF5PE1hdGNoPFMsIEY+PjtcbiAgZXJyb3JzOiBSZWFkb25seUFycmF5PFJ1bGVFbmdpbmVFcnJvcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2g8UywgRj4ge1xuICByZWFkb25seSBtYXRjaGluZ1J1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBydWxlRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWN0aW9uTGlzdDogUmVhZG9ubHlBcnJheTxTPiB8IFJlYWRvbmx5QXJyYXk8Rj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkga2luZD86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUnVsZUVuZ2luZTxTLCBGPiB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb2x2ZUFsbChydWxlczogUnVsZTxTLCBGPltdLCBmYWN0czogRmFjdFtdKTogU29sdmVSZXN1bHQ8UywgRj4ge1xuICAgIGNvbnN0IGVycm9yczogUnVsZUVuZ2luZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCBtYXRjaGluZzogTWF0Y2g8UywgRj5bXSA9IFtdO1xuICAgIHJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgIGlmIChSdWxlLmlzRW1wdHkocnVsZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcIkVtcHR5IHJ1bGU6IFwiICsgcnVsZS5pZCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoUnVsZS5zb2x2ZShydWxlLCBmYWN0cykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2g6IE1hdGNoPFMsIEY+ID0ge1xuICAgICAgICAgIHJ1bGVEZXNjcmlwdGlvbjogcnVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBtYXRjaGluZ1J1bGVJZDogcnVsZS5pZCA/PyBcIm5vLWlkLWdpdmVuXCIsXG4gICAgICAgICAgYWN0aW9uTGlzdDogWy4uLnJ1bGUub25TdWNjZXNzXSxcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hpbmcucHVzaChtYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbWF0Y2hpbmcsIGVycm9ycyB9O1xuICB9XG5cbiAgc29sdmUocnVsZTogUnVsZTxTLCBGPiwgZmFjdHM6IEZhY3RbXSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gVmFsaWRhdGUsIGFuZCBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIFJ1bGUuc29sdmUocnVsZSwgZmFjdHMpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBOZXh0UXVlIHtcbiAgICBwcml2YXRlIG9yaWdpbmFsT3JkZXI6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgYWxsUGFnZXM6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIHByaXZhdGUgZXhjbHVkZWRUYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBleGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSByZW1haW5pbmc6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHBhZ2VzOiBQYWdlRHRvW10gPSBbXSkge1xuICAgICAgICB0aGlzLnJlc2V0UXVlKHBhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHJlc2V0IHF1ZSB3aXRoIHRoZSBuZXcgcGFnZXMuXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgcmVzZXRRdWUocGFnZXM6IFBhZ2VEdG9bXSkge1xuICAgICAgICB0aGlzLmFsbFBhZ2VzID0gWy4uLnBhZ2VzXTtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsT3JkZXIgPSB0aGlzLmFsbFBhZ2VzLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgfVxuXG4gICAgcG9wKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZy5zaGlmdCgpO1xuICAgICAgICAvLyBUT0RPIENMT05FPz9cbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcGVlaygpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5yZW1haW5pbmdbMF07XG4gICAgICAgIHJldHVybiBuZXh0ID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGp1bXBUb1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZW1haW5pbmcuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwYWdlSWQpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5zbGljZShpbmRleCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5VGFnKHRhZzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnKSkge1xuICAgICAgICAgICAgdGFnLmZvckVhY2goKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncy5hZGQodGFnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgbm90IGJlIGluY2x1ZGVkXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgaW5zZXJ0QXNOZXh0QnlGb3JjZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nLnVuc2hpZnQoLi4ucGFnZXMpO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5UGFnZUlkKHBhZ2VJZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFnZUlkKSkge1xuICAgICAgICAgICAgcGFnZUlkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgICAgICAvLyB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKHBhZ2VJZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJSZW1haW5pbmcoKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nID0gdGhpcy5yZW1haW5pbmcuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0gcC50YWdzID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWVkZWRCeVRhZyA9ICF0YWdzLnNvbWUoKHRhZykgPT4gdGhpcy5leGNsdWRlZFRhZ3MuaGFzKHRhZykpO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWRlZEJ5UGFnZUlkID0gIXRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5oYXMocC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gaXNJbmNsdWRlZEJ5UGFnZUlkICYmIGlzSW5jbHVlZGVkQnlUYWc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9yZGVyLmxlbmd0aDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQW5zd2VyZWRRdWVzdGlvbiwgSGlzdG9yeVF1ZSwgUGFnZUhpc3RvcnkgfSBmcm9tIFwiLi9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgUnVsZUVuZ2luZSB9IGZyb20gXCIuLi9ydWxlcy9ydWxlLWVuZ2luZVwiO1xuaW1wb3J0IHsgTmV4dFF1ZSB9IGZyb20gXCIuL25leHQtcXVlXCI7XG5pbXBvcnQgeyBQYWdlRHRvLCBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgdHlwZSBEUGxheWVyRGF0YSA9IFBpY2s8U2NoZW1hRHRvLCBcInBhZ2VzXCIgfCBcInBhZ2VTZXF1ZW5jZXNcIiB8IFwicnVsZXNcIj47XG5leHBvcnQgY2xhc3MgRFBsYXllciB7XG4gIHByaXZhdGUgaGlzdG9yeSA9IG5ldyBIaXN0b3J5UXVlKCk7XG4gIHByaXZhdGUgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lPFBhZ2VRdWVDb21tYW5kLCBQYWdlUXVlQ29tbWFuZD4oKTtcbiAgcHJpdmF0ZSBuZXh0UXVlID0gbmV3IE5leHRRdWUoKTtcbiAgcHJpdmF0ZSBkYXRhOiBEUGxheWVyRGF0YTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEUGxheWVyRGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5uZXh0UXVlLnJlc2V0UXVlKGRhdGEucGFnZXMpO1xuICB9XG5cbiAgc2F2ZUhpc3RvcnkocGFnZUhpc3Rvcnk6IFBhZ2VIaXN0b3J5KSB7XG4gICAgY29uc29sZS5sb2coXCJTQVZFIEhJU1RPUllcIiwgcGFnZUhpc3RvcnkpO1xuICAgIHRoaXMuaGlzdG9yeS5hZGRUb0hpc3RvcnkocGFnZUhpc3RvcnkpO1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5oaXN0b3J5LmdldEZhY3RzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ydWxlRW5naW5lLnNvbHZlQWxsKHRoaXMuZGF0YS5ydWxlcywgZmFjdHMpO1xuICAgIGNvbnN0IG1hdGNoaW5nUnVsZXMgPSByZXN1bHQubWF0Y2hpbmc7XG4gICAgY29uc3QgYWN0aW9ucyA9IG1hdGNoaW5nUnVsZXMubWFwKChyKSA9PiByLmFjdGlvbkxpc3QpLmZsYXQoMSk7XG4gICAgYWN0aW9ucy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhhLnBheWxvYWQpO1xuICAgICAgc3dpdGNoIChhLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKGEucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUucmVtb3ZlQnlQYWdlSWQoYS5wYXlsb2FkLnBhZ2VJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVRhZyhhLnBheWxvYWQudGFnSWRzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlVOS05PV04gQUNUSU9OXCIsIGEpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coYWN0aW9ucyk7XG4gIH1cblxuICBnZXRSZXN1bHRzKCk6IEFuc3dlcmVkUXVlc3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZXRBbnN3ZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGdvVG9QYWdlQnlJZChwYWdlSWQ6IHN0cmluZykge1xuICAgIHRoaXMubmV4dFF1ZS5qdW1wVG9QYWdlQnlJZChwYWdlSWQpO1xuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGlvbkNvbW1hbmQoY29tbWFuZDogTmF2aWdhdGlvbkNvbW1hbmQpIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX05FWFRfUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIC8vIE5PIE5FRUQgVE8gRE8gQU5ZVEhJTkdcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VCeUlkKGNvbW1hbmQucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuaW5zZXJ0U2VxdWVuY2VCeUlkKGNvbW1hbmQucGF5bG9hZC5zZXF1ZW5jZUlkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dFBhZ2UoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAvLyBUT0RPIEhBTkRMRSBSVUxFUyEhXG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0U2VxdWVuY2VCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXEgPSB0aGlzLmRhdGEucGFnZVNlcXVlbmNlcz8uZmluZCgocykgPT4gcy5pZCA9PT0gaWQpO1xuICAgIGlmIChzZXEpIHtcbiAgICAgIHRoaXMubmV4dFF1ZS5pbnNlcnRBc05leHRCeUZvcmNlKFsuLi5zZXEucGFnZXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSE9XIFRPIEhBTkRMRSBJTlZBTElEIElEX1JFRlM/PyBMT0dHRVI/P1xuICAgICAgLy8gTE9HIElOVkFMSUQgQ09NTUFORC5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHBhZ2VzLlxuICAgKi9cbiAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5leHRRdWUucGFnZUNvdW50O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudEhhbmRsZXI8RSBleHRlbmRzIERFdmVudCA9IERFdmVudD4ge1xuICAgIHJlYWRvbmx5IG9uRXZlbnQ6IEVbXCJraW5kXCJdO1xuICAgIHJlYWRvbmx5IHdoZW4/OiB7IHByb2R1Y2VySWQ/OiBzdHJpbmc7IGNvbmRpdGlvbj86IENvbmRpdGlvbiB9O1xuICAgIHJlYWRvbmx5IHRoZW5FeGVjdXRlOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNoYW5nZWRIYW5kbGVyIHtcbiAgICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSB3aGVuVHJ1ZTogUmVhZG9ubHlBcnJheTxFbGVtZW50Q29tbWFuZD47XG4gICAgcmVhZG9ubHkgd2hlbkZhbHNlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBERXZlbnRIYW5kbGVyIHtcbiAgICBleHBvcnQgdHlwZSBMb29rVXAgPSBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PjtcbiAgICBleHBvcnQgY29uc3QgY3JlYXRlTG9va1VwID0gKGhhbmRsZXJzPzogUmVhZG9ubHlBcnJheTxERXZlbnRIYW5kbGVyPik6IExvb2tVcCA9PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PigpO1xuICAgICAgICBoYW5kbGVycz8uZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2luZCA9IGgub25FdmVudDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBtYXAuZ2V0KGtpbmQpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGN1cnJlbnQgPyBbLi4uY3VycmVudCwgaF0gOiBbaF07XG4gICAgICAgICAgICBtYXAuc2V0KGtpbmQsIGFjdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERTdHlsZSB9IGZyb20gXCIuL0RTdHlsZVwiO1xuaW1wb3J0IHsgREVsZW1lbnRCYXNlRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kLCBFbGVtZW50Q29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERFdmVudEhhbmRsZXIgfSBmcm9tIFwiLi4vZXZlbnQtaGFuZGxlcnMvREV2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IEFuaW1hdGlvbkR0byB9IGZyb20gXCIuLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi4vc3RhdGUvRHN0YXRlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBERWxlbWVudDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWw6IFQ7XG4gICAgcHJpdmF0ZSBjbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgY3VyclN0eWxlOiBQYXJ0aWFsPERTdHlsZT4gPSB7XG4gICAgICAgIGZvbnRTaXplOiB7IF91bml0OiBcInB4XCIsIHZhbHVlOiAxMDAgfSxcbiAgICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgICAgICB0ZXh0Q29sb3I6IFwiYmxhY2tcIixcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICB9O1xuXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBvblF1ZXJ5Q2hhbmdlZEhhbmRsZXJzID1cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IERFdmVudEhhbmRsZXIuTG9va1VwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzO1xuICAgIHByb3RlY3RlZCBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZUR0bzogREVsZW1lbnRCYXNlRHRvO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbDogVCxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgZHRvOiBERWxlbWVudEJhc2VEdG8sXG4gICAgICAgIHNjYWxlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLmlkID0gZHRvLmlkO1xuICAgICAgICB0aGlzLmJhc2VEdG8gPSBkdG87XG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gREV2ZW50SGFuZGxlci5jcmVhdGVMb29rVXAoZHRvLmV2ZW50SGFuZGxlcnMpO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIC8vIENMSUNLXG4gICAgICAgIHRoaXMub25DbGlja0hhbmRsZXIgPSB0aGlzLm9uQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGlja0hhbmRsZXI7XG5cbiAgICAgICAgLy8gSE9WRVJcbiAgICAgICAgdGhpcy5vbk1vdXNlT3ZlciA9IHRoaXMub25Nb3VzZU92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbm1vdXNlb3ZlciA9IHRoaXMub25Nb3VzZU92ZXI7XG5cbiAgICAgICAgaWYgKGR0bykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoZHRvPy5zdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9TVFlMRV9DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoYy5wYXlsb2FkLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0RJU0FCTEVfQ0xJQ0tfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0VOQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUT0RPIElNUExFTUVOVCBBTklNQVRJT05fSEFORExFUiBJTiBERWxlbWVudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaWQpO1xuICAgICAgICAvLyBUT0RPIE1FTU9SWSBMRUFLXG4gICAgICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuZXZlbnRIYW5kbGVycy5nZXQoZXZlbnQua2luZCkgPz8gW107XG4gICAgICAgICAgICAvLyBUT0RPIEFwcGx5IENvbmRpdGlvbnMgaW4gV0hFTi5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gaGFuZGxlcnMubWFwKChoKSA9PiBoLnRoZW5FeGVjdXRlKS5mbGF0KDEpO1xuICAgICAgICAgICAgY29tbWFuZHMuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZG9BY3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiSE9TVF9TQ0FMRV9DSEFOR0VEX0VWRU5UXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhBTkRMRSBUSElTIFNDQUxFIENIQU5HRSEhXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlDaGFuZ2VkSGFuZGxlcihldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXCJFTEVNRU5UOiBcIik7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY29tbWFuZFN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZXZlbnRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGRlc3Ryb3koKTogdm9pZDtcblxuICAgIC8vIGFic3RyYWN0IHNldFNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkO1xuXG4gICAgLy8gLyoqXG4gICAgLy8gICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1lbWl0IGNvbW1hbmRzIGZyb20gZXZlbnQtaGFuZGxlcnM/XG4gICAgLy8gICogQHBhcmFtIGNvbW1hbmRcbiAgICAvLyAgKiBAcHJpdmF0ZVxuICAgIC8vICAqL1xuICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZHNFbWl0dGVkQnlQcml2YXRlRXZlbnRIYW5kbGVycyhjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAvLyAgICAgc3dpdGNoIChjb21tYW5kLmtpbmQpIHtcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICBpZiAoY29tbWFuZC50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfQU5JTUFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgLy8gVE9ETyBDSEVDSyBGT1IgVEFSR0VUIElEXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVBbmltYXRlU2VsZkFjdGlvbihjb21tYW5kLnBheWxvYWQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTdHlsZXMoY29tbWFuZC5wYXlsb2FkLmNoYW5nZXMpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUExBWV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUEFVU0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVOR0lORV9MRUFWRV9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19KVU1QX1RPX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiQVVESU9fU0VUX1ZPTFVNRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9KVU1QX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfVEFHX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgZGVmYXVsdDpcbiAgICAvLyAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbW1hbmQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBxdWVyeUNoYW5nZWRIYW5kbGVyKHJlc3VsdDogRFN0YXRlLlN0YXRlUXVlcnlSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbWF5YmVIYW5kbGVycyA9IHRoaXMuYmFzZUR0by5vblN0YXRlQ2hhbmdlO1xuICAgICAgICBpZiAoIW1heWJlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeUhhbmRsZXJzID0gbWF5YmVIYW5kbGVycy5maWx0ZXIoKGgpID0+IGgucXVlcnlOYW1lID09PSByZXN1bHQucXVlcnlOYW1lKTtcbiAgICAgICAgcXVlcnlIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmN1cnIpIHtcbiAgICAgICAgICAgICAgICBoLndoZW5UcnVlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGgud2hlbkZhbHNlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhmaW5kQnlRdWVyeSwgdmFsdWUpO1xuICAgICAgICAvLyBjb25zdCBhbGwgPSB0aGlzLmJhc2VEdG8uc3RhdGVRdWVyeUNoYW5nZSA/PyBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2tIYW5kbGVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coKTtcbiAgICAgICAgaWYgKCF0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5pZCArIFwiQ2xpY2sgZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xpY2tBY3Rpb24gPSB0aGlzLmJhc2VEdG8ub25DbGljaztcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJOQVRJVkUgQ0xJQ0sgRUxFTUVOVDogSGFuZGxlcnMgXCIgKyBjbGlja0FjdGlvbj8ubGVuZ3RoKTtcbiAgICAgICAgaWYgKGNsaWNrQWN0aW9uICYmIGNsaWNrQWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEFSR0VUSUQ6IFwiICsgY2xpY2tBY3Rpb25bMF0udGFyZ2V0SWQgKyBcIiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlVTRVJfQ0xJQ0tFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRVc2VyXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVsZW1lbnRJZDogdGhpcy5pZCB9LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xpY2tBY3Rpb24uZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTW91c2VPdmVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZXYpO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoc3R5bGUpO1xuICAgIH1cblxuICAgIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZCh0aGlzLmVsKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocGFyZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGR0bzogQW5pbWF0aW9uRHRvKSB7XG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyBrZXlmcmFtZXMsIG9wdGlvbnMgfSA9IGR0bztcblxuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmVsLmFuaW1hdGUoa2V5ZnJhbWVzLCBvcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKGU6IEFuaW1hdGlvblBsYXliYWNrRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25yZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gUkVNT1ZFRDogXCIgKyBhbmltYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgYW5pbWF0aW9uLm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQU5JTUFUSU9OIENBTkNFTEVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplKCkge1xuICAgICAgICBEU3R5bGUubm9ybWFsaXplKHRoaXMuZWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVTdHlsZXMoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLmN1cnJTdHlsZSA9IE9iamVjdC5hc3NpZ24odGhpcy5jdXJyU3R5bGUsIHN0eWxlKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuY3VyclN0eWxlLCB0aGlzLnNjYWxlLnNjYWxlKTtcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IEREaXZEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi9EVGV4dFwiO1xuaW1wb3J0IHsgREltZyB9IGZyb20gXCIuL0RJbWdcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBERGl2IGV4dGVuZHMgREVsZW1lbnQ8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBERGl2IF06IFwiO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U3R5bGUgPSB7IHg6IDIyLCB5OiA0IH07XG4gICAgcHJpdmF0ZSBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGR0bzogRERpdkR0byxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgICAgICAgY2hpbGRyZW46IEFycmF5PERUZXh0IHwgREltZz5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHN1cGVyKGQsIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmFwcGVuZFlvdXJzZWxmKHRoaXMuZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBESW1nRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBjbGFzcyBESW1nIGV4dGVuZHMgREVsZW1lbnQ8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHByaXZhdGUgc3RhdGljIElNQUdFX0NPVU5UID0gMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltYWdlQ291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBUQUc6IHN0cmluZztcbiAgICByZWFkb25seSBUSU1JTkdfVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkU3RhcnQ6IERUaW1lc3RhbXA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkdG86IERJbWdEdG8sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgICAgIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSwgZXZlbnRCdXMsIGFjdGlvblN1YmplY3QsIGR0bywgc2NhbGVTZXJ2aWNlKTtcbiAgICAgICAgREltZy5JTUFHRV9DT1VOVCArPSAxO1xuICAgICAgICB0aGlzLmltYWdlQ291bnQgPSBESW1nLklNQUdFX0NPVU5UO1xuICAgICAgICB0aGlzLlRBRyA9IFwiW0RfSU1HIFwiICsgREltZy5JTUFHRV9DT1VOVCArIFwiIF06IFwiO1xuICAgICAgICB0aGlzLlRJTUlOR19UQUcgPSBcImxvYWQtdGltZSAoXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIpIFwiO1xuICAgICAgICB0aGlzLmVsLmxvYWRpbmcgPSBcImVhZ2VyXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICAvLyBCaW5kIEhhbmRsZXJzXG4gICAgICAgIHRoaXMub25FcnJvciA9IHRoaXMub25FcnJvci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIC8vIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLmVsLm9uZXJyb3IgPSB0aGlzLm9uRXJyb3I7XG4gICAgICAgIC8vIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGljaztcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICBjb25zb2xlLnRpbWUodGhpcy5USU1JTkdfVEFHKTtcbiAgICB9XG5cbiAgICBsb2coKTogdm9pZCB7fVxuXG4gICAgc2V0U2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhzY2FsZSk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FcnJvcihldjogRXZlbnQgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGV2IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgXCIgKyBldi50eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbG9hZFRpbWUgPSBEVGltZXN0YW1wLmRpZmZOb3codGhpcy5sb2FkU3RhcnQpO1xuXG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIklNQUdFX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREltYWdlXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGxvYWRUaW1lLFxuICAgICAgICAgICAgICAgIG5hdHVyYWxIZWlnaHQ6IHRoaXMuZWwubmF0dXJhbEhlaWdodCxcbiAgICAgICAgICAgICAgICBuYXR1cmFsV2lkdGg6IHRoaXMuZWwubmF0dXJhbFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5lbC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuZWwud2lkdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRFRleHREdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERUZXh0IGV4dGVuZHMgREVsZW1lbnQ8SFRNTFBhcmFncmFwaEVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFyYWdyYXBoIF06IFwiO1xuICAgIHByb3RlY3RlZCBkZWZhdWx0U3R5bGUgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKGR0bzogRFRleHREdG8sIGV2ZW50QnVzOiBFdmVudEJ1cywgYWN0aW9uU2VydmljZTogRENvbW1hbmRCdXMsIHNjYWxlOiBTY2FsZVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIiksIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5pbm5lclRleHQgPSBcIlwiICsgZHRvLnRleHQ7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICB9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZWwuc3R5bGUuZm9udFNpemU7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzY2FsZTogXCIgKyBzY2FsZSArIFwiIEZvbnRzaXplOiBcIiArIGZvbnRTaXplKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuLi9EZWxlbWVudC9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdiB9IGZyb20gXCIuLi9EZWxlbWVudC9EZGl2XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RJbWdcIjtcbmltcG9ydCB7IERUZXh0IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RUZXh0XCI7XG5pbXBvcnQgeyBERGl2RHRvLCBERWxlbWVudER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURFbGVtZW50ID0gKFxuICAgIGR0bzogREVsZW1lbnREdG8sXG4gICAgYWN0aW9uQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZVxuKTogREVsZW1lbnQ8YW55PiA9PiB7XG4gICAgc3dpdGNoIChkdG8uX3RhZykge1xuICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgICAgICBjb25zdCBjaGlsZEVscyA9IGNyZWF0ZUNoaWxkcmVuRm9yRGl2KGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGl2ID0gbmV3IEREaXYoZHRvLCBldmVudEJ1cywgYWN0aW9uQnVzLCBzY2FsZSwgY2hpbGRFbHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0RpdjtcbiAgICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBESW1nKGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGR0bztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZHRvIGdpdmVuIHRvIHRoZSBjcmVhdGVERWxlbWVudCBmdW5jdGlvbi5cIik7XG4gICAgICAgIC8vIFRPRE8gTE9HR0lORyBvciBjcmVhdGUgYW55IEhUTUwtRUxFTUVOVD8/XG4gICAgfVxufTtcblxuY29uc3QgY3JlYXRlQ2hpbGRyZW5Gb3JEaXYgPSAoXG4gICAgZHRvOiBERGl2RHRvLFxuICAgIGFjdGlvblN1YmplY3Q6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERGl2W1wiY2hpbGRyZW5cIl0gPT4ge1xuICAgIGNvbnN0IGNoaWxkRHRvID0gZHRvLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkRWxzOiBBcnJheTxESW1nIHwgRFRleHQ+ID0gW107XG4gICAgLy8gY29uc29sZS5sb2coY2hpbGRFbGVtZW50cyk7XG4gICAgY2hpbGREdG8uZm9yRWFjaCgoZHRvKSA9PiB7XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJwXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBuZXcgRFRleHQoZHRvLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHRvLl90YWcgPT09IFwiaW1nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gbmV3IERJbWcoZHRvLCBhY3Rpb25TdWJqZWN0LCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdJbWFnZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRFbHM7XG59O1xuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IGNyZWF0ZURFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERQYWdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRFBhZ2UgXTogXCI7XG4gIHByaXZhdGUgZWxlbWVudHM6IERFbGVtZW50PEhUTUxFbGVtZW50PltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAvLyBUb2RvIEdMT0JBTCBFVkVOVF9CVVNTIEFORCBQQUdFIEVWRU5UUzpcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogUGFnZUR0byxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMuZWxlbWVudHMgPSBkdG8uZWxlbWVudHMubWFwKChkdG8pID0+IGNyZWF0ZURFbGVtZW50KGR0bywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLmV2ZW50QnVzLCB0aGlzLnNjYWxlKSk7XG4gIH1cblxuICBhcHBlbmRZb3Vyc2VsZihwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBBUFBFTkRJTkcgVE8gUEFSRU5UXCIpO1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmFwcGVuZFlvdXJzZWxmKHBhcmVudCk7XG4gICAgICAvLyBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwuZWwpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgKCFwcmVsb2FkTW9kZSkge1xuICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICBraW5kOiBcIlBBR0VfRU5URVJfRVZFTlRcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHByb2R1Y2VyOiBcIkRQYWdlXCIsXG4gICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogeyBwYWdlSWQ6IHRoaXMuaWQgfSxcbiAgICB9KTtcbiAgICAvLyB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZygpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArICdzY2FsZSAtICcgKyB0aGlzLnNjYWxlKTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kdG8uaWQ7XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgU2NhbGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlSGVpZ2h0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VXaWR0aDtcbiAgcHJpdmF0ZSBjb250YWluZXJIZWlnaHQgPSAxMzAwO1xuICBwcml2YXRlIGNvbnRhaW5lcldpZHRoID0gMTMwMDtcblxuICBnZXQgc2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgZ2V0IHBhZ2VIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUhlaWdodCAqIHRoaXMuc2NhbGU7XG4gIH1cbiAgZ2V0IHBhZ2VXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlV2lkdGggKiB0aGlzLl9zY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjYWxlID0gMTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDwoc2NhbGU6IG51bWJlcikgPT4gdm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IHsgYmFzZUhlaWdodDogbnVtYmVyOyBiYXNlV2lkdGg6IG51bWJlcjsgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7IGNvbnRhaW5lcldpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuYmFzZUhlaWdodCA9IGNvbmZpZy5iYXNlSGVpZ2h0O1xuICAgIHRoaXMuYmFzZVdpZHRoID0gY29uZmlnLmJhc2VXaWR0aDtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IGNvbmZpZy5jb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy5jb250YWluZXJXaWR0aCA9IGNvbmZpZy5jb250YWluZXJXaWR0aDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cblxuICBzZXRDb250YWluZXJCb3VuZHMoYm91bmRzOiB7IGhlaWdodDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0pIHtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gYm91bmRzLndpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVTY2FsZSgpIHtcbiAgICBjb25zdCBzY2FsZUZuID0gU2NhbGUuY2FsYyh0aGlzLmJhc2VIZWlnaHQsIHRoaXMuYmFzZVdpZHRoKTtcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlRm4oeyBoZWlnaHQ6IHRoaXMuY29udGFpbmVySGVpZ2h0LCB3aWR0aDogdGhpcy5jb250YWluZXJXaWR0aCB9KTtcbiAgICBjb25zdCBoYXNDaGFuZ2VkID0gdGhpcy5zY2FsZSAhPT0gc2NhbGU7XG4gICAgdGhpcy5fc2NhbGUgPSBzY2FsZTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBmbih0aGlzLl9zY2FsZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZShzY2FsZUNoYW5nZUhhbmRsZXI6IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKHN1YnNjcmliZXJJZCk7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoc2NhbGVDaGFuZ2VIYW5kbGVyKTtcbiAgICBzY2FsZUNoYW5nZUhhbmRsZXIodGhpcy5fc2NhbGUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBuYW1lc3BhY2UgU2NhbGUge1xuICBleHBvcnQgY29uc3QgY2FsYyA9IChiYXNlSGVpZ2h0OiBudW1iZXIsIGJhc2VXaWR0aDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIChjb250YWluZXI6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjb250YWluZXIuaGVpZ2h0IC8gYmFzZUhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjb250YWluZXIud2lkdGggLyBiYXNlV2lkdGg7XG4gICAgICByZXR1cm4gTWF0aC5taW4oaGVpZ2h0UmF0aW8sIHdpZHRoUmF0aW8pO1xuICAgIH07XG4gIH07XG5cbiAgdHlwZSBTY2FsZVBvc0lucHV0ID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaDogbnVtYmVyOyB3OiBudW1iZXIgfTtcblxuICBleHBvcnQgY29uc3Qgc2NhbGVGdW5jdGlvbkNyZWF0b3IgPSAoc2NhbGU6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgKiBzY2FsZTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBEQXVkaW9EdG8sIERJbWdEdG8sIERWaWRlb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVByb3ZpZGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBSRVNPVVJDRV9QUk9WSURFUiBdOiBcIjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZGVvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERWaWRlb0R0bz4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERBdWRpb0R0bz4oKTtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiB7IHZpZGVvczogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+OyBhdWRpbzogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+IH0pIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlZJREVPX0NPVU5UIFwiICsgZGF0YS52aWRlb3MubGVuZ3RoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIkFVRElPX0NPVU5UIFwiICsgZGF0YS5hdWRpby5sZW5ndGgpO1xuICAgICAgICBkYXRhLnZpZGVvcy5mb3JFYWNoKCh2aWRlbykgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb01hcC5zZXQodmlkZW8uaWQsIHZpZGVvKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEuYXVkaW8uZm9yRWFjaCgoYXVkaW8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9NYXAuc2V0KGF1ZGlvLmlkLCBhdWRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEF1ZGlvQnlJZChpZDogc3RyaW5nKTogREF1ZGlvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZUF1ZGlvID0gdGhpcy5hdWRpb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlQXVkaW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIkF1ZGlvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZUF1ZGlvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldFZpZGVvQnlJZChpZDogc3RyaW5nKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZVZpZGVvID0gdGhpcy52aWRlb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlVmlkZW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIlZpZGVvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZVZpZGVvID8/IGZhbHNlO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgT2s8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSB2YWx1ZTogVCkge31cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmKHRoaXMudmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9rPEE+KHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGYWlsdXJlPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nKSB7fVxuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFwPEE+KF9mOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICByZXR1cm4gbmV3IEZhaWx1cmU8QT4odGhpcy5tZXNzYWdlKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJUmVzdWx0PFQ+IHtcbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD47XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPjtcbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+O1xufVxuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBGYWlsdXJlPFQ+IHwgT2s8VD47XG5leHBvcnQgbmFtZXNwYWNlIFJlc3VsdCB7XG4gICAgZXhwb3J0IGNvbnN0IG9rID0gPFQ+KHZhbHVlOiBUKSA9PiBuZXcgT2s8VD4odmFsdWUpO1xuICAgIGV4cG9ydCBjb25zdCBmYWlsdXJlID0gPFQ+KG1lc3NhZ2U6IHN0cmluZykgPT4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERTdGF0ZSB7XG4gICAgaW50ZXJmYWNlIFByb3BEZWZpbml0aW9uPFR5cGVOYW1lLCBUeXBlIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJlYWRvbmx5IF90eXBlOiBUeXBlTmFtZTtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcHJvcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGluaXRpYWxWYWx1ZT86IFR5cGU7XG4gICAgICAgIHJlYWRvbmx5IG9wdGlvbnM/OiBSZWFkb25seUFycmF5PFByb3BWYWx1ZTxUeXBlPj47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcIm51bWJlclwiLCBudW1iZXI+O1xuICAgIGV4cG9ydCB0eXBlIFN0cmluZ1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcInN0cmluZ1wiLCBzdHJpbmc+O1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBmcm9tRXZlbnRIYW5kbGVyIHtcbiAgICAgICAgcmVhZG9ubHkgb25FdmVudDogREV2ZW50W1wia2luZFwiXTtcbiAgICAgICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8U3RhdGVDb21tYW5kPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFByb3BWYWx1ZTxUPiB7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgICAgICByZWFkb25seSB2YWx1ZUxhYmVsOiBzdHJpbmc7XG4gICAgfVxuICAgIGV4cG9ydCB0eXBlIFByb3AgPSBOdW1lcmljUHJvcCB8IFN0cmluZ1Byb3A7XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFN0cmluZ011dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzZXQtc3RyaW5nXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiaW5jcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGVjcmVtZW50TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImRlY3JlbWVudC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgc3RlcFNpemU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgaWZOb3RFeGlzdFRoZW5TZXRUbzogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgTnVtYmVyTXV0YXRpb25zID0gSW5jcmVtZW50TnVtYmVyTXV0YXRpb24gfCBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IFNldE51bWJlck11dGF0aW9uO1xuXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVNdXRhdGlvbiA9IFNldFN0cmluZ011dGF0aW9uIHwgTnVtYmVyTXV0YXRpb25zO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyTXV0YXRpb24gPSAobXV0YXRpb25zOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb25zIGlzIE51bWJlck11dGF0aW9ucyA9PiB7XG4gICAgICAgIGlmICghbXV0YXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwic2V0LW51bWJlclwiIHx8XG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJkZWNyZW1lbnQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImluY3JlbWVudC1udW1iZXJcIlxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmdNdXRhdGlvbiA9IChtdXRhdGlvbjogU3RhdGVNdXRhdGlvbik6IG11dGF0aW9uIGlzIFNldFN0cmluZ011dGF0aW9uID0+IHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uICYmIG11dGF0aW9uLmtpbmQgPT09IFwic2V0LXN0cmluZ1wiO1xuICAgIH07XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0YXRlUXVlcnkge1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGNvbmRpdGlvbjogQ29uZGl0aW9uO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeVJlc3VsdCB7XG4gICAgICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcmV2OiBib29sZWFuO1xuICAgICAgICByZWFkb25seSBjdXJyOiBib29sZWFuO1xuICAgIH1cblxuICAgIGV4cG9ydCBjb25zdCBudW1lcmljUHJvcFRvRmFjdCA9IChwcm9wOiBOdW1lcmljUHJvcCwgdmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0Lk51bWVyaWMgPSB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogcHJvcC5wcm9wRGVzY3JpcHRpb24gPz8gXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHN0cmluZ1Byb3BUb0ZhY3QgPSAocHJvcDogU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0LlN0cmluZyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IFwiIFtTVEFURV9QUk9QRVJUWV0gOiBcIiArIHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBcIiBbVkFMVUVdIDogXCIgKyB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZhY3Q7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuLi9jb21tb24vcmVzdWx0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi9Ec3RhdGVcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgUXVlcnlDaGFuZ2VkRXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiIFsgU1RBVEVfU0VSVklDRSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c1N0cmluZyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0LlN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c051bWVyaWMgPSBuZXcgTWFwPHN0cmluZywgRmFjdC5OdW1lcmljPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BEZWZpbml0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEU3RhdGUuUHJvcD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcXVlcnk6IERTdGF0ZS5TdGF0ZVF1ZXJ5OyBsYXN0UmVzdWx0OiBib29sZWFuIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogREV2ZW50RGlzcGF0Y2hlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlMaXN0OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PiA9IFtdLFxuICApIHtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUHJvcGVydHkocHJvcCk7XG4gICAgfSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgcXVlcnlMaXN0LmZvckVhY2goKGRlZmluaXRpb24pID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJRdWVyeShkZWZpbml0aW9uLCBmYWN0cyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm11dGF0aW9uKGNvbW1hbmQucGF5bG9hZC5tdXRhdGlvbik7XG4gICAgICB9XG4gICAgfSwgdGhpcy5UQUcpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJRdWVyeShxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnksIGN1cnJlbnRGYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pikge1xuICAgIGNvbnN0IHJlc3VsdCA9IENvbmRpdGlvbi5ldmFsdWF0ZShxdWVyeS5jb25kaXRpb24sIGN1cnJlbnRGYWN0cyk7XG4gICAgdGhpcy5xdWVyaWVzLnNldChxdWVyeS5uYW1lLCB7IHF1ZXJ5OiBxdWVyeSwgbGFzdFJlc3VsdDogcmVzdWx0IH0pO1xuICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiBxdWVyeS5uYW1lLCBwcmV2OiByZXN1bHQsIGN1cnI6IHJlc3VsdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJQcm9wZXJ0eShwcm9wOiBEU3RhdGUuUHJvcCkge1xuICAgIGlmICh0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMocHJvcC5wcm9wTmFtZSkpIHtcbiAgICAgIC8vIExPR0dJTkdcbiAgICAgIGNvbnNvbGUud2FybihcIlByb3AgZXhjaXN0cyBhbHJlYWR5LlwiLCBwcm9wLnByb3BOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5zZXQocHJvcC5wcm9wTmFtZSwgcHJvcCk7XG5cbiAgICBpZiAocHJvcC5pbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wLl90eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLnN0cmluZ1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c1N0cmluZy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgfVxuICAgIGlmIChwcm9wLl90eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIHByb3AuaW5pdGlhbFZhbHVlKTtcbiAgICAgIHRoaXMuZmFjdHNOdW1lcmljLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZVN0cmluZyhwcm9wOiBEU3RhdGUuU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoY3Vycikge1xuICAgICAgY29uc3QgdXBkYXRlZDogRmFjdC5TdHJpbmcgPSB7IC4uLmN1cnIsIHZhbHVlIH07XG4gICAgICB0aGlzLnNldEZhY3QodXBkYXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICBraW5kOiBcInN0cmluZy1mYWN0XCIsXG4gICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICByZWZlcmVuY2VMYWJlbDogXCJsYWJlbCBmb3I6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGxhYmVsOiBcIlZhbHVlOiBcIiArIHZhbHVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2V0RmFjdChjcmVhdGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZU51bWJlcihwcm9wOiBEU3RhdGUuTnVtZXJpY1Byb3AsIG11dGF0aW9uOiBEU3RhdGUuTnVtYmVyTXV0YXRpb25zKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoIWN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24udmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImluY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBtdXRhdGlvbi52YWx1ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoeyAuLi5jdXJyLCB2YWx1ZTogY3Vyci52YWx1ZSAtIG11dGF0aW9uLnN0ZXBTaXplIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlICsgbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gbXV0YXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVF1ZXJpZXMoKTogUmVhZG9ubHlBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5nZXRBbGxGYWN0cygpO1xuICAgIGNvbnN0IGFsbDogQXJyYXk8eyBxdWVyeU5hbWU6IHN0cmluZzsgcHJldjogYm9vbGVhbjsgY3VycjogYm9vbGVhbjsgZGlkQ2hhbmdlOiBib29sZWFuIH0+ID0gW107XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHEpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBxLmxhc3RSZXN1bHQ7XG5cbiAgICAgIGNvbnN0IGN1cnIgPSBDb25kaXRpb24uZXZhbHVhdGUocS5xdWVyeS5jb25kaXRpb24sIGZhY3RzKTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHByZXYgIT09IGN1cnI7XG4gICAgICBxLmxhc3RSZXN1bHQgPSBjdXJyO1xuICAgICAgYWxsLnB1c2goeyBxdWVyeU5hbWU6IHEucXVlcnkubmFtZSwgcHJldiwgY3VyciwgZGlkQ2hhbmdlIH0pO1xuICAgICAgLy8gZGVmLnZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbDtcbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRpb24obXV0YXRpb246IERTdGF0ZS5TdGF0ZU11dGF0aW9uKTogeyBzdWNjZXNzOiBib29sZWFuIH0ge1xuICAgIGNvbnN0IHByb3BEZWYgPSB0aGlzLnByb3BEZWZpbml0aW9ucy5nZXQobXV0YXRpb24ucHJvcE5hbWUpO1xuICAgIGlmICghcHJvcERlZikge1xuICAgICAgLy8gVE9ETyBMT0dHSU5HXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcInN0cmluZ1wiICYmIERTdGF0ZS5pc1N0cmluZ011dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVTdHJpbmcocHJvcERlZiwgbXV0YXRpb24udmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcIm51bWJlclwiICYmIERTdGF0ZS5pc051bWJlck11dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVOdW1iZXIocHJvcERlZiwgbXV0YXRpb24pO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIGNvbnN0IGNoYW5nZWRSZXN1bHQgPSBxdWVyeVJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmRpZENoYW5nZSk7XG4gICAgY2hhbmdlZFJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiByZXMucXVlcnlOYW1lLCBwcmV2OiByZXMucHJldiwgY3VycjogcmVzLmN1cnIgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRRdWVyeUNoYW5nZWRFdmVudChkYXRhOiB7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBxdWVyeUNoYW5nZWRFdmVudDogUXVlcnlDaGFuZ2VkRXZlbnQgPSB7XG4gICAgICBraW5kOiBcIlNUQVRFX1FVRVJZX1JFU1VMVF9DSEFOR0VEX0VWRU5UXCIsXG4gICAgICBwcm9kdWNlcjogXCJTVEFURS1TRVJWSUNFXCIsXG4gICAgICBwcm9kdWNlcklkOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIGRhdGEsXG4gICAgfTtcbiAgICBjb25zdCB7IHF1ZXJ5TmFtZSwgY3VyciwgcHJldiB9ID0gcXVlcnlDaGFuZ2VkRXZlbnQuZGF0YTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIlsgUVVFUllfQ0hBTkdFRCBcIiArIHF1ZXJ5TmFtZSArIFwiXSA6IFwiICsgcHJldiArIFwiIC0+IFwiICsgY3Vycik7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHF1ZXJ5Q2hhbmdlZEV2ZW50KTtcbiAgfVxuXG4gIGdldFByb3BBc0ZhY3QocHJvcE5hbWU6IHN0cmluZyk6IFJlc3VsdDxGYWN0PiB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChwcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICByZXR1cm4gUmVzdWx0LmZhaWx1cmUoXG4gICAgICAgIFwiTm8gZGVmaW5pdGlvbiBmb3JtIHByb3BlcnR5IG55IG5hbWUgXCIgKyBwcm9wTmFtZSArIFwiIGlzIHJlZ2lzdGVyZWQuIChQYXNzIGluIGNvbnN0cnVjdG9yLilcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgPyBSZXN1bHQub2sodmFsdWUpIDogUmVzdWx0LmZhaWx1cmUoXCJQcm9wZXJ0eSBcIiArIHByb3BOYW1lICsgXCIgaGFzIG5vIHZhbHVlLlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RmFjdChmYWN0OiBGYWN0KSB7XG4gICAgc3dpdGNoIChmYWN0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJudW1lcmljLWZhY3RcIjpcbiAgICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdHJpbmctZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBmYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlKCkge1xuICAgIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgYm9vbGVhbj4gPSB7fTtcbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBtYXliZUZhY3QgPSB0aGlzLmdldEFueUZhY3QoZGVmLnByb3BOYW1lKTtcbiAgICAgIGlmIChtYXliZUZhY3QpIHtcbiAgICAgICAgdmFsdWUgPSBtYXliZUZhY3QudmFsdWU7XG4gICAgICB9XG4gICAgICBwcm9wc1tkZWYucHJvcE5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHF1ZXJ5KSA9PiB7XG4gICAgICBwcm9wc1txdWVyeS5xdWVyeS5uYW1lXSA9IHF1ZXJ5Lmxhc3RSZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgY29uc3QgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBwcm9wQXJyYXkgPSBbLi4udGhpcy5wcm9wRGVmaW5pdGlvbnMudmFsdWVzKCldO1xuXG4gICAgcmV0dXJuIHsgcHJvcENvdW50LCBwcm9wTmFtZXMsIHByb3BBcnJheSwgc3RhdGU6IHByb3BzIH07XG4gIH1cblxuICBwcml2YXRlIGdldEFueUZhY3QocHJvcE5hbWU6IHN0cmluZyk6IEZhY3QgfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3BOYW1lKSA/PyB0aGlzLmZhY3RzTnVtZXJpYy5nZXQocHJvcE5hbWUpID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxGYWN0cygpOiBSZWFkb25seUFycmF5PEZhY3Q+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmFjdHNOdW1lcmljLnZhbHVlcygpLCAuLi50aGlzLmZhY3RzU3RyaW5nLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGNoZWNrIHRoYXQgYWxsIHJlZmVyZW5jZUlkcyB1c2VkIGluIENvbmRpdGlvbiBpcyByZWdpc3RlcmVkIGFzIGEgdmFsaWQgcHJvcGVydHkgaW4gc3RhdGUuXG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICovXG4gIGNhbkJlTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpbXBsZUNvbmRpdGlvbnMgPSBDb25kaXRpb24uZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyhjb25kaXRpb24pO1xuICAgIGxldCBoYXNBbGwgPSB0cnVlO1xuXG4gICAgY29uc3QgYWxsSWRzID0gc2ltcGxlQ29uZGl0aW9ucy5tYXAoKGMpID0+IGMucmVmZXJlbmNlSWQpO1xuXG4gICAgY29uc3QgbWlzc2luZ0lkczogc3RyaW5nW10gPSBbXTtcbiAgICBhbGxJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcm9wRGVmaW5pdGlvbnMuaGFzKGlkKSkge1xuICAgICAgICBoYXNBbGwgPSBmYWxzZTtcbiAgICAgICAgbWlzc2luZ0lkcy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRywgbWlzc2luZ0lkcyk7XG5cbiAgICByZXR1cm4gaGFzQWxsO1xuICB9XG4gIGlzTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIHJldHVybiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCB0aGlzLmdldEFsbEZhY3RzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IERNZWRpYU1hbmFnZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvRE1lZGlhLW1hbmFnZXJcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEUGxheWVyIH0gZnJvbSBcIi4uL3BsYXllci9kcGxheWVyXCI7XG5pbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3BsYXllci9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRFBhZ2UgfSBmcm9tIFwiLi9EUGFnZVwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gXCIuLi9zdGF0ZS9zdGF0ZS1zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCwgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVMb2dnZXIge1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGFwcEV2ZW50KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xuICBhcHBDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFSZXN1bHQge1xuICByZWFkb25seSBldmVudExvZzogUmVhZG9ubHlBcnJheTxERXZlbnQ+O1xuICByZWFkb25seSBjb21tYW5kTG9nOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbiAgcmVhZG9ubHkgYW5zd2VyczogUmVhZG9ubHlBcnJheTxhbnk+O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU2NoZW1hRW5naW5lIHtcbiAgb25Db21wbGV0ZShoYW5kbGVyOiAocmVzdWx0OiBTY2hlbWFSZXN1bHQpID0+IHZvaWQpOiB2b2lkO1xuICBvbkNvbW1hbmRPckV2ZW50KGl0ZW06IERFdmVudCB8IERDb21tYW5kKTogdm9pZDtcbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZDtcbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFFbmdpbmUgaW1wbGVtZW50cyBJU2NoZW1hRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgU0NIRU1BX0VOR0lORSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzID0gbmV3IERDb21tYW5kQnVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXMgPSBuZXcgRXZlbnRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYU1hbmFnZXI6IERNZWRpYU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdWlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+PigpO1xuICBwcml2YXRlIHBsYXllcjogRFBsYXllcjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogRFBhZ2UgfCBmYWxzZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hRHRvLFxuICApIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50ID0gaG9zdEVsO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy51aUNvbnRhaW5lcik7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzID0gdGhpcy5zY2hlbWEuc3RhdGVQcm9wcyA/PyBbXTtcbiAgICBjb25zdCBzdGF0ZVF1ZXJpZXMgPSB0aGlzLnNjaGVtYS5zdGF0ZVF1ZXJpZXMgPz8gW107XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UgPSBuZXcgU3RhdGVTZXJ2aWNlKHRoaXMuZXZlbnRCdXMsIHRoaXMuY29tbWFuZEJ1cywgc3RhdGVQcm9wcywgc3RhdGVRdWVyaWVzKTtcbiAgICB0aGlzLnNjYWxlID0gbmV3IFNjYWxlU2VydmljZSh7XG4gICAgICBiYXNlSGVpZ2h0OiBzY2hlbWEuYmFzZUhlaWdodCxcbiAgICAgIGJhc2VXaWR0aDogc2NoZW1hLmJhc2VXaWR0aCxcbiAgICAgIGNvbnRhaW5lcldpZHRoOiB3aWR0aCxcbiAgICAgIGNvbnRhaW5lckhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5sb2dDb21tYW5kcyA9IHRydWU7XG4gICAgY29uc3QgZ2xvYmFsRXZlbnRIYW5kbGVycyA9IHNjaGVtYS5zdGF0ZUZyb21FdmVudCA/PyBbXTtcblxuICAgIGdsb2JhbEV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycy5zZXQoaC5vbkV2ZW50LCBoLnRoZW5FeGVjdXRlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlcyA9IFNjaGVtYUR0by5nZXRSZXNvdXJjZXModGhpcy5zY2hlbWEpO1xuICAgIHRoaXMucmVzb3VyY2VQcm92aWRlciA9IG5ldyBSZXNvdXJjZVByb3ZpZGVyKHsgdmlkZW9zOiByZXNvdXJjZXMudmlkZW9MaXN0LCBhdWRpbzogcmVzb3VyY2VzLmF1ZGlvTGlzdCB9KTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlciA9IG5ldyBETWVkaWFNYW5hZ2VyKFxuICAgICAgdGhpcy5tZWRpYUNvbnRhaW5lcixcbiAgICAgIHRoaXMuY29tbWFuZEJ1cyxcbiAgICAgIHRoaXMuZXZlbnRCdXMsXG4gICAgICB0aGlzLnJlc291cmNlUHJvdmlkZXIsXG4gICAgICB0aGlzLnNjYWxlLFxuICAgICk7XG4gICAgdGhpcy5wbGF5ZXIgPSBuZXcgRFBsYXllcih0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5zdHlsZVNlbGYoKTtcbiAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgdGhpcy5ob29rVXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaG9va1VwTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2KSA9PiB7XG4gICAgICB0aGlzLm9uQ29tbWFuZE9yRXZlbnQoZXYpO1xuICAgICAgY29uc3QgZ2xvYmFsSGFuZGxlcnMgPSB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLmdldChldi5raW5kKSA/PyBbXTtcbiAgICAgIGdsb2JhbEhhbmRsZXJzLmZvckVhY2goKHN0YXRlQ29tbWFuZCkgPT4ge1xuICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChzdGF0ZUNvbW1hbmQpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5UQUcgKyBcIkhPT0tfVVBfTElTVEVORVJTXCIpO1xuICAgIGNvbnN0IGNvbW1hbmRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChjb21tYW5kKSA9PiB7XG4gICAgICAvLyBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgLy9cbiAgICAgIC8vIH1cbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChjb21tYW5kKTtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJTRVFVRU5DRSBTVEFSVEVEIC0tIFRPRE8gRVZFTlQgRk9SIFRISVM/P1wiKTtcbiAgICAgICAgY29uc29sZS5sb2coY29tbWFuZCk7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGNvbW1hbmQucGF5bG9hZC5wYWdlSWQ7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gY29tbWFuZC5wYXlsb2FkLmZhY3RzQ29sbGVjdGVkO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICBjb25zdCBhbnM6IEFuc3dlcmVkUXVlc3Rpb25bXSA9IGZhY3RzLm1hcCgoZikgPT4gKHtcbiAgICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgICAgZmFjdDogZixcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnBsYXllci5zYXZlSGlzdG9yeSh7XG4gICAgICAgICAgYW5zd2VyZWRRdWVzdGlvbnM6IGFucyxcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgLy8gY29uc3QgaGlzdG9yeTogUGFnZUhpc3RvcnkgPSB7IHBhZ2U6IHt9LCBhbnN3ZXJlZFF1ZXN0aW9uczogW10gfTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG5cbiAgICB0aGlzLnN1YnMucHVzaChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnN1YnMucHVzaChldmVudFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlU2VsZigpIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuc2NhbGUucGFnZUhlaWdodCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5zY2FsZS5wYWdlV2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNjaGVtYS5iYWNrZ3JvdW5kQ29sb3IgPz8gXCJ3aGl0ZVwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgLy8gdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29uc3QgbWFrZVN0YXRpYyA9IChkaXY6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS53aWR0aCA9IFwiMHB4XCI7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcInN0YXRpY1wiO1xuICAgIH07XG5cbiAgICBtYWtlU3RhdGljKHRoaXMudWlDb250YWluZXIpO1xuICAgIG1ha2VTdGF0aWModGhpcy5tZWRpYUNvbnRhaW5lcik7XG4gIH1cblxuICBwcml2YXRlIG5leHRQYWdlKCkge1xuICAgIC8vIFRPRE8gU0hPVUxEIFRISVMgQkUgUEFSVCBPRiBUSEUgU0NIRU1BPz8gVEhJUyBJUyBDTEVBTlVQIExPR0lDXG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIlZJREVPXCIsIHRhcmdldElkOiBcIlZJREVPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHsga2luZDogXCJBVURJT19QQVVTRV9DT01NQU5EXCIsIHRhcmdldDogXCJBVURJT1wiLCB0YXJnZXRJZDogXCJBVURJT1wiLCBwYXlsb2FkOiB7fSB9KTtcbiAgICAvLyBjb25zdCBjdXJyUGFnZUlkID0gdGhpcy5jdXJyZW50UGFnZSA/IHRoaXMuY3VycmVudFBhZ2UuaWQgOiBcIk5PX1BBR0VcIjtcbiAgICAvLyBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiTkVYVF9QQUdFIEZST006IFwiICsgY3VyclBhZ2VJZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBORVhUX1BBR0UgU1RBUlRFRCBBVDogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlci5jbGVhckFsbE1lZGlhKCk7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLnBsYXllci5nZXROZXh0UGFnZSgpO1xuICAgIC8vIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzdGF0ZSk7XG4gICAgLy8gVE9ETyBDTEVBTiBVUCBQQUdFIENPTVBPTkVOVFMgdGhpcy5wYWdlLkNsZWFuVXAoKVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudWlDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFuZXh0UGFnZSkge1xuICAgICAgLy8gVE9ETyBGSUdVUkUgT1VUIFdIQVFUIFRPIERPIEFUIEVORCBPRiBURVNUISEgU3RhcnQgb3Zlcj8/XG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICAgIGlmICh0aGlzLnNjaGVtYS5wYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbmV3UGFnZSA9IG5ldyBEUGFnZShuZXh0UGFnZSwgdGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLnNjYWxlKTtcblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBuZXdQYWdlO1xuICAgIG5ld1BhZ2UuYXBwZW5kWW91cnNlbGYodGhpcy51aUNvbnRhaW5lcik7XG5cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5zZXRQYWdlKG5leHRQYWdlKTtcbiAgICBjb25zdCBzMSA9IHRoaXMuc3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgLy8gY29uc29sZS5sb2coczEpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiTmV4dC1wYWdlOiBcIiArIG5ld1BhZ2UuaWQpO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgIHN1YigpO1xuICAgIH0pO1xuICAgIGNvbnN0IGV2U3RhdHMgPSB0aGlzLmV2ZW50QnVzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgY21kU3RhdHMgPSB0aGlzLmNvbW1hbmRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zb2xlLmFzc2VydChldlN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCIgRXZlbnRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnMgXCIsIGV2U3RhdHMpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGNtZFN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCJDb21tYW5kYnVzIHNob3VsZCBoYXZlIG5vIHN1YnNjcmliZXJzXCIsIGNtZFN0YXRzKTtcbiAgfVxuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCkge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25Db21tYW5kT3JFdmVudChfZXZlbnRfb3JfY29tbWFuZDogREV2ZW50IHwgRENvbW1hbmQpIHt9XG5cbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coc2NoZW1hKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuU3RhdGVQcm9wZXJ0eTxQcm9wTmFtZSBleHRlbmRzIHN0cmluZz4ge1xuICAgIHJlYWRvbmx5IHByb3BOYW1lOiBQcm9wTmFtZTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUUlVFID0geyB2YWx1ZTogMSwgbGFiZWw6IFwiVFJVRVwiIH07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRkFMU0UgPSB7IHZhbHVlOiAwLCBsYWJlbDogXCJGQUxTRVwiIH07XG4gICAgcmVhZG9ubHkgcHJvcERlZmluaXRpb246IERTdGF0ZS5OdW1lcmljUHJvcDtcblxuICAgIGdldElzVHJ1ZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXFcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0SXNGYWxzZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldFRydWVDb21tYW5kKCk6IFN0YXRlQ29tbWFuZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIlNUQVRFX01VVEFURV9DT01NQU5EXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBcIlNUQVRFXCIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHsgcHJvcE5hbWU6IHRoaXMucHJvcE5hbWUsIGtpbmQ6IFwic2V0LW51bWJlclwiLCB2YWx1ZTogMSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTZXRGYWxzZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BOYW1lOiBQcm9wTmFtZSwgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsVmFsdWU6IGJvb2xlYW4sIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gaW5pdGlhbFZhbHVlID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IHByb3BEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8gZGVzY3JpcHRpb24gOiBcIk5vIGRlc2NyaXB0aW9uIGdpdmVuXCI7XG4gICAgICAgIHRoaXMucHJvcERlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBwcm9wRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wTmFtZTogcHJvcE5hbWUsXG4gICAgICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWwsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLmxhYmVsIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF90eXBlOiBcIm51bWJlclwiLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYW4gSURcbmNvbnN0IElEX0xFTkdUSCA9IDMyO1xuXG4vLyBUaGUgbWluaW11bSBsZW5ndGggb2YgYW4gSURcbmNvbnN0IE1JTl9MRU5HVEggPSAxMDtcblxuZXhwb3J0IHR5cGUgSUQ8QiBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgJiB7IF9fSURfXzogQiB9O1xuXG5jb25zdCBpc0lEID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQiwgaWQ/OiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiB7XG4gIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlkLmxlbmd0aCA+PSBNSU5fTEVOR1RIO1xufTtcblxuY29uc3QgY3JlYXRlSUQgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCKTogSUQ8Qj4gPT4ge1xuICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eXpcIjtcbiAgY29uc3QgYWxsID0gbGV0dGVycyArIGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSURfTEVOR1RIOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gYWxsLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGwubGVuZ3RoKSk7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBJRDxCPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG9iamVjdCB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc3BlY2lmaWMgSUQgdHlwZVxuICogQHBhcmFtIGlkTmFtZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVHlwZWRJZFNpbmdsZXRvbiA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpID0+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSUQgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKi9cbiAgY29uc3QgY3JlYXRlID0gKCk6IElEPEI+ID0+IGNyZWF0ZUlEKGlkTmFtZSk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGlzID0gKGlkOiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiBpc0lEKGlkTmFtZSwgaWQpO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCB0aHJvd3MgYW4gZXJyb3JcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZU9yVGhyb3cgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICBpZiAoIWlzKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkOiAke2lkfWApO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBsb3dlcmNhc2UgbmFtZSBvZiB0aGUgaWQgKFNDSEVNQSwgUEFHRSwgZXRjKVxuICAgKi9cbiAgY29uc3QgbmFtZTogQiA9IGlkTmFtZTtcblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLCBpZiBub3QgaXQgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCBlbnN1cmUgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICByZXR1cm4gaXMoaWQpID8gaWQgOiBjcmVhdGUoKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGNyZWF0ZSwgaXMsIGVuc3VyZSwgdmFsaWRhdGVPclRocm93LCBuYW1lIH0pO1xufTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hSUQgPSBJRDxcIlNDSEVNQVwiPjtcbmV4cG9ydCBjb25zdCBTY2hlbWFJRCA9IGNyZWF0ZVR5cGVkSWRTaW5nbGV0b24oXCJTQ0hFTUFcIik7XG5leHBvcnQgdHlwZSBQYWdlSUQgPSBJRDxcIlBBR0VcIj47XG5leHBvcnQgY29uc3QgUGFnZUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlBBR0VcIik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDd0NPLElBQVU7QUFBQSxDQUFWLENBQVVBLGVBQVY7QUFDRSxFQUFNQSxXQUFBLGVBQWUsQ0FDMUIsV0FLRztBQUNILFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxZQUFZLE1BQU0sT0FBeUIsQ0FBQyxLQUFLLFNBQVM7QUFDOUQsVUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUc7QUFDN0IsWUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUEsTUFDeEI7QUFDQSxhQUFPO0FBQUEsSUFDVCxHQUFHLENBQUMsQ0FBQztBQUNMLFVBQU0sWUFBOEIsTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUNoRixVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsV0FBTyxFQUFFLFdBQVcsV0FBVyxXQUFXLENBQUMsRUFBRTtBQUFBLEVBQy9DO0FBQUEsR0F2QmU7OztBQ3ZDVixJQUFVO0FBQUEsQ0FBVixDQUFVQyxnQkFBVjtBQUNJLEVBQU1BLFlBQUEsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUczQixFQUFNQSxZQUFBLFdBQVcsQ0FBQyxHQUFlLE9BQTJCO0FBQy9ELFVBQU0sTUFBTSxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQzNCLFdBQU87QUFBQSxFQUNYO0FBRU8sRUFBTUEsWUFBQSxPQUFPLENBQUMsSUFBZ0IsT0FBeUI7QUFDMUQsVUFBTSxRQUFRLEtBQUssSUFBSSxFQUFFO0FBQ3pCLFVBQU0sUUFBUSxLQUFLLElBQUksRUFBRTtBQUN6QixXQUFPLEtBQUssSUFBSSxRQUFRLEtBQUs7QUFBQSxFQUNqQztBQUVPLEVBQU1BLFlBQUEsVUFBVSxDQUFDLE1BQXdCO0FBQzVDLGVBQU9BLFlBQUEsTUFBSyxPQUFHQSxZQUFBLEtBQUksQ0FBQztBQUFBLEVBQ3hCO0FBQUEsR0FqQmE7OztBQ0FWLElBQVU7QUFBQSxDQUFWLENBQVVDLFdBQVY7QUFDSSxFQUFNQSxPQUFBLGVBQWUsQ0FBQyxXQUEyQjtBQUNwRCxVQUFNLFVBQVU7QUFDaEIsVUFBTSxZQUFZLFFBQVEsWUFBWTtBQUN0QyxVQUFNLE1BQU0sVUFBVTtBQUN0QixVQUFNLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFDM0IsUUFBSSxTQUFTO0FBRWIsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUs7QUFDMUIsWUFBTSxPQUFPLElBQUksT0FBTyxLQUFLLE1BQU0sS0FBSyxPQUFPLElBQUksSUFBSSxNQUFNLENBQUM7QUFDOUQsZ0JBQVU7QUFBQSxJQUNkO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxPQUFBLGlCQUFpQixVQUFNQSxPQUFBLGNBQWEsRUFBRTtBQUU1QyxFQUFNQSxPQUFBLGFBQWEsQ0FBNkIsS0FBVSxRQUE2QjtBQUMxRixXQUFPLElBQUksR0FBRztBQUNkLFdBQU87QUFBQSxFQUNYO0FBRU8sRUFBTUEsT0FBQSxZQUFZLENBQUMsS0FBYSxRQUFnQjtBQUNuRCxXQUFPLENBQUMsVUFBa0IsU0FBUyxPQUFPLFNBQVM7QUFBQSxFQUN2RDtBQUNPLEVBQU1BLE9BQUEsYUFBYSxDQUFDLFdBQW1CO0FBQzFDLFdBQU8sV0FBVyxPQUFPLHFCQUFxQixXQUFXLE9BQU8scUJBQXFCLFdBQVc7QUFBQSxFQUNwRztBQUVPLEVBQU1BLE9BQUEsa0JBQWtCLENBQUksVUFBK0M7QUFDOUUsV0FBTyxNQUFNLFNBQVM7QUFBQSxFQUMxQjtBQUVPLEVBQU1BLE9BQUEsYUFBYSxDQUFDLFNBQWdCO0FBQ3ZDLFlBQVEsSUFBSSxvREFBb0QsSUFBSTtBQUFBLEVBQ3hFO0FBRU8sRUFBTUEsT0FBQSxXQUFXLENBQUMsUUFBZ0MsT0FBTyxRQUFRO0FBRWpFLEVBQU1BLE9BQUEsU0FBUyxDQUFtQixLQUFjLFFBQStDO0FBQ2xHLFFBQUksS0FBQ0EsT0FBQSxVQUFTLEdBQUcsR0FBRztBQUNoQixhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sT0FBTyxVQUFVLGVBQWUsS0FBSyxLQUFLLEdBQUc7QUFBQSxFQUN4RDtBQUVPLEVBQU1BLE9BQUEsV0FBVyxDQUFDLFFBQWlEO0FBQ3RFLFFBQUksQ0FBQyxLQUFLO0FBQ04sYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJLE1BQU0sUUFBUSxHQUFHLEdBQUc7QUFDcEIsYUFBTztBQUFBLElBQ1g7QUFFQSxRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSSxRQUFRLE1BQU07QUFDZCxhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBRU8sRUFBTUEsT0FBQSxTQUFTLENBQUMsUUFBaUMsT0FBTyxRQUFRO0FBRWhFLEVBQU1BLE9BQUEsU0FBUyxDQUFDLFNBQWdDLFNBQVM7QUFFekQsRUFBTUEsT0FBQSxVQUFVLENBQUMsU0FBaUMsU0FBUztBQUUzRCxFQUFNQSxPQUFBLFlBQVksQ0FBQyxRQUEwQjtBQUNoRCxVQUFNLFVBQVUsUUFBUTtBQUN4QixVQUFNLGVBQWUsUUFBUTtBQUM3QixXQUFPLFdBQVc7QUFBQSxFQUN0QjtBQUVPLEVBQU1BLE9BQUEsVUFBVSxDQUFDLFFBQW1EO0FBQ3ZFLFFBQUksS0FBQ0EsT0FBQSxRQUFPLEtBQUssTUFBTSxHQUFHO0FBQ3RCLGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxPQUFPLElBQUksU0FBUyxVQUFVO0FBQzlCLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxJQUFJLEtBQUssU0FBUztBQUFBLEVBQzdCO0FBRU8sRUFBTUEsT0FBQSxXQUFXLENBQUMsUUFBNEM7QUFDakUsZUFBT0EsT0FBQSxRQUFPLEtBQUssT0FBTztBQUFBLEVBQzlCO0FBQ08sRUFBTUEsT0FBQSxXQUFXLENBQUMsVUFBb0M7QUFDekQsVUFBTUMsWUFBVyxPQUFPLFVBQVU7QUFDbEMsVUFBTSxTQUFTLENBQUMsT0FBTyxNQUFNLEtBQUs7QUFDbEMsV0FBT0EsYUFBWTtBQUFBLEVBQ3ZCO0FBRU8sRUFBTUQsT0FBQSxRQUFRLENBQUMsZUFBdUI7QUFDekMsV0FBTyxDQUFDLFVBQWtCO0FBQ3RCLGFBQU8sS0FBSyxJQUFJLE9BQU8sVUFBVTtBQUFBLElBQ3JDO0FBQUEsRUFDSjtBQUVPLEVBQU1BLE9BQUEsUUFBUSxDQUFDLGVBQXVCO0FBQ3pDLFdBQU8sQ0FBQyxVQUFrQjtBQUN0QixhQUFPLEtBQUssSUFBSSxPQUFPLFVBQVU7QUFBQSxJQUNyQztBQUFBLEVBQ0o7QUFBQSxHQTFHYTs7O0FDQ1YsSUFBVTtBQUFBLENBQVYsQ0FBVUUsVUFBVjtBQW1CSSxFQUFNQSxNQUFBLFdBQVcsQ0FBQyxNQUE0QixVQUFnQztBQUNqRixVQUFNLGVBQWUsS0FBSyxJQUFJLE9BQU8sSUFBSTtBQUN6QyxRQUFJLEtBQUssVUFBVSxNQUFNO0FBQ3JCLFVBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEIsZUFBTztBQUFBLE1BQ1g7QUFFQSxZQUFNLFVBQVUsS0FBSyxNQUFNLEtBQUssUUFBUSxZQUFZO0FBQ3BELFlBQU0sVUFBVSxLQUFLLElBQUksU0FBUyxDQUFDO0FBQ25DLGFBQVEsVUFBVTtBQUFBLElBQ3RCO0FBQ0EsV0FBUSxLQUFLLFFBQVE7QUFBQSxFQUN6QjtBQUVPLEVBQU1BLE1BQUEsZUFBZSxDQUFDLFNBQTBDO0FBQ25FLFFBQUksQ0FBQyxNQUFNO0FBQ1AsYUFBTztBQUFBLElBQ1g7QUFDQSxVQUFNLFVBQTRCO0FBQ2xDLFVBQU0sV0FBNkI7QUFDbkMsVUFBTSxhQUFhLE1BQU0sT0FBTyxNQUFNLE9BQU87QUFDN0MsVUFBTSxjQUFjLE1BQU0sT0FBTyxNQUFNLFFBQVE7QUFDL0MsV0FBTyxjQUFjO0FBQUEsRUFDekI7QUFBQSxHQTFDYTs7O0FDa0RWLElBQVU7QUFBQSxDQUFWLENBQVVDLFlBQVY7QUFDSSxFQUFNQSxRQUFBLFlBQVksQ0FBd0IsT0FBYTtBQUMxRCxPQUFHLE1BQU0sVUFBVTtBQUNuQixPQUFHLE1BQU0sU0FBUztBQUNsQixPQUFHLE1BQU0sV0FBVztBQUNwQixPQUFHLE1BQU0sWUFBWTtBQUNyQixXQUFPO0FBQUEsRUFDWDtBQUVPLEVBQU1BLFFBQUEsY0FBYyxDQUF3QixJQUFPLE9BQXdCLFVBQXFCO0FBRW5HLFVBQU07QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKLElBQUk7QUFHSixRQUFJLGlCQUFpQjtBQUNqQixTQUFHLE1BQU0sa0JBQWtCO0FBQUEsSUFDL0I7QUFFQSxRQUFJLFFBQVE7QUFDUixTQUFHLE1BQU0sU0FBUztBQUFBLElBQ3RCO0FBRUEsUUFBSSxXQUFXO0FBQ1gsU0FBRyxNQUFNLFlBQVk7QUFBQSxJQUN6QjtBQUVBLFFBQUksV0FBVztBQUNYLFNBQUcsTUFBTSxRQUFRO0FBQUEsSUFDckI7QUFDQSxRQUFJLFdBQVc7QUFDWCxTQUFHLE1BQU0sWUFBWTtBQUFBLElBQ3pCO0FBRUEsUUFBSSxhQUFhO0FBQ2IsU0FBRyxNQUFNLGNBQWM7QUFBQSxJQUMzQjtBQUVBLFFBQUksYUFBYTtBQUNiLFNBQUcsTUFBTSxjQUFjLEtBQUssU0FBUyxhQUFhLEtBQUs7QUFBQSxJQUMzRDtBQUNBLFFBQUksWUFBWTtBQUNaLFNBQUcsTUFBTSxhQUFhLGFBQWE7QUFBQSxJQUN2QztBQUNBLFFBQUksYUFBYTtBQUNiLFNBQUcsTUFBTSxjQUFjO0FBQUEsSUFDM0I7QUFDQSxRQUFJLFVBQVU7QUFDVixTQUFHLE1BQU0sV0FBVyxLQUFLLFNBQVMsVUFBVSxLQUFLO0FBQUEsSUFDckQ7QUFFQSxRQUFJLE1BQU0sU0FBUyxDQUFDLEdBQUc7QUFDbkIsU0FBRyxNQUFNLE9BQU8sSUFBSTtBQUFBLElBQ3hCO0FBQ0EsUUFBSSxNQUFNLFNBQVMsQ0FBQyxHQUFHO0FBQ25CLFNBQUcsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUMxQjtBQUVBLFFBQUksTUFBTSxTQUFTLENBQUMsR0FBRztBQUNuQixTQUFHLE1BQU0sU0FBUyxJQUFJO0FBQUEsSUFDMUI7QUFDQSxRQUFJLE1BQU0sU0FBUyxDQUFDLEdBQUc7QUFDbkIsU0FBRyxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ3pCO0FBRUEsUUFBSSxLQUFLLGFBQWEsWUFBWSxHQUFHO0FBQ2pDLFNBQUcsTUFBTSxlQUFlLEtBQUssU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUM3RDtBQUVBLFFBQUksZUFBZTtBQUNmLFNBQUcsTUFBTSxnQkFBZ0IsS0FBSyxTQUFTLGVBQWUsS0FBSztBQUFBLElBQy9EO0FBQ0EsUUFBSSxRQUFRO0FBQ1IsU0FBRyxNQUFNLFNBQVMsS0FBSyxTQUFTLFFBQVEsS0FBSztBQUFBLElBQ2pEO0FBQ0EsUUFBSSxTQUFTO0FBQ1QsU0FBRyxNQUFNLFVBQVUsS0FBSyxTQUFTLFNBQVMsS0FBSztBQUFBLElBQ25EO0FBRUEsUUFBSSxNQUFNLFNBQVMsT0FBTyxHQUFHO0FBQ3pCLFNBQUcsTUFBTSxVQUFVLFVBQVU7QUFBQSxJQUNqQztBQUVBLFFBQUksWUFBWTtBQUNaLFNBQUcsTUFBTSxhQUFhO0FBQUEsSUFDMUI7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEdBN0dhOzs7QUM3Q2pCLElBQU0sb0JBQW9CO0FBS25CLElBQU0saUJBQU4sTUFBNkM7QUFBQSxFQXFGaEQsWUFDcUIsSUFDQSxVQUNBLE9BQ25CO0FBSG1CO0FBQ0E7QUFDQTtBQUVqQixTQUFLLE1BQU07QUFDWCxTQUFLLEdBQUcsV0FBVztBQUNuQixXQUFPLFVBQVUsS0FBSyxFQUFFO0FBQ3hCLFdBQU8sWUFBWSxLQUFLLElBQUksS0FBSyxlQUFlLEtBQUssTUFBTSxLQUFLO0FBRWhFLFNBQUssR0FBRyxVQUFVLE1BQU07QUFDcEIsV0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNmLE1BQU07QUFBQSxRQUNOLFdBQVcsV0FBVyxJQUFJO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQ1YsWUFBWSxLQUFLO0FBQUEsUUFDakIsTUFBTSxDQUFDO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDTDtBQUNBLFNBQUssR0FBRyxTQUFTLE1BQU07QUFBQSxJQUV2QjtBQUVBLFNBQUssR0FBRyxVQUFVLE1BQU07QUFBQSxJQUFDO0FBQ3pCLFNBQUssR0FBRyxVQUFVLE1BQU07QUFBQSxJQUFDO0FBQ3pCLFNBQUssR0FBRyxZQUFZLE1BQU07QUFBQSxJQU8xQjtBQUNBLFNBQUssR0FBRyxtQkFBbUIsTUFBTTtBQUM3QixZQUFNLFdBQVcsS0FBSyxHQUFHO0FBQ3pCLFlBQU0sYUFBYSxNQUFNLFdBQVcsUUFBUTtBQUM1QyxXQUFLLFNBQVMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sV0FBVyxXQUFXLElBQUk7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFDVixZQUFZLEtBQUs7QUFBQSxRQUNqQixNQUFNLEVBQUUsVUFBVSxXQUFXO0FBQUEsTUFDakMsQ0FBQztBQUFBLElBQ0w7QUFFQSxTQUFLLEdBQUcsbUJBQW1CLE1BQU07QUFDN0IsWUFBTSxXQUFXLEtBQUssR0FBRztBQUN6QixZQUFNLGFBQWEsTUFBTSxXQUFXLFFBQVE7QUFDNUMsV0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNmLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLFlBQVksS0FBSztBQUFBLFFBQ2pCLFdBQVcsV0FBVyxJQUFJO0FBQUEsUUFDMUIsTUFBTSxFQUFFLFVBQVUsV0FBVztBQUFBLE1BQ2pDLENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSjtBQUFBLEVBNUlpQjtBQUFBLEVBQ1Q7QUFBQSxFQUNBLGdCQUFpQyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssWUFBWSxVQUFVLEdBQUcsR0FBRztBQUFBLEVBRXRGLFFBQVE7QUFDSixTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixZQUFZLEtBQUs7QUFBQSxNQUNqQixXQUFXLFdBQVcsSUFBSTtBQUFBLElBQzlCLENBQUM7QUFDRCxTQUFLLEdBQUcsTUFBTTtBQUFBLEVBQ2xCO0FBQUEsRUFFQSxLQUFLLEtBQWE7QUFDZCxRQUFJLEtBQUssR0FBRyxRQUFRLEtBQUs7QUFDckIsV0FBSyxHQUFHLE1BQU07QUFBQSxJQUNsQjtBQUNBLFVBQU0sYUFBYSxLQUFLLEtBQUssTUFBTTtBQUNuQyxTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVjtBQUFBLE1BQ0EsV0FBVyxXQUFXLElBQUk7QUFBQSxJQUM5QixDQUFDO0FBQ0QsU0FBSyxHQUNBLEtBQUssRUFDTCxLQUFLLENBQUMsUUFBUTtBQUNYLGNBQVEsSUFBSSxHQUFHO0FBQUEsSUFDbkIsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxNQUFNO0FBQ1YsY0FBUSxJQUFJLENBQUM7QUFBQSxJQUNqQixDQUFDO0FBQUEsRUFJVDtBQUFBLEVBRUEsTUFBTSxZQUFZO0FBQ2QsU0FBSyxHQUFHLFNBQVM7QUFDakIsVUFBTSxNQUFNLEtBQUssS0FBSztBQUN0QixRQUFJLENBQUMsS0FBSztBQUNOLGFBQU87QUFBQSxJQUNYO0FBRUEsUUFBSTtBQUNBLFlBQU0saUJBQWlCLElBQUksUUFBaUIsQ0FBQyxTQUFTLFdBQVc7QUFDN0QsYUFBSyxHQUFHO0FBQUEsVUFDSjtBQUFBLFVBQ0EsQ0FBQyxNQUFNO0FBQ0gsb0JBQVEsSUFBSTtBQUFBLFVBQ2hCO0FBQUEsVUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLFFBQ2pCO0FBQ0EsYUFBSyxHQUFHO0FBQUEsVUFDSjtBQUFBLFVBQ0EsQ0FBQyxNQUFNO0FBQ0gsb0JBQVEsS0FBSztBQUFBLFVBQ2pCO0FBQUEsVUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLFFBQ2pCO0FBQ0EsYUFBSyxHQUFHO0FBQUEsVUFDSjtBQUFBLFVBQ0EsTUFBTTtBQUNGLG9CQUFRLElBQUksaUJBQWlCO0FBQzdCLG1CQUFPLFNBQVM7QUFBQSxVQUNwQjtBQUFBLFVBQ0EsRUFBRSxNQUFNLEtBQUs7QUFBQSxRQUNqQjtBQUFBLE1BQ0osQ0FBQztBQUVELFdBQUssS0FBSyxHQUFHO0FBQ2IsWUFBTTtBQUNOLGFBQU87QUFBQSxJQUNYLFNBQVMsR0FBRztBQUNSLGNBQVEsSUFBSSxDQUFDO0FBQ2IsYUFBTztBQUFBLElBQ1gsVUFBRTtBQUNFLGNBQVEsSUFBSSxLQUFLLE1BQU0sbURBQW1ELEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDMUY7QUFBQSxFQUNKO0FBQUEsRUE0REEsV0FBVztBQUNQLFVBQU0sV0FBVyxLQUFLLEdBQUc7QUFDekIsVUFBTSxjQUFjLEtBQUssR0FBRztBQUM1QixVQUFNLFNBQVMsS0FBSyxHQUFHO0FBQ3ZCLFVBQU0sY0FBYyxLQUFLLEdBQUc7QUFDNUIsVUFBTSxrQkFBa0IsS0FBSyxHQUFHLHdCQUF3QjtBQUN4RCxVQUFNLHNCQUFzQixLQUFLLEdBQUc7QUFDcEMsVUFBTSxTQUFTLEtBQUssR0FBRztBQUN2QixVQUFNLFNBQVMsS0FBSyxHQUFHO0FBRXZCLFdBQU87QUFBQSxNQUNIO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFPLEtBQWdCO0FBQ25CLFNBQUssTUFBTTtBQUNYLFNBQUssR0FBRyxTQUFTO0FBQ2pCLFNBQUssU0FBUyxJQUFJLEtBQUs7QUFDdkIsU0FBSyxHQUFHLE1BQU0sSUFBSTtBQUNsQixTQUFLLEdBQUcsS0FBSztBQUFBLEVBQ2pCO0FBQUEsRUFFQSxnQkFBbUM7QUFDL0IsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUN2QjtBQUFBLEVBRUEsU0FBUyxRQUF5QjtBQUM5QixXQUFPLFlBQVksS0FBSyxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUs7QUFBQSxFQUN4RDtBQUFBLEVBRUEsSUFBWSxLQUFLO0FBQ2IsV0FBTyxLQUFLLEtBQUssTUFBTTtBQUFBLEVBQzNCO0FBQUEsRUFFQSxVQUFVO0FBQUEsRUFBQztBQUNmOzs7QUNqTU8sSUFBTSxpQkFBTixNQUE2QztBQUFBLEVBSWhELFlBQTZCLFVBQTRCO0FBQTVCO0FBQ3pCLFNBQUssS0FBSyxTQUFTLGNBQWMsT0FBTztBQUN4QyxTQUFLLEdBQUcsTUFBTSxXQUFXO0FBQ3pCLFNBQUssR0FBRyxNQUFNLGFBQWE7QUFFM0IsU0FBSyxTQUFTLEtBQUssT0FBTyxLQUFLLElBQUk7QUFDbkMsU0FBSyxHQUFHLFNBQVMsS0FBSztBQUN0QixTQUFLLG1CQUFtQixLQUFLLGlCQUFpQixLQUFLLElBQUk7QUFDdkQsU0FBSyxHQUFHLG1CQUFtQixLQUFLO0FBQ2hDLFNBQUssR0FBRyxTQUFTLE1BQU07QUFBQSxJQUV2QjtBQUNBLFNBQUssbUJBQW1CLEtBQUssaUJBQWlCLEtBQUssSUFBSTtBQUN2RCxTQUFLLEdBQUcsbUJBQW1CLEtBQUs7QUFDaEMsU0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQ3JCLFlBQU0sTUFBTSxLQUFLLEdBQUc7QUFDcEIsV0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNmLE1BQU07QUFBQSxRQUNOLE1BQU0sRUFBRSxJQUFJO0FBQUEsUUFDWixVQUFVO0FBQUEsUUFDVixXQUFXLFdBQVcsSUFBSTtBQUFBLFFBQzFCLFlBQVksS0FBSztBQUFBLE1BQ3JCLENBQUM7QUFBQSxJQUNMO0FBQ0EsU0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQWE7QUFDckMsWUFBTSxXQUFXLEtBQUssR0FBRztBQUN6QixZQUFNLGFBQWEsYUFBYSxPQUFPO0FBQ3ZDLFdBQUssU0FBUyxLQUFLO0FBQUEsUUFDZixNQUFNO0FBQUEsUUFDTixXQUFXLFdBQVcsSUFBSTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUNWLFlBQVksS0FBSztBQUFBLFFBQ2pCLE1BQU0sRUFBRSxVQUFVLEtBQUssR0FBRyxVQUFVLFdBQVc7QUFBQSxNQUNuRCxDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFBQSxFQXRDaUIsTUFBTTtBQUFBLEVBQ2IsTUFBd0I7QUFBQSxFQUMxQjtBQUFBLEVBc0NSLFNBQVMsS0FBZ0I7QUFDckIsU0FBSyxNQUFNO0FBQ1gsU0FBSyxHQUFHLE1BQU0sSUFBSTtBQUNsQixTQUFLLEdBQUcsS0FBSztBQUFBLEVBQ2pCO0FBQUEsRUFFQSxVQUFVO0FBQ04sUUFBSTtBQUNBLFdBQUssR0FBRyxNQUFNO0FBQ2QsV0FBSyxHQUFHLE1BQU07QUFDZCxXQUFLLEdBQUcsS0FBSztBQUFBLElBQ2pCLFNBQVMsR0FBRztBQUNSLGNBQVEsSUFBSSxDQUFDO0FBQUEsSUFDakI7QUFBQSxFQUNKO0FBQUEsRUFFQSxRQUFRO0FBQ0osUUFBSTtBQUNBLFdBQUssR0FBRyxNQUFNO0FBQUEsSUFDbEIsU0FBUyxHQUFHO0FBRVIsY0FBUSxJQUFJLENBQUM7QUFBQSxJQUNqQjtBQUFBLEVBQ0o7QUFBQSxFQUVBLEtBQUssS0FBYTtBQUNkLFFBQUksS0FBSyxHQUFHLFFBQVEsS0FBSztBQUNyQixXQUFLLEdBQUcsTUFBTTtBQUFBLElBQ2xCO0FBQ0EsU0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFlBQVksS0FBSztBQUFBLE1BQ2pCLE1BQU0sQ0FBQztBQUFBLE1BQ1AsVUFBVTtBQUFBLE1BQ1YsV0FBVyxXQUFXLElBQUk7QUFBQSxJQUM5QixDQUFDO0FBQ0QsU0FBSyxHQUNBLEtBQUssRUFDTCxLQUFLLENBQUMsUUFBUTtBQUNYLGNBQVEsSUFBSSxHQUFHO0FBQUEsSUFDbkIsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxNQUFNO0FBQ1YsY0FBUSxJQUFJLENBQUM7QUFBQSxJQUNqQixDQUFDO0FBQUEsRUFDVDtBQUFBLEVBRUEsaUJBQWlCLEdBQVU7QUFDdkIsU0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDMUIsVUFBVTtBQUFBLE1BQ1YsWUFBWSxLQUFLO0FBQUEsTUFDakIsTUFBTSxDQUFDO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsT0FBTyxHQUFVO0FBQ2IsU0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDMUIsVUFBVTtBQUFBLE1BQ1YsWUFBWSxLQUFLO0FBQUEsTUFDakIsTUFBTSxDQUFDO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFFTDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQ0wsV0FBTyxLQUFLLEtBQUssTUFBTTtBQUFBLEVBQzNCO0FBQUEsRUFFUSxpQkFBaUIsR0FBVTtBQUMvQixTQUFLLFNBQVMsS0FBSztBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixXQUFXLFdBQVcsSUFBSTtBQUFBLE1BQzFCLFlBQVksS0FBSztBQUFBLElBQ3JCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQSxFQUlBLE1BQU0sWUFBOEI7QUFDaEMsVUFBTSxpQkFBaUIsSUFBSSxRQUFpQixDQUFDLFlBQVk7QUFDckQsV0FBSyxHQUFHO0FBQUEsUUFDSjtBQUFBLFFBQ0EsQ0FBQyxNQUFNO0FBRUgsa0JBQVEsSUFBSTtBQUFBLFFBQ2hCO0FBQUEsUUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2pCO0FBQ0EsV0FBSyxHQUFHO0FBQUEsUUFDSjtBQUFBLFFBQ0EsQ0FBQyxNQUFNO0FBRUgsa0JBQVEsS0FBSztBQUFBLFFBQ2pCO0FBQUEsUUFDQSxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2pCO0FBQUEsSUFDSixDQUFDO0FBQ0QsUUFBSTtBQUNBLFdBQUssS0FBSyxLQUFLLEdBQUcsR0FBRztBQUNyQixZQUFNO0FBQ04sYUFBTztBQUFBLElBQ1gsU0FBUyxHQUFHO0FBRVIsY0FBUSxJQUFJLENBQUM7QUFDYixXQUFLLFNBQVMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sV0FBVyxXQUFXLElBQUk7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFDVixZQUFZLEtBQUs7QUFBQSxRQUNqQixNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQUEsTUFDckIsQ0FBQztBQUNELGFBQU87QUFBQSxJQUNYLFVBQUU7QUFBQSxJQUNGO0FBRUEsV0FBTyxRQUFRLFFBQVEsS0FBSztBQUFBLEVBQ2hDO0FBQ0o7OztBQ3ZKTyxJQUFNLGdCQUFOLE1BQU0sZUFBdUM7QUFBQSxFQVlsRCxZQUNVLFFBQ1MsWUFDQSxVQUNBLGtCQUNBLE9BQ2pCO0FBTFE7QUFDUztBQUNBO0FBQ0E7QUFDQTtBQUVqQixtQkFBYyxpQkFBaUIsZUFBYyxpQkFBaUI7QUFDOUQsU0FBSyxpQkFBaUIsZUFBYztBQUNwQyxVQUFNLFVBQVUsU0FBUyxjQUFjLE9BQU87QUFDOUMsU0FBSyxPQUFPLE9BQU8sT0FBTztBQUMxQixTQUFLLGlCQUFpQixJQUFJLGVBQWUsU0FBUyxVQUFVLEtBQUssS0FBSztBQUN0RSxTQUFLLGlCQUFpQixJQUFJLGVBQWUsS0FBSyxRQUFRO0FBQ3RELFNBQUssT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJO0FBQy9CLFNBQUssZUFBZSxTQUFTLEVBQUUsWUFBWSxTQUFTLENBQUM7QUFDckQsVUFBTSxNQUFNLFdBQVcsSUFBSTtBQUMzQixTQUFLLFlBQVk7QUFDakIsU0FBSyxpQkFBaUIsV0FBVyxLQUFLLEtBQUssR0FBRztBQUM5QyxTQUFLLHNCQUFzQixLQUFLLFdBQVcsVUFBVSxDQUFDLFdBQVc7QUFDL0QsV0FBSyxlQUFlLE1BQU07QUFBQSxJQUM1QixHQUFHLEtBQUssR0FBRztBQUVYLFNBQUssWUFBWSxPQUFPLFlBQVksTUFBTTtBQUFBLElBQUMsR0FBRyxHQUFJO0FBQUEsRUFDcEQ7QUFBQSxFQWxDQSxPQUFlLGlCQUFpQjtBQUFBLEVBQ2Y7QUFBQSxFQUNBLE1BQU07QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ1Q7QUFBQSxFQUNBO0FBQUEsRUFDQSxjQUE4QjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0Esa0JBQTJDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUE2QjVELGdCQUFnQjtBQUNkLFNBQUssZUFBZSxNQUFNO0FBQzFCLFNBQUssZUFBZSxNQUFNO0FBQUEsRUFDNUI7QUFBQSxFQUNBLFVBQVU7QUFDUixZQUFRLElBQUksd0JBQXdCO0FBQ3BDLFNBQUssb0JBQW9CO0FBRXpCLFdBQU8sY0FBYyxLQUFLLFNBQVM7QUFDbkMsU0FBSyxlQUFlLFFBQVE7QUFDNUIsU0FBSyxlQUFlLFFBQVE7QUFBQSxFQUM5QjtBQUFBLEVBRUEsUUFBUSxNQUFlO0FBRXJCLFNBQUssY0FBYztBQUNuQixTQUFLLGVBQWUsTUFBTTtBQUMxQixTQUFLLFlBQVksV0FBVyxJQUFJO0FBR2hDLFVBQU0sTUFBTSxLQUFLO0FBRWpCLFVBQU0sRUFBRSxhQUFhLE1BQU0sSUFBSTtBQUMvQixVQUFNLGdCQUFnQixLQUFLO0FBRTNCLFFBQUksYUFBYTtBQUNmLFlBQU0sTUFBTSxLQUFLLGlCQUFpQixhQUFhLFdBQVc7QUFDMUQsVUFBSSxLQUFLO0FBQ1AsYUFBSyxlQUFlLE9BQU8sR0FBRztBQUM5QixhQUFLLGVBQWUsU0FBUyxFQUFFLEdBQUcsSUFBSSxPQUFPLFlBQVksVUFBVSxDQUFDO0FBQUEsTUFDdEU7QUFBQSxJQUVGLE9BQU87QUFDTCxXQUFLLGVBQWUsU0FBUyxFQUFFLFlBQVksU0FBUyxDQUFDO0FBQUEsSUFFdkQ7QUFDQSxRQUFJLGVBQWU7QUFDakIsWUFBTSxRQUFRLGNBQWMsQ0FBQztBQUM3QixVQUFJLE9BQU87QUFDVCxhQUFLLGVBQWUsU0FBUyxLQUFLO0FBQUEsTUFDcEM7QUFBQSxJQUNGO0FBQ0EsUUFBSSxLQUFLO0FBQ1AsV0FBSyxhQUFhLEdBQUc7QUFBQSxJQUN2QjtBQUFBLEVBRUY7QUFBQSxFQUVRLGVBQWUsU0FBbUI7QUFDeEMsUUFBSSxRQUFRLFNBQVMsc0JBQXNCO0FBQ3pDLFlBQU0sUUFBUSxRQUFRO0FBQ3RCLFlBQU0sTUFBTSxLQUFLLGVBQWUsY0FBYztBQUU5QyxVQUFJLE9BQU8sSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUN0QyxnQkFBUSxJQUFJLEtBQUs7QUFDakIsYUFBSyxlQUFlLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFDbEM7QUFBQSxJQUNGO0FBQ0EsUUFBSSxRQUFRLFNBQVMsdUJBQXVCO0FBQzFDLFdBQUssZUFBZSxNQUFNO0FBQUEsSUFDNUI7QUFDQSxRQUFJLFFBQVEsU0FBUyxzQkFBc0I7QUFDekMsV0FBSyxlQUNGLFVBQVUsRUFDVixLQUFLLE1BQU07QUFBQSxNQUFDLENBQUMsRUFDYixNQUFNLEVBQ04sUUFBUSxNQUFNO0FBQUEsTUFBQyxDQUFDO0FBQUEsSUFDckI7QUFFQSxRQUFJLFFBQVEsU0FBUyx1QkFBdUI7QUFBQSxJQUU1QztBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQWMsYUFBYSxLQUF3QjtBQUdqRCxVQUFNLFdBQVcsSUFBSTtBQUNyQixVQUFNLFlBQVksQ0FBQyxHQUFHLFFBQVE7QUFDOUIsVUFBTSxRQUFRLFVBQVUsSUFBSTtBQUU1QixRQUFJLENBQUMsT0FBTztBQUNWLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxNQUFNLFdBQVcsSUFBSTtBQUMzQixRQUFJLGNBQWMsUUFBUSxDQUFDLE1BQU07QUFDL0IsY0FBUSxJQUFJLENBQUM7QUFDYixXQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsSUFDeEIsQ0FBQztBQUtELGFBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEMsWUFBTSxPQUFPLFNBQVMsQ0FBQztBQUN2QixVQUFJLEtBQUssU0FBUyxrQkFBa0I7QUFDbEMsY0FBTSxNQUFNLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxPQUFPO0FBQzNELFlBQUk7QUFBSyxlQUFLLGVBQWUsT0FBTyxHQUFHO0FBQ3ZDLGNBQU0sS0FBSyxlQUFlLFVBQVU7QUFBQSxNQUN0QztBQUNBLFVBQUksS0FBSyxTQUFTLGtCQUFrQjtBQUNsQyxnQkFBUSxJQUFJLElBQUk7QUFDaEIsY0FBTSxNQUFNLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxPQUFPO0FBQzNELFlBQUk7QUFBSyxlQUFLLGVBQWUsU0FBUyxHQUFHO0FBQ3pDLGNBQU0sS0FBSyxlQUFlLFVBQVU7QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFDQSxRQUFJLFlBQVksUUFBUSxDQUFDLE1BQU07QUFDN0IsV0FBSyxXQUFXLEtBQUssQ0FBQztBQUFBLElBQ3hCLENBQUM7QUFHRCxZQUFRLElBQUksS0FBSyxNQUFNLGdCQUFnQjtBQUN2QyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUEsRUFJUSxPQUFPO0FBQUEsRUFFZjtBQUNGOzs7QUNuS08sSUFBTSxjQUFOLE1BQStEO0FBQUEsRUFDbkQsTUFBTTtBQUFBLEVBQ3ZCLGNBQWM7QUFBQSxFQUNHLGFBQTBELENBQUM7QUFBQSxFQUNuRSxjQUFjLG9CQUFJLElBQTJCO0FBQUE7QUFBQSxFQUd0RCxVQUFVLElBQWlDLGNBQXNCO0FBQy9ELFVBQU0sTUFBNkI7QUFBQSxNQUNqQztBQUFBLE1BQ0EsVUFBVTtBQUFBLElBQ1o7QUFFQSxTQUFLLFlBQVksSUFBSSxHQUFHO0FBQ3hCLFdBQU8sTUFBTTtBQUNYLFdBQUssWUFBWSxPQUFPLEdBQUc7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLEtBQUssU0FBbUI7QUFDdEIsVUFBTSxZQUFZLFdBQVcsSUFBSTtBQUNqQyxTQUFLLFdBQVcsS0FBSyxFQUFFLEdBQUcsU0FBUyxVQUFVLENBQUM7QUFDOUMsUUFBSSxLQUFLLGFBQWE7QUFDcEIsV0FBSyxXQUFXLE9BQU87QUFBQSxJQUN6QjtBQUNBLFNBQUssWUFBWSxRQUFRLENBQUMsZUFBZTtBQUN2QyxpQkFBVyxTQUFTLE9BQU87QUFBQSxJQUM3QixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsV0FBVztBQUNULFdBQU87QUFBQSxNQUNMLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBLE1BQzdCLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVztBQUFBLE1BQ2pDLGtCQUFrQixLQUFLLFlBQVk7QUFBQSxJQUNyQztBQUFBLEVBQ0Y7QUFBQSxFQUVRLFdBQVcsU0FBbUI7QUFDcEMsWUFBUSxlQUFlLEtBQUssTUFBTSxNQUFNLFFBQVEsSUFBSTtBQUNwRCxZQUFRLElBQUksZ0JBQWdCLFFBQVEsUUFBUTtBQUM1QyxZQUFRLElBQUksUUFBUSxPQUFPO0FBQzNCLFlBQVEsU0FBUztBQUFBLEVBQ25CO0FBQ0Y7OztBQzdDTyxJQUFNLFdBQU4sTUFBd0Q7QUFBQSxFQUMxQyxNQUFNO0FBQUE7QUFBQSxFQUVOLGNBQWMsb0JBQUksSUFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXRDLFdBQXFCLENBQUM7QUFBQSxFQUN2QyxtQkFBbUI7QUFBQTtBQUFBLEVBR25CLFVBQVUsSUFBNkIsY0FBc0I7QUFFekQsVUFBTSxpQkFBaUM7QUFBQSxNQUNuQztBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQ0EsU0FBSyxZQUFZLElBQUksY0FBYztBQUNuQyxRQUFJLEtBQUssa0JBQWtCO0FBQ3ZCLGNBQVEsSUFBSSxLQUFLLE1BQU0seUJBQXlCLFlBQVk7QUFDNUQsY0FBUSxJQUFJLEtBQUssTUFBTSx5QkFBeUIsS0FBSyxZQUFZLElBQUk7QUFBQSxJQUN6RTtBQUNBLFdBQU8sTUFBTTtBQUNULFVBQUksS0FBSyxrQkFBa0I7QUFDdkIsZ0JBQVEsSUFBSSxLQUFLLE1BQU0sMkJBQTJCLFlBQVk7QUFDOUQsZ0JBQVEsSUFBSSxLQUFLLE1BQU0sMkJBQTJCLEtBQUssWUFBWSxJQUFJO0FBQUEsTUFDM0U7QUFFQSxXQUFLLFlBQVksT0FBTyxjQUFjO0FBQUEsSUFDMUM7QUFBQSxFQUNKO0FBQUEsRUFFQSxXQUFXO0FBQ1AsV0FBTztBQUFBLE1BQ0gsa0JBQWtCLEtBQUssWUFBWTtBQUFBLE1BQ25DLFVBQVUsQ0FBQyxHQUFHLEtBQUssUUFBUTtBQUFBLE1BQzNCLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVztBQUFBLElBQ3JDO0FBQUEsRUFDSjtBQUFBLEVBRUEsS0FBSyxPQUFlO0FBQ2hCLFFBQUksS0FBSyxrQkFBa0I7QUFDdkIsV0FBSyxTQUFTLEtBQUs7QUFBQSxJQUN2QjtBQUNBLFNBQUssU0FBUyxLQUFLLEtBQUs7QUFDeEIsU0FBSyxZQUFZLFFBQVEsQ0FBQyxTQUFTO0FBRS9CLFdBQUssR0FBRyxLQUFLO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBRUw7QUFBQSxFQUVRLFNBQVMsT0FBZTtBQUM1QixZQUFRLGVBQWUsS0FBSyxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQ2xELFlBQVEsSUFBSSxpQkFBaUIsTUFBTSxVQUFVO0FBQzdDLFlBQVEsSUFBSSxNQUFNLElBQUk7QUFDdEIsWUFBUSxTQUFTO0FBQUEsRUFDckI7QUFBQSxFQUVRLFlBQVk7QUFDaEIsWUFBUSxNQUFNLEtBQUssTUFBTSxNQUFNO0FBQy9CLFlBQVEsTUFBTSxLQUFLLFFBQVE7QUFDM0IsWUFBUSxTQUFTO0FBQUEsRUFDckI7QUFDSjs7O0FDeEVPLElBQVU7QUFBQSxDQUFWLENBQVVDLHNCQUFWO0FBQ0ksRUFBTUEsa0JBQUEsS0FBSyxDQUFDLEdBQXFCLE1BQWlDO0FBQ3JFLFdBQU8sRUFBRSxTQUFTLEVBQUU7QUFBQSxFQUN4QjtBQUFBLEdBSGE7QUFXVixJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQUNaLFVBQXlCLENBQUM7QUFBQSxFQUVsQyxXQUF3QjtBQUNwQixVQUFNLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO0FBQ25FLFVBQU0sUUFBUSxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSTtBQUV2QyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsYUFBc0M7QUFDbEMsVUFBTSxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQztBQUNuRSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsYUFBYSxNQUFtQjtBQUM1QixTQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsRUFDMUI7QUFDSjs7O0FDakNPLElBQVU7QUFBQSxDQUFWLENBQVVDLGVBQVY7QUEwQ0ksRUFBTUEsV0FBQSxXQUFXLENBQUMsV0FBc0IsVUFBK0I7QUFDMUUsUUFBSSxTQUFrQjtBQUN0QixZQUFRLFVBQVUsTUFBTTtBQUFBLE1BQ3BCLEtBQUs7QUFDRCxpQkFBUyxlQUFlLFdBQVcsS0FBSztBQUN4QztBQUFBLE1BQ0osS0FBSztBQUNELGlCQUFTLGVBQWUsV0FBVyxLQUFLO0FBQ3hDO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsZ0JBQWdCLFdBQVcsS0FBSztBQUN6QztBQUFBLE1BQ0o7QUFDSSxjQUFNLFFBQWU7QUFBQSxJQUM3QjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBRUEsUUFBTSxrQkFBa0IsQ0FBQyxXQUE4QixVQUF3QztBQUMzRixRQUFJLFVBQVUsS0FBSyxXQUFXLEtBQUssVUFBVSxJQUFJLFdBQVcsR0FBRztBQUMzRCxhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU0sWUFBWSxVQUFVLElBQUksSUFBSSxDQUFDQyxlQUFjO0FBQy9DLGFBQU8sZUFBZUEsWUFBVyxLQUFLO0FBQUEsSUFDMUMsQ0FBQztBQUVELFVBQU0sZ0JBQWdCLFVBQVUsS0FBSyxJQUFJLENBQUNBLGVBQWM7QUFDcEQsYUFBTyxlQUFlQSxZQUFXLEtBQUs7QUFBQSxJQUMxQyxDQUFDO0FBQ0QsVUFBTSxZQUFZLFVBQVUsTUFBTSxNQUFNLE1BQU07QUFDOUMsVUFBTSxhQUFhLGNBQWMsV0FBVyxLQUFLLGNBQWMsS0FBSyxNQUFNLE1BQU07QUFDaEYsV0FBTyxjQUFjO0FBQUEsRUFDekI7QUFFQSxRQUFNLGlCQUFpQixDQUFDLFdBQTZCLFVBQXdDO0FBQ3pGLFVBQU0sT0FBTyxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLFVBQVUsV0FBVztBQUN0RSxRQUFJLENBQUMsTUFBTTtBQUNQLGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxNQUFNO0FBQ1YsWUFBUSxVQUFVLE1BQU07QUFBQSxNQUNwQixLQUFLO0FBQ0QsWUFBSSxLQUFLLFNBQVMsZ0JBQWdCO0FBQzlCLGdCQUFNLGdCQUFnQixXQUFXLEtBQUssS0FBSztBQUFBLFFBQy9DO0FBQ0E7QUFBQSxNQUNKLEtBQUs7QUFDRCxZQUFJLEtBQUssU0FBUyxlQUFlO0FBQzdCLGdCQUFNLGVBQWUsV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUM5QztBQUNBO0FBQUEsTUFDSjtBQUNJLGNBQU0sUUFBZTtBQUFBLElBQzdCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNRCxXQUFBLFVBQVUsQ0FBQyxZQUFxQjtBQUN6QyxXQUFPLFFBQVEsSUFBSSxXQUFXLEtBQUssUUFBUSxLQUFLLFdBQVc7QUFBQSxFQUMvRDtBQUVBLFFBQU0saUJBQWlCLENBQUMsV0FBdUMsVUFBMkI7QUFDdEYsVUFBTSxXQUFXLFVBQVU7QUFDM0IsUUFBSSxTQUFTO0FBQ2IsWUFBUSxVQUFVO0FBQUEsTUFDZCxLQUFLO0FBQ0QsaUJBQVMsVUFBVSxVQUFVO0FBQzdCO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsVUFBVSxVQUFVO0FBQzdCO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsVUFBVSxVQUFVO0FBQzdCO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsVUFBVSxVQUFVO0FBQzdCO0FBQUEsTUFDSjtBQUNJLGNBQU0sUUFBZTtBQUFBLElBQzdCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFQSxRQUFNLGtCQUFrQixDQUFDLFdBQW9CLFVBQTJCO0FBQ3BFLFVBQU0sS0FBSyxVQUFVO0FBQ3JCLFVBQU0saUJBQWlCLFVBQVU7QUFDakMsUUFBSSxTQUFTO0FBQ2IsWUFBUSxJQUFJO0FBQUEsTUFDUixLQUFLO0FBQ0QsaUJBQVMsVUFBVTtBQUNuQjtBQUFBLE1BQ0osS0FBSztBQUNELGlCQUFTLFVBQVU7QUFDbkI7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxRQUFRO0FBQ2pCO0FBQUEsTUFDSixLQUFLO0FBQ0QsaUJBQVMsU0FBUztBQUNsQjtBQUFBLE1BQ0osS0FBSztBQUNELGlCQUFTLFFBQVE7QUFDakI7QUFBQSxNQUNKLEtBQUs7QUFDRCxpQkFBUyxTQUFTO0FBQ2xCO0FBQUEsTUFDSjtBQUNJLGNBQU0sUUFBZTtBQUFBLElBQzdCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFQSxRQUFNLGdCQUFnQixDQUFDLGNBQTBEO0FBQzdFLFVBQU0sU0FBa0MsQ0FBQztBQUN6QyxZQUFRLFVBQVUsTUFBTTtBQUFBLE1BQ3BCLEtBQUs7QUFDRCxlQUFPLEtBQUssR0FBRyxVQUFVLEdBQUc7QUFDNUIsZUFBTyxLQUFLLEdBQUcsVUFBVSxJQUFJO0FBQzdCO0FBQUEsTUFDSixLQUFLO0FBQ0QsZUFBTyxLQUFLLFNBQVM7QUFDckI7QUFBQSxNQUNKLEtBQUs7QUFDRCxlQUFPLEtBQUssU0FBUztBQUNyQjtBQUFBLE1BQ0o7QUFDSSxjQUFNLFdBQVcsU0FBUztBQUFBLElBQ2xDO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxXQUFBLHlCQUF5QixDQUNsQyxjQUNrQztBQUNsQyxVQUFNLFNBQWtDLENBQUM7QUFDekMsUUFBSSxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzFCLGdCQUFVLFFBQVEsQ0FBQyxNQUFNO0FBQ3JCLGVBQU8sS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQUEsTUFDbkMsQ0FBQztBQUFBLElBQ0wsT0FBTztBQUNILGFBQU8sS0FBSyxHQUFHLGNBQWMsU0FBUyxDQUFDO0FBQUEsSUFDM0M7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEdBekxhOzs7QUNTVixJQUFVO0FBQUEsQ0FBVixDQUFVRSxVQUFWO0FBTUUsRUFBTUEsTUFBQSxVQUFVLENBQUMsU0FBa0M7QUFDeEQsVUFBTSxrQkFBa0IsS0FBSyxJQUFJLFdBQVcsS0FBSyxLQUFLLEtBQUssV0FBVztBQUN0RSxVQUFNLGVBQWUsS0FBSyxVQUFVLFdBQVcsS0FBSyxLQUFLLFVBQVUsV0FBVztBQUM5RSxXQUFPLG1CQUFtQjtBQUFBLEVBQzVCO0FBRU8sRUFBTUEsTUFBQSxRQUFRLENBQUMsTUFBc0IsVUFBd0M7QUFDbEYsUUFBSSxLQUFLLEtBQUssV0FBVyxLQUFLLEtBQUssSUFBSSxXQUFXLEdBQUc7QUFFbkQsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLGFBQWEsS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLFVBQVUsU0FBUyxXQUFXLEtBQUssQ0FBQztBQUVwRixVQUFNLGFBQWEsV0FBVyxXQUFXLEtBQUssV0FBVyxLQUFLLE1BQU0sTUFBTTtBQUUxRSxVQUFNLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLFVBQVUsU0FBUyxXQUFXLEtBQUssQ0FBQyxFQUFFLE1BQU0sTUFBTSxNQUFNO0FBRXRHLFdBQU8sYUFBYTtBQUFBLEVBQ3RCO0FBQUEsR0F6QmU7OztBQ01WLElBQU0sYUFBTixNQUF1QjtBQUFBLEVBQzVCLGNBQWM7QUFBQSxFQUFDO0FBQUEsRUFFZixTQUFTLE9BQXFCLE9BQWtDO0FBQzlELFVBQU0sU0FBNEIsQ0FBQztBQUNuQyxVQUFNLFdBQTBCLENBQUM7QUFDakMsVUFBTSxRQUFRLENBQUMsU0FBUztBQUN0QixVQUFJLEtBQUssUUFBUSxJQUFJLEdBQUc7QUFDdEIsZUFBTyxLQUFLLEVBQUUsU0FBUyxpQkFBaUIsS0FBSyxHQUFHLENBQUM7QUFBQSxNQUNuRCxXQUFXLEtBQUssTUFBTSxNQUFNLEtBQUssR0FBRztBQUNsQyxjQUFNLFFBQXFCO0FBQUEsVUFDekIsaUJBQWlCLEtBQUs7QUFBQSxVQUN0QixnQkFBZ0IsS0FBSyxNQUFNO0FBQUEsVUFDM0IsWUFBWSxDQUFDLEdBQUcsS0FBSyxTQUFTO0FBQUEsUUFDaEM7QUFDQSxpQkFBUyxLQUFLLEtBQUs7QUFBQSxNQUNyQjtBQUFBLElBQ0YsQ0FBQztBQUNELFdBQU8sRUFBRSxVQUFVLE9BQU87QUFBQSxFQUM1QjtBQUFBLEVBRUEsTUFBTSxNQUFrQixPQUF3QjtBQUU5QyxXQUFPLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFBQSxFQUMvQjtBQUNGOzs7QUMxQ08sSUFBTSxVQUFOLE1BQWM7QUFBQSxFQUNULGdCQUF1QyxDQUFDO0FBQUEsRUFDeEMsV0FBc0IsQ0FBQztBQUFBLEVBQ3ZCLGVBQWUsb0JBQUksSUFBWTtBQUFBLEVBQy9CLG1CQUFtQixvQkFBSSxJQUFZO0FBQUEsRUFDbkMsWUFBdUIsQ0FBQztBQUFBLEVBQ2hDLFlBQVksUUFBbUIsQ0FBQyxHQUFHO0FBQy9CLFNBQUssU0FBUyxLQUFLO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsU0FBUyxPQUFrQjtBQUN2QixTQUFLLFdBQVcsQ0FBQyxHQUFHLEtBQUs7QUFDekIsU0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLO0FBQzFCLFNBQUssZUFBZSxvQkFBSSxJQUFJO0FBQzVCLFNBQUssbUJBQW1CLG9CQUFJLElBQUk7QUFDaEMsU0FBSyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUFBLEVBQ3REO0FBQUEsRUFFQSxNQUF1QjtBQUNuQixVQUFNLE9BQU8sS0FBSyxVQUFVLE1BQU07QUFFbEMsV0FBTyxRQUFRO0FBQUEsRUFDbkI7QUFBQSxFQUVBLE9BQXdCO0FBQ3BCLFVBQU0sT0FBTyxLQUFLLFVBQVUsQ0FBQztBQUM3QixXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUFBLEVBRUEsZUFBZSxRQUF5QjtBQUNwQyxVQUFNLFFBQVEsS0FBSyxVQUFVLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxNQUFNO0FBQzdELFFBQUksUUFBUSxHQUFHO0FBQ1gsYUFBTztBQUFBLElBQ1g7QUFDQSxTQUFLLFlBQVksS0FBSyxVQUFVLE1BQU0sS0FBSztBQUMzQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsWUFBWSxLQUF3QjtBQUNoQyxRQUFJLE1BQU0sUUFBUSxHQUFHLEdBQUc7QUFDcEIsVUFBSSxRQUFRLENBQUNDLFNBQVE7QUFDakIsYUFBSyxhQUFhLElBQUlBLElBQUc7QUFBQSxNQUM3QixDQUFDO0FBQUEsSUFDTCxPQUFPO0FBQ0gsV0FBSyxhQUFhLElBQUksR0FBRztBQUFBLElBQzdCO0FBQ0EsU0FBSyxnQkFBZ0I7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxvQkFBb0IsT0FBa0I7QUFDbEMsU0FBSyxVQUFVLFFBQVEsR0FBRyxLQUFLO0FBQUEsRUFDbkM7QUFBQSxFQUVBLGVBQWUsUUFBMkI7QUFDdEMsUUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQ3ZCLGFBQU8sUUFBUSxDQUFDLE9BQU87QUFDbkIsYUFBSyxpQkFBaUIsSUFBSSxFQUFFO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0wsT0FBTztBQUNILFdBQUssaUJBQWlCLElBQUksTUFBTTtBQUFBLElBQ3BDO0FBQ0EsU0FBSyxnQkFBZ0I7QUFBQSxFQUV6QjtBQUFBLEVBRVEsa0JBQWtCO0FBQ3RCLFNBQUssWUFBWSxLQUFLLFVBQVUsT0FBTyxDQUFDLE1BQU07QUFDMUMsWUFBTSxPQUFPLEVBQUUsUUFBUSxDQUFDO0FBQ3hCLFlBQU0sbUJBQW1CLENBQUMsS0FBSyxLQUFLLENBQUMsUUFBUSxLQUFLLGFBQWEsSUFBSSxHQUFHLENBQUM7QUFDdkUsWUFBTSxxQkFBcUIsQ0FBQyxLQUFLLGlCQUFpQixJQUFJLEVBQUUsRUFBRTtBQUMxRCxhQUFPLHNCQUFzQjtBQUFBLElBQ2pDLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFDQSxJQUFJLFVBQW1CO0FBQ25CLFdBQU8sS0FBSyxVQUFVLFdBQVc7QUFBQSxFQUNyQztBQUFBLEVBQ0EsSUFBSSxPQUFlO0FBQ2YsV0FBTyxLQUFLLFVBQVU7QUFBQSxFQUMxQjtBQUFBLEVBQ0EsSUFBSSxZQUFvQjtBQUNwQixXQUFPLEtBQUssY0FBYztBQUFBLEVBQzlCO0FBQ0o7OztBQ3BGTyxJQUFNLFVBQU4sTUFBYztBQUFBLEVBQ1gsVUFBVSxJQUFJLFdBQVc7QUFBQSxFQUN6QixhQUFhLElBQUksV0FBMkM7QUFBQSxFQUM1RCxVQUFVLElBQUksUUFBUTtBQUFBLEVBQ3RCO0FBQUEsRUFFUixZQUFZLE1BQW1CO0FBQzdCLFNBQUssT0FBTztBQUNaLFNBQUssUUFBUSxTQUFTLEtBQUssS0FBSztBQUFBLEVBQ2xDO0FBQUEsRUFFQSxZQUFZLGFBQTBCO0FBQ3BDLFlBQVEsSUFBSSxnQkFBZ0IsV0FBVztBQUN2QyxTQUFLLFFBQVEsYUFBYSxXQUFXO0FBQ3JDLFVBQU0sUUFBUSxLQUFLLFFBQVEsU0FBUztBQUNwQyxVQUFNLFNBQVMsS0FBSyxXQUFXLFNBQVMsS0FBSyxLQUFLLE9BQU8sS0FBSztBQUM5RCxVQUFNLGdCQUFnQixPQUFPO0FBQzdCLFVBQU0sVUFBVSxjQUFjLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQztBQUM3RCxZQUFRLFFBQVEsQ0FBQyxNQUFNO0FBQ3JCLGNBQVEsSUFBSSxFQUFFLE9BQU87QUFDckIsY0FBUSxFQUFFLE1BQU07QUFBQSxRQUNkLEtBQUs7QUFDSCxlQUFLLFFBQVEsZUFBZSxFQUFFLFFBQVEsTUFBTTtBQUM1QztBQUFBLFFBQ0YsS0FBSztBQUNILGVBQUssUUFBUSxlQUFlLEVBQUUsUUFBUSxPQUFPO0FBQzdDO0FBQUEsUUFDRixLQUFLO0FBQ0gsZUFBSyxRQUFRLFlBQVksRUFBRSxRQUFRLE1BQU07QUFDekM7QUFBQSxRQUNGO0FBQ0Usa0JBQVEsSUFBSSxrQkFBa0IsQ0FBQztBQUMvQixnQkFBTSxRQUFlO0FBQUEsTUFDekI7QUFBQSxJQUNGLENBQUM7QUFDRCxZQUFRLElBQUksT0FBTztBQUFBLEVBQ3JCO0FBQUEsRUFFQSxhQUFpQztBQUMvQixXQUFPLEtBQUssUUFBUSxXQUFXO0FBQUEsRUFDakM7QUFBQSxFQUVRLGFBQWEsUUFBZ0I7QUFDbkMsU0FBSyxRQUFRLGVBQWUsTUFBTTtBQUFBLEVBQ3BDO0FBQUEsRUFFQSx3QkFBd0IsU0FBNEI7QUFDbEQsWUFBUSxRQUFRLE1BQU07QUFBQSxNQUNwQixLQUFLO0FBRUg7QUFBQSxNQUNGLEtBQUs7QUFDSCxhQUFLLGFBQWEsUUFBUSxRQUFRLE1BQU07QUFDeEM7QUFBQSxNQUNGLEtBQUs7QUFDSCxhQUFLLG1CQUFtQixRQUFRLFFBQVEsVUFBVTtBQUNsRDtBQUFBLE1BRUY7QUFDRSxjQUFNLFdBQVcsT0FBTztBQUFBLElBQzVCO0FBQUEsRUFDRjtBQUFBLEVBRUEsY0FBK0I7QUFFN0IsV0FBTyxLQUFLLFFBQVEsSUFBSTtBQUFBLEVBQzFCO0FBQUEsRUFFUSxtQkFBbUIsSUFBWTtBQUNyQyxVQUFNLE1BQU0sS0FBSyxLQUFLLGVBQWUsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7QUFDNUQsUUFBSSxLQUFLO0FBQ1AsV0FBSyxRQUFRLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFBQSxJQUNqRCxPQUFPO0FBQUEsSUFHUDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksWUFBb0I7QUFDdEIsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN0QjtBQUNGOzs7QUM1RU8sSUFBVTtBQUFBLENBQVYsQ0FBVUMsbUJBQVY7QUFFSSxFQUFNQSxlQUFBLGVBQWUsQ0FBQyxhQUFvRDtBQUM3RSxVQUFNLE1BQU0sb0JBQUksSUFBb0Q7QUFDcEUsY0FBVSxRQUFRLENBQUMsTUFBTTtBQUNyQixZQUFNLE9BQU8sRUFBRTtBQUNmLFlBQU0sVUFBVSxJQUFJLElBQUksSUFBSTtBQUM1QixZQUFNLFVBQVUsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLFVBQUksSUFBSSxNQUFNLE9BQU87QUFBQSxJQUN6QixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFBQSxHQVhhOzs7QUNKVixJQUFlLFdBQWYsTUFBK0M7QUFBQSxFQUMvQjtBQUFBLEVBQ1gsd0JBQXdCO0FBQUEsRUFDdkI7QUFBQSxFQUNELGtCQUFrQjtBQUFBLEVBQ2hCLFlBQTZCO0FBQUEsSUFDbkMsVUFBVSxFQUFFLE9BQU8sTUFBTSxPQUFPLElBQUk7QUFBQSxJQUNwQyxZQUFZO0FBQUEsSUFDWixXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsRUFDYjtBQUFBO0FBQUEsRUFHaUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ1Q7QUFBQSxFQUNPO0FBQUEsRUFDRSxnQkFBZ0Isb0JBQUksSUFBZ0I7QUFBQSxFQUU3QyxZQUNOLElBQ0EsVUFDQSxZQUNBLEtBQ0EsT0FDRjtBQUNFLFNBQUssS0FBSztBQUNWLFNBQUssS0FBSyxJQUFJO0FBQ2QsU0FBSyxVQUFVO0FBRWYsU0FBSyxhQUFhO0FBQ2xCLFNBQUssV0FBVztBQUNoQixTQUFLLGdCQUFnQixjQUFjLGFBQWEsSUFBSSxhQUFhO0FBQ2pFLFNBQUssUUFBUTtBQUViLFNBQUssaUJBQWlCLEtBQUssZUFBZSxLQUFLLElBQUk7QUFDbkQsU0FBSyxHQUFHLFVBQVUsS0FBSztBQUd2QixTQUFLLGNBQWMsS0FBSyxZQUFZLEtBQUssSUFBSTtBQUM3QyxTQUFLLEdBQUcsY0FBYyxLQUFLO0FBRTNCLFFBQUksS0FBSztBQUNMLFdBQUssYUFBYSxLQUFLLEtBQUs7QUFBQSxJQUNoQztBQUNBLFVBQU0sc0JBQXNCLEtBQUssV0FBVyxVQUFVLENBQUMsTUFBTTtBQUN6RCxVQUFJLEVBQUUsU0FBUywyQkFBMkIsRUFBRSxhQUFhLEtBQUssSUFBSTtBQUM5RCxhQUFLLFNBQVMsRUFBRSxRQUFRLE9BQU87QUFBQSxNQUNuQztBQUNBLFVBQUksRUFBRSxTQUFTLG1DQUFtQyxFQUFFLGFBQWEsS0FBSyxJQUFJO0FBQ3RFLGFBQUssd0JBQXdCO0FBQUEsTUFDakM7QUFDQSxVQUFJLEVBQUUsU0FBUyxrQ0FBa0MsRUFBRSxhQUFhLEtBQUssSUFBSTtBQUNyRSxhQUFLLHdCQUF3QjtBQUFBLE1BQ2pDO0FBQ0EsVUFBSSxFQUFFLFNBQVMsNkJBQTZCLEVBQUUsYUFBYSxLQUFLLElBQUk7QUFDaEUsZ0JBQVEsSUFBSSwrQ0FBK0M7QUFBQSxNQUMvRDtBQUFBLElBQ0osR0FBRyxLQUFLLEVBQUU7QUFFVixVQUFNLG9CQUFvQixLQUFLLFNBQVMsVUFBVSxDQUFDLFVBQVU7QUFDekQsWUFBTSxXQUFXLEtBQUssY0FBYyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFFeEQsWUFBTSxXQUFXLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQzFELGVBQVMsUUFBUSxDQUFDLFlBQVk7QUFDMUIsYUFBSyxXQUFXLEtBQUssT0FBTztBQUFBLE1BRWhDLENBQUM7QUFFRCxVQUFJLE1BQU0sU0FBUyw0QkFBNEI7QUFDM0MsZ0JBQVEsSUFBSSw0QkFBNEI7QUFDeEMsYUFBSyxhQUFhLENBQUMsQ0FBQztBQUFBLE1BQ3hCO0FBRUEsVUFBSSxNQUFNLFNBQVMsb0NBQW9DO0FBQ25ELGFBQUssb0JBQW9CLE1BQU0sSUFBSTtBQUFBLE1BQ3ZDO0FBQUEsSUFDSixHQUFHLFdBQVc7QUFDZCxTQUFLLFVBQVU7QUFDZixTQUFLLGNBQWMsSUFBSSxtQkFBbUI7QUFDMUMsU0FBSyxjQUFjLElBQUksaUJBQWlCO0FBQUEsRUFDNUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlGUSxvQkFBb0IsUUFBaUM7QUFDekQsVUFBTSxnQkFBZ0IsS0FBSyxRQUFRO0FBQ25DLFFBQUksQ0FBQyxlQUFlO0FBQ2hCO0FBQUEsSUFDSjtBQUNBLFVBQU0sZ0JBQWdCLGNBQWMsT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLE9BQU8sU0FBUztBQUNsRixrQkFBYyxRQUFRLENBQUMsTUFBTTtBQUN6QixVQUFJLE9BQU8sTUFBTTtBQUNiLFVBQUUsU0FBUyxRQUFRLENBQUMsWUFBWTtBQUU1QixlQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsUUFDaEMsQ0FBQztBQUFBLE1BQ0wsT0FBTztBQUNILFVBQUUsVUFBVSxRQUFRLENBQUMsWUFBWTtBQUU3QixlQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsUUFDaEMsQ0FBQztBQUFBLE1BQ0w7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUdMO0FBQUEsRUFFUSxlQUFlLEdBQWU7QUFFbEMsUUFBSSxDQUFDLEtBQUssdUJBQXVCO0FBQzdCLGNBQVEsSUFBSSxLQUFLLEtBQUssZ0JBQWdCO0FBQ3RDO0FBQUEsSUFDSjtBQUNBLFVBQU0sY0FBYyxLQUFLLFFBQVE7QUFFakMsUUFBSSxlQUFlLFlBQVksU0FBUyxHQUFHO0FBRXZDLFdBQUssU0FBUyxLQUFLO0FBQUEsUUFDZixNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixZQUFZLEtBQUs7QUFBQSxRQUNqQixNQUFNLEVBQUUsV0FBVyxLQUFLLEdBQUc7QUFBQSxRQUMzQixXQUFXLFdBQVcsSUFBSTtBQUFBLE1BQzlCLENBQUM7QUFDRCxrQkFBWSxRQUFRLENBQUMsWUFBWTtBQUM3QixhQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQUEsRUFFUSxZQUFZLEdBQWU7QUFBQSxFQUVuQztBQUFBLEVBRUEsU0FBUyxPQUF3QjtBQUM3QixTQUFLLGFBQWEsS0FBSztBQUFBLEVBQzNCO0FBQUEsRUFFQSxlQUFlLFFBQXFCO0FBQ2hDLFdBQU8sT0FBTyxLQUFLLEVBQUU7QUFBQSxFQUV6QjtBQUFBLEVBRVEsd0JBQXdCLEtBQW1CO0FBQy9DLFNBQUssa0JBQWtCO0FBQ3ZCLFVBQU0sRUFBRSxXQUFXLFFBQVEsSUFBSTtBQUUvQixVQUFNLFlBQVksS0FBSyxHQUFHLFFBQVEsV0FBVyxRQUFRLFFBQVE7QUFDN0QsY0FBVSxXQUFXLENBQUMsTUFBOEI7QUFDaEQsY0FBUSxJQUFJLEVBQUUsSUFBSTtBQUNsQixXQUFLLGtCQUFrQjtBQUFBLElBQzNCO0FBQ0EsY0FBVSxXQUFXLE1BQU07QUFDdkIsY0FBUSxLQUFLLHdCQUF3QixVQUFVLEVBQUU7QUFDakQsV0FBSyxrQkFBa0I7QUFBQSxJQUMzQjtBQUNBLGNBQVUsV0FBVyxNQUFNO0FBQ3ZCLGNBQVEsS0FBSyx5QkFBeUIsVUFBVSxFQUFFO0FBQ2xELFdBQUssa0JBQWtCO0FBQUEsSUFDM0I7QUFBQSxFQUNKO0FBQUEsRUFFUSxZQUFZO0FBQ2hCLFdBQU8sVUFBVSxLQUFLLEVBQUU7QUFBQSxFQUM1QjtBQUFBLEVBRVUsYUFBYSxPQUF3QjtBQUMzQyxTQUFLLFlBQVksT0FBTyxPQUFPLEtBQUssV0FBVyxLQUFLO0FBQ3BELFdBQU8sWUFBWSxLQUFLLElBQUksS0FBSyxXQUFXLEtBQUssTUFBTSxLQUFLO0FBQzVELFdBQU8saUJBQWlCLEtBQUssRUFBRTtBQUFBLEVBQ25DO0FBQ0o7OztBQzlQTyxJQUFNLE9BQU4sY0FBbUIsU0FBeUI7QUFBQSxFQUM5QixNQUFNO0FBQUEsRUFDSixlQUFlLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUFBLEVBQ3hDLFdBQWdDLENBQUM7QUFBQSxFQUV6QyxZQUNJLEtBQ0EsVUFDQSxlQUNBLE9BQ0EsVUFDRjtBQUNFLFVBQU0sSUFBSSxTQUFTLGNBQWMsS0FBSztBQUN0QyxVQUFNLEdBQUcsVUFBVSxlQUFlLEtBQUssS0FBSztBQUM1QyxTQUFLLFdBQVc7QUFFaEIsU0FBSyxTQUFTLFFBQVEsQ0FBQyxVQUFVO0FBQzdCLFlBQU0sZUFBZSxLQUFLLEVBQUU7QUFBQSxJQUNoQyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsVUFBZ0I7QUFDWixTQUFLLGNBQWMsUUFBUSxDQUFDLGdCQUFnQjtBQUN4QyxrQkFBWTtBQUFBLElBQ2hCLENBQUM7QUFDRCxTQUFLLFNBQVMsUUFBUSxDQUFDLFVBQVU7QUFDN0IsWUFBTSxRQUFRO0FBQUEsSUFDbEIsQ0FBQztBQUFBLEVBQ0w7QUFDSjs7O0FDOUJPLElBQU0sT0FBTixNQUFNLGNBQWEsU0FBMkI7QUFBQSxFQU9qRCxZQUNxQixLQUNBLGVBQ1IsVUFDQSxjQUNYO0FBQ0UsVUFBTSxTQUFTLGNBQWMsS0FBSyxHQUFHLFVBQVUsZUFBZSxLQUFLLFlBQVk7QUFMOUQ7QUFDQTtBQUNSO0FBQ0E7QUFHVCxVQUFLLGVBQWU7QUFDcEIsU0FBSyxhQUFhLE1BQUs7QUFDdkIsU0FBSyxNQUFNLFlBQVksTUFBSyxjQUFjO0FBQzFDLFNBQUssYUFBYSxnQkFBZ0IsTUFBSyxjQUFjO0FBQ3JELFNBQUssR0FBRyxVQUFVO0FBQ2xCLFNBQUssR0FBRyxNQUFNLFdBQVc7QUFDekIsU0FBSyxTQUFTLElBQUksS0FBSztBQUN2QixTQUFLLFlBQVksV0FBVyxJQUFJO0FBRWhDLFNBQUssVUFBVSxLQUFLLFFBQVEsS0FBSyxJQUFJO0FBQ3JDLFNBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBRW5DLFNBQUssR0FBRyxTQUFTLEtBQUs7QUFDdEIsU0FBSyxHQUFHLFVBQVUsS0FBSztBQUV2QixTQUFLLEdBQUcsTUFBTSxJQUFJO0FBQ2xCLFlBQVEsS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUNoQztBQUFBLEVBOUJBLE9BQWUsY0FBYztBQUFBLEVBQ1o7QUFBQSxFQUNSO0FBQUEsRUFDQTtBQUFBLEVBQ1E7QUFBQSxFQTRCakIsTUFBWTtBQUFBLEVBQUM7QUFBQSxFQUViLFNBQVMsT0FBZTtBQUNwQixZQUFRLElBQUksS0FBSztBQUNqQixTQUFLLFNBQVMsS0FBSyxTQUFTO0FBQUEsRUFDaEM7QUFBQSxFQUNBLFVBQVU7QUFDTixTQUFLLGNBQWMsUUFBUSxDQUFDLGdCQUFnQjtBQUN4QyxrQkFBWTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFUSxRQUFRLElBQW9CO0FBQ2hDLFFBQUksY0FBYyxPQUFPO0FBQ3JCLGNBQVEsSUFBSSxLQUFLLE1BQU0sTUFBTSxHQUFHLElBQUk7QUFBQSxJQUN4QyxPQUFPO0FBQ0gsY0FBUSxJQUFJLEtBQUssTUFBTSxFQUFFO0FBQUEsSUFDN0I7QUFBQSxFQUNKO0FBQUEsRUFFUSxPQUFPLEdBQVU7QUFDckIsVUFBTSxXQUFXLFdBQVcsUUFBUSxLQUFLLFNBQVM7QUFFbEQsU0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLFlBQVksS0FBSztBQUFBLE1BQ2pCLFdBQVcsV0FBVyxJQUFJO0FBQUEsTUFDMUIsTUFBTTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLGVBQWUsS0FBSyxHQUFHO0FBQUEsUUFDdkIsY0FBYyxLQUFLLEdBQUc7QUFBQSxRQUN0QixRQUFRLEtBQUssR0FBRztBQUFBLFFBQ2hCLE9BQU8sS0FBSyxHQUFHO0FBQUEsTUFDbkI7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQ0o7OztBQ3ZFTyxJQUFNLFFBQU4sY0FBb0IsU0FBK0I7QUFBQSxFQUNyQyxNQUFNO0FBQUEsRUFDYixlQUFlLENBQUM7QUFBQSxFQUUxQixZQUFZLEtBQWUsVUFBb0IsZUFBNEIsT0FBcUI7QUFDNUYsVUFBTSxTQUFTLGNBQWMsR0FBRyxHQUFHLFVBQVUsZUFBZSxLQUFLLEtBQUs7QUFDdEUsU0FBSyxHQUFHLE1BQU0sV0FBVztBQUN6QixTQUFLLEdBQUcsWUFBWSxLQUFLLElBQUk7QUFDN0IsU0FBSyxTQUFTLElBQUksS0FBSztBQUFBLEVBQzNCO0FBQUEsRUFFQSxTQUFTLE9BQWU7QUFDcEIsU0FBSyxTQUFTLEtBQUssU0FBUztBQUM1QixVQUFNLFdBQVcsS0FBSyxHQUFHLE1BQU07QUFDL0IsWUFBUSxJQUFJLEtBQUssTUFBTSxZQUFZLFFBQVEsZ0JBQWdCLFFBQVE7QUFBQSxFQUN2RTtBQUFBLEVBRUEsVUFBVTtBQUNOLFNBQUssY0FBYyxRQUFRLENBQUMsZ0JBQWdCO0FBQ3hDLGtCQUFZO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0w7QUFDSjs7O0FDbkJPLElBQU0saUJBQWlCLENBQzFCLEtBQ0EsV0FDQSxVQUNBLFVBQ2dCO0FBQ2hCLFVBQVEsSUFBSSxNQUFNO0FBQUEsSUFDZCxLQUFLO0FBQ0QsWUFBTSxXQUFXLHFCQUFxQixLQUFLLFdBQVcsVUFBVSxLQUFLO0FBQ3JFLFlBQU0sU0FBUyxJQUFJLEtBQUssS0FBSyxVQUFVLFdBQVcsT0FBTyxRQUFRO0FBQ2pFLGFBQU87QUFBQSxJQUNYLEtBQUs7QUFDRCxhQUFPLElBQUksS0FBSyxLQUFLLFdBQVcsVUFBVSxLQUFLO0FBQUEsSUFDbkQsS0FBSztBQUNELGFBQU8sSUFBSSxNQUFNLEtBQUssVUFBVSxXQUFXLEtBQUs7QUFBQSxJQUNwRDtBQUNJLFlBQU0sUUFBZTtBQUNyQixZQUFNLElBQUksTUFBTSxtREFBbUQ7QUFBQSxFQUUzRTtBQUNKO0FBRUEsSUFBTSx1QkFBdUIsQ0FDekIsS0FDQSxlQUNBLFVBQ0EsVUFDbUI7QUFDbkIsUUFBTSxXQUFXLElBQUk7QUFDckIsUUFBTSxXQUFnQyxDQUFDO0FBRXZDLFdBQVMsUUFBUSxDQUFDQyxTQUFRO0FBQ3RCLFFBQUlBLEtBQUksU0FBUyxLQUFLO0FBQ2xCLFlBQU0sVUFBVSxJQUFJLE1BQU1BLE1BQUssVUFBVSxlQUFlLEtBQUs7QUFDN0QsZUFBUyxLQUFLLE9BQU87QUFBQSxJQUN6QjtBQUNBLFFBQUlBLEtBQUksU0FBUyxPQUFPO0FBQ3BCLFlBQU0sV0FBVyxJQUFJLEtBQUtBLE1BQUssZUFBZSxVQUFVLEtBQUs7QUFDN0QsZUFBUyxLQUFLLFFBQVE7QUFBQSxJQUMxQjtBQUFBLEVBQ0osQ0FBQztBQUNELFNBQU87QUFDWDs7O0FDM0NPLElBQU0sUUFBTixNQUFZO0FBQUE7QUFBQSxFQVFqQixZQUNtQixLQUNqQixVQUNBLFlBQ0EsT0FDQTtBQUppQjtBQUtqQixTQUFLLFdBQVc7QUFDaEIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssUUFBUTtBQUNiLFNBQUssV0FBVyxJQUFJLFNBQVMsSUFBSSxDQUFDQyxTQUFRLGVBQWVBLE1BQUssS0FBSyxZQUFZLEtBQUssVUFBVSxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQzNHO0FBQUEsRUFqQmlCLE1BQU07QUFBQSxFQUNmLFdBQW9DLENBQUM7QUFBQSxFQUM1QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFlakIsZUFBZSxRQUFxQjtBQUVsQyxTQUFLLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFDNUIsU0FBRyxlQUFlLE1BQU07QUFBQSxJQUUxQixDQUFDO0FBR0QsU0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixXQUFXLFdBQVcsSUFBSTtBQUFBLE1BQzFCLFVBQVU7QUFBQSxNQUNWLFlBQVksS0FBSztBQUFBLE1BQ2pCLE1BQU0sRUFBRSxRQUFRLEtBQUssR0FBRztBQUFBLElBQzFCLENBQUM7QUFBQSxFQUVIO0FBQUEsRUFFQSxVQUFVO0FBQ1IsU0FBSyxTQUFTLFFBQVEsQ0FBQyxPQUFPO0FBQzVCLFNBQUcsUUFBUTtBQUFBLElBQ2IsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLE1BQVk7QUFBQSxFQUVaO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFDUCxXQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xCO0FBQ0Y7OztBQzNETyxJQUFNLGVBQU4sTUFBbUI7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLEVBQ1Qsa0JBQWtCO0FBQUEsRUFDbEIsaUJBQWlCO0FBQUEsRUFFekIsSUFBSSxRQUFRO0FBQ1YsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRUEsSUFBSSxhQUFhO0FBQ2YsV0FBTyxLQUFLLGFBQWEsS0FBSztBQUFBLEVBQ2hDO0FBQUEsRUFDQSxJQUFJLFlBQVk7QUFDZCxXQUFPLEtBQUssWUFBWSxLQUFLO0FBQUEsRUFDL0I7QUFBQSxFQUVRLFNBQVM7QUFBQSxFQUVBLGNBQWMsb0JBQUksSUFBNkI7QUFBQSxFQUVoRSxZQUFZLFFBQW9HO0FBQzlHLFNBQUssYUFBYSxPQUFPO0FBQ3pCLFNBQUssWUFBWSxPQUFPO0FBQ3hCLFNBQUssa0JBQWtCLE9BQU87QUFDOUIsU0FBSyxpQkFBaUIsT0FBTztBQUM3QixTQUFLLFlBQVk7QUFBQSxFQUNuQjtBQUFBLEVBRUEsbUJBQW1CLFFBQTJDO0FBQzVELFNBQUssaUJBQWlCLE9BQU87QUFDN0IsU0FBSyxrQkFBa0IsT0FBTztBQUM5QixTQUFLLFlBQVk7QUFBQSxFQUNuQjtBQUFBLEVBQ1EsY0FBYztBQUNwQixVQUFNLFVBQVUsTUFBTSxLQUFLLEtBQUssWUFBWSxLQUFLLFNBQVM7QUFDMUQsVUFBTSxRQUFRLFFBQVEsRUFBRSxRQUFRLEtBQUssaUJBQWlCLE9BQU8sS0FBSyxlQUFlLENBQUM7QUFDbEYsVUFBTSxhQUFhLEtBQUssVUFBVTtBQUNsQyxTQUFLLFNBQVM7QUFDZCxRQUFJLFlBQVk7QUFDZCxXQUFLLFlBQVksUUFBUSxDQUFDLE9BQU87QUFDL0IsV0FBRyxLQUFLLE1BQU07QUFBQSxNQUNoQixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFNBQVMsb0JBQTZDLGNBQXNCO0FBRTFFLFNBQUssWUFBWSxJQUFJLGtCQUFrQjtBQUN2Qyx1QkFBbUIsS0FBSyxNQUFNO0FBQzlCLFdBQU8sTUFBTTtBQUNYLFdBQUssWUFBWSxPQUFPLGtCQUFrQjtBQUFBLElBQzVDO0FBQUEsRUFDRjtBQUNGO0FBQ08sSUFBVTtBQUFBLENBQVYsQ0FBVUMsV0FBVjtBQUNFLEVBQU1BLE9BQUEsT0FBTyxDQUFDLFlBQW9CLGNBQXNCO0FBQzdELFdBQU8sQ0FBQyxjQUFpRDtBQUN2RCxZQUFNLGNBQWMsVUFBVSxTQUFTO0FBQ3ZDLFlBQU0sYUFBYSxVQUFVLFFBQVE7QUFDckMsYUFBTyxLQUFLLElBQUksYUFBYSxVQUFVO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBSU8sRUFBTUEsT0FBQSx1QkFBdUIsQ0FBQyxVQUFrQjtBQUNyRCxXQUFPLENBQUMsVUFBa0IsUUFBUTtBQUFBLEVBQ3BDO0FBQUEsR0FiZTs7O0FDckRWLElBQU0sbUJBQU4sTUFBdUI7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLFdBQVcsb0JBQUksSUFBdUI7QUFBQSxFQUN0QyxXQUFXLG9CQUFJLElBQXVCO0FBQUEsRUFDdkQsWUFBWSxNQUE2RTtBQUdyRixTQUFLLE9BQU8sUUFBUSxDQUFDLFVBQVU7QUFDM0IsV0FBSyxTQUFTLElBQUksTUFBTSxJQUFJLEtBQUs7QUFBQSxJQUNyQyxDQUFDO0FBQ0QsU0FBSyxNQUFNLFFBQVEsQ0FBQyxVQUFVO0FBQzFCLFdBQUssU0FBUyxJQUFJLE1BQU0sSUFBSSxLQUFLO0FBQUEsSUFDckMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLGFBQWEsSUFBK0I7QUFDeEMsVUFBTSxhQUFhLEtBQUssU0FBUyxJQUFJLEVBQUU7QUFDdkMsUUFBSSxDQUFDLFlBQVk7QUFDYixjQUFRLE1BQU0sS0FBSyxNQUFNLGlCQUFpQixLQUFLLGFBQWE7QUFBQSxJQUNoRTtBQUNBLFdBQU8sY0FBYztBQUFBLEVBQ3pCO0FBQUEsRUFFQSxhQUFhLElBQStCO0FBQ3hDLFVBQU0sYUFBYSxLQUFLLFNBQVMsSUFBSSxFQUFFO0FBQ3ZDLFFBQUksQ0FBQyxZQUFZO0FBQ2IsY0FBUSxNQUFNLEtBQUssTUFBTSxpQkFBaUIsS0FBSyxhQUFhO0FBQUEsSUFDaEU7QUFDQSxXQUFPLGNBQWM7QUFBQSxFQUN6QjtBQUNKOzs7QUNoQ08sSUFBTSxLQUFOLE1BQU0sSUFBNEI7QUFBQSxFQUNyQyxZQUFxQixPQUFVO0FBQVY7QUFBQSxFQUFXO0FBQUEsRUFDaEMsT0FBc0I7QUFDbEIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLFlBQWdDO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxJQUFPLEdBQTRCO0FBQy9CLFVBQU0sUUFBUSxFQUFFLEtBQUssS0FBSztBQUMxQixXQUFPLElBQUksSUFBTSxLQUFLO0FBQUEsRUFDMUI7QUFDSjtBQUVPLElBQU0sVUFBTixNQUFNLFNBQWlDO0FBQUEsRUFDMUMsWUFBcUIsU0FBaUI7QUFBakI7QUFBQSxFQUFrQjtBQUFBLEVBQ3ZDLFlBQWdDO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxPQUFzQjtBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsSUFBTyxJQUE2QjtBQUNoQyxXQUFPLElBQUksU0FBVyxLQUFLLE9BQU87QUFBQSxFQUN0QztBQUNKO0FBU08sSUFBVTtBQUFBLENBQVYsQ0FBVUMsWUFBVjtBQUNJLEVBQU1BLFFBQUEsS0FBSyxDQUFJLFVBQWEsSUFBSSxHQUFNLEtBQUs7QUFDM0MsRUFBTUEsUUFBQSxVQUFVLENBQUksWUFBb0IsSUFBSSxRQUFXLE9BQU87QUFBQSxHQUZ4RDs7O0FDaENWLElBQVU7QUFBQSxDQUFWLENBQVVDLFlBQVY7QUFtREksRUFBTUEsUUFBQSxtQkFBbUIsQ0FBQyxjQUEyRDtBQUN4RixRQUFJLENBQUMsV0FBVztBQUNaLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FDSSxVQUFVLFNBQVMsZ0JBQ25CLFVBQVUsU0FBUyxzQkFDbkIsVUFBVSxTQUFTO0FBQUEsRUFFM0I7QUFFTyxFQUFNQSxRQUFBLG1CQUFtQixDQUFDLGFBQTJEO0FBQ3hGLFdBQU8sWUFBWSxTQUFTLFNBQVM7QUFBQSxFQUN6QztBQWFPLEVBQU1BLFFBQUEsb0JBQW9CLENBQUMsTUFBbUIsVUFBa0I7QUFDbkUsVUFBTSxPQUFxQjtBQUFBLE1BQ3ZCLE1BQU07QUFBQSxNQUNOLGFBQWEsS0FBSztBQUFBLE1BQ2xCLGdCQUFnQixLQUFLLG1CQUFtQix5QkFBeUIsS0FBSztBQUFBLE1BQ3RFO0FBQUEsTUFDQSxPQUFPLGdCQUFnQjtBQUFBLElBQzNCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFFTyxFQUFNQSxRQUFBLG1CQUFtQixDQUFDLE1BQWtCLFVBQWtCO0FBQ2pFLFVBQU0sT0FBb0I7QUFBQSxNQUN0QixNQUFNO0FBQUEsTUFDTixhQUFhLEtBQUs7QUFBQSxNQUNsQixnQkFBZ0IseUJBQXlCLEtBQUs7QUFBQSxNQUM5QztBQUFBLE1BQ0EsT0FBTyxnQkFBZ0I7QUFBQSxJQUMzQjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUEsR0FsR2E7OztBQ0lWLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBT3hCLFlBQ21CLFVBQ0EsWUFDQSxPQUNBLFlBQThDLENBQUMsR0FDaEU7QUFKaUI7QUFDQTtBQUNBO0FBQ0E7QUFFakIsVUFBTSxRQUFRLENBQUMsU0FBUztBQUN0QixXQUFLLGlCQUFpQixJQUFJO0FBQUEsSUFDNUIsQ0FBQztBQUNELFVBQU0sUUFBUSxLQUFLLFlBQVk7QUFDL0IsY0FBVSxRQUFRLENBQUMsZUFBZTtBQUNoQyxXQUFLLGNBQWMsWUFBWSxLQUFLO0FBQUEsSUFDdEMsQ0FBQztBQUVELFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssc0JBQXNCLEtBQUssV0FBVyxVQUFVLENBQUMsWUFBWTtBQUNoRSxVQUFJLFFBQVEsU0FBUyx3QkFBd0I7QUFDM0MsYUFBSyxTQUFTLFFBQVEsUUFBUSxRQUFRO0FBQUEsTUFDeEM7QUFBQSxJQUNGLEdBQUcsS0FBSyxHQUFHO0FBQUEsRUFDYjtBQUFBLEVBMUJpQixNQUFNO0FBQUEsRUFDTixjQUFjLG9CQUFJLElBQXlCO0FBQUEsRUFDM0MsZUFBZSxvQkFBSSxJQUEwQjtBQUFBLEVBQzdDLGtCQUFrQixvQkFBSSxJQUF5QjtBQUFBLEVBQy9DLFVBQVUsb0JBQUksSUFBK0Q7QUFBQSxFQUM3RTtBQUFBLEVBdUJqQixVQUFVO0FBQ1IsU0FBSyxvQkFBb0I7QUFBQSxFQUMzQjtBQUFBLEVBRVEsY0FBYyxPQUEwQixjQUFtQztBQUNqRixVQUFNLFNBQVMsVUFBVSxTQUFTLE1BQU0sV0FBVyxZQUFZO0FBQy9ELFNBQUssUUFBUSxJQUFJLE1BQU0sTUFBTSxFQUFFLE9BQWMsWUFBWSxPQUFPLENBQUM7QUFDakUsU0FBSyxzQkFBc0IsRUFBRSxXQUFXLE1BQU0sTUFBTSxNQUFNLFFBQVEsTUFBTSxPQUFPLENBQUM7QUFBQSxFQUNsRjtBQUFBLEVBRVEsaUJBQWlCLE1BQW1CO0FBQzFDLFFBQUksS0FBSyxnQkFBZ0IsSUFBSSxLQUFLLFFBQVEsR0FBRztBQUUzQyxjQUFRLEtBQUsseUJBQXlCLEtBQUssUUFBUTtBQUFBLElBQ3JEO0FBRUEsU0FBSyxnQkFBZ0IsSUFBSSxLQUFLLFVBQVUsSUFBSTtBQUU1QyxRQUFJLEtBQUssaUJBQWlCLFFBQVc7QUFDbkM7QUFBQSxJQUNGO0FBRUEsUUFBSSxLQUFLLFVBQVUsVUFBVTtBQUMzQixZQUFNLE9BQU8sT0FBTyxpQkFBaUIsTUFBTSxLQUFLLFlBQVk7QUFDNUQsV0FBSyxZQUFZLElBQUksS0FBSyxhQUFhLElBQUk7QUFBQSxJQUM3QztBQUNBLFFBQUksS0FBSyxVQUFVLFVBQVU7QUFDM0IsWUFBTSxPQUFPLE9BQU8sa0JBQWtCLE1BQU0sS0FBSyxZQUFZO0FBQzdELFdBQUssYUFBYSxJQUFJLEtBQUssYUFBYSxJQUFJO0FBQUEsSUFDOUM7QUFBQSxFQUNGO0FBQUEsRUFFUSxhQUFhLE1BQXlCLE9BQWU7QUFDM0QsVUFBTSxPQUFPLEtBQUssWUFBWSxJQUFJLEtBQUssUUFBUTtBQUMvQyxRQUFJLE1BQU07QUFDUixZQUFNLFVBQXVCLEVBQUUsR0FBRyxNQUFNLE1BQU07QUFDOUMsV0FBSyxRQUFRLE9BQU87QUFBQSxJQUN0QixPQUFPO0FBQ0wsWUFBTSxVQUF1QjtBQUFBLFFBQzNCLE1BQU07QUFBQSxRQUNOLGFBQWEsS0FBSztBQUFBLFFBQ2xCLGdCQUFnQixnQkFBZ0IsS0FBSztBQUFBLFFBQ3JDO0FBQUEsUUFDQSxPQUFPLFlBQVk7QUFBQSxNQUNyQjtBQUNBLFdBQUssUUFBUSxPQUFPO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBQUEsRUFFUSxhQUFhLE1BQTBCLFVBQWtDO0FBQy9FLFVBQU0sT0FBTyxLQUFLLGFBQWEsSUFBSSxLQUFLLFFBQVE7QUFDaEQsUUFBSSxDQUFDLE1BQU07QUFDVCxjQUFRLFNBQVMsTUFBTTtBQUFBLFFBQ3JCLEtBQUs7QUFDSCxlQUFLLFFBQVEsT0FBTyxrQkFBa0IsTUFBTSxTQUFTLEtBQUssQ0FBQztBQUMzRDtBQUFBLFFBQ0YsS0FBSztBQUNILGVBQUssUUFBUSxPQUFPLGtCQUFrQixNQUFNLFNBQVMsbUJBQW1CLENBQUM7QUFDekU7QUFBQSxRQUNGLEtBQUs7QUFDSCxlQUFLLFFBQVEsT0FBTyxrQkFBa0IsTUFBTSxTQUFTLG1CQUFtQixDQUFDO0FBQ3pFO0FBQUEsUUFDRjtBQUNFLGdCQUFNLFFBQWU7QUFBQSxNQUN6QjtBQUFBLElBQ0Y7QUFDQSxRQUFJLE1BQU07QUFDUixjQUFRLFNBQVMsTUFBTTtBQUFBLFFBQ3JCLEtBQUs7QUFDSCxlQUFLLFFBQVEsRUFBRSxHQUFHLE1BQU0sT0FBTyxTQUFTLE1BQU0sQ0FBQztBQUMvQztBQUFBLFFBQ0YsS0FBSztBQUNILGVBQUssUUFBUSxFQUFFLEdBQUcsTUFBTSxPQUFPLEtBQUssUUFBUSxTQUFTLFNBQVMsQ0FBQztBQUMvRDtBQUFBLFFBQ0YsS0FBSztBQUNILGVBQUssUUFBUSxFQUFFLEdBQUcsTUFBTSxPQUFPLEtBQUssUUFBUSxTQUFTLFNBQVMsQ0FBQztBQUMvRDtBQUFBLFFBQ0Y7QUFDRSxnQkFBTSxRQUFlO0FBQUEsTUFDekI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsa0JBQTBHO0FBQ2hILFVBQU0sUUFBUSxLQUFLLFlBQVk7QUFDL0IsVUFBTSxNQUFzRixDQUFDO0FBQzdGLFNBQUssUUFBUSxRQUFRLENBQUMsTUFBTTtBQUMxQixZQUFNLE9BQU8sRUFBRTtBQUVmLFlBQU0sT0FBTyxVQUFVLFNBQVMsRUFBRSxNQUFNLFdBQVcsS0FBSztBQUN4RCxZQUFNLFlBQVksU0FBUztBQUMzQixRQUFFLGFBQWE7QUFDZixVQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFBQSxJQUU3RCxDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLFNBQVMsVUFBc0Q7QUFDckUsVUFBTSxVQUFVLEtBQUssZ0JBQWdCLElBQUksU0FBUyxRQUFRO0FBQzFELFFBQUksQ0FBQyxTQUFTO0FBRVosYUFBTyxFQUFFLFNBQVMsTUFBTTtBQUFBLElBQzFCO0FBRUEsUUFBSSxRQUFRLFVBQVUsWUFBWSxPQUFPLGlCQUFpQixRQUFRLEdBQUc7QUFDbkUsV0FBSyxhQUFhLFNBQVMsU0FBUyxLQUFLO0FBQUEsSUFDM0M7QUFFQSxRQUFJLFFBQVEsVUFBVSxZQUFZLE9BQU8saUJBQWlCLFFBQVEsR0FBRztBQUNuRSxXQUFLLGFBQWEsU0FBUyxRQUFRO0FBQUEsSUFDckM7QUFDQSxVQUFNLGVBQWUsS0FBSyxnQkFBZ0I7QUFDMUMsVUFBTSxnQkFBZ0IsYUFBYSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVM7QUFDNUQsa0JBQWMsUUFBUSxDQUFDLFFBQVE7QUFDN0IsV0FBSyxzQkFBc0IsRUFBRSxXQUFXLElBQUksV0FBVyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDekYsQ0FBQztBQUVELFdBQU8sRUFBRSxTQUFTLEtBQUs7QUFBQSxFQUN6QjtBQUFBLEVBRVEsc0JBQXNCLE1BQTJEO0FBQ3ZGLFVBQU0sb0JBQXVDO0FBQUEsTUFDM0MsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osV0FBVyxXQUFXLElBQUk7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFDQSxVQUFNLEVBQUUsV0FBVyxNQUFNLEtBQUssSUFBSSxrQkFBa0I7QUFFcEQsU0FBSyxTQUFTLEtBQUssaUJBQWlCO0FBQUEsRUFDdEM7QUFBQSxFQUVBLGNBQWMsVUFBZ0M7QUFDNUMsVUFBTSxVQUFVLEtBQUssZ0JBQWdCLElBQUksUUFBUTtBQUNqRCxRQUFJLENBQUMsU0FBUztBQUNaLGFBQU8sT0FBTztBQUFBLFFBQ1oseUNBQXlDLFdBQVc7QUFBQSxNQUN0RDtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsS0FBSyxZQUFZLElBQUksUUFBUSxLQUFLLEtBQUssYUFBYSxJQUFJLFFBQVE7QUFFOUUsV0FBTyxRQUFRLE9BQU8sR0FBRyxLQUFLLElBQUksT0FBTyxRQUFRLGNBQWMsV0FBVyxnQkFBZ0I7QUFBQSxFQUM1RjtBQUFBLEVBRVEsUUFBUSxNQUFZO0FBQzFCLFlBQVEsS0FBSyxNQUFNO0FBQUEsTUFDakIsS0FBSztBQUNILGFBQUssYUFBYSxJQUFJLEtBQUssYUFBYSxJQUFJO0FBQzVDO0FBQUEsTUFDRixLQUFLO0FBQ0gsYUFBSyxZQUFZLElBQUksS0FBSyxhQUFhLElBQUk7QUFDM0M7QUFBQSxNQUNGO0FBQ0UsY0FBTSxRQUFlO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQ1QsVUFBTSxRQUEwRCxDQUFDO0FBQ2pFLFNBQUssZ0JBQWdCLFFBQVEsQ0FBQyxRQUFRO0FBQ3BDLFVBQUksUUFBZ0M7QUFDcEMsWUFBTSxZQUFZLEtBQUssV0FBVyxJQUFJLFFBQVE7QUFDOUMsVUFBSSxXQUFXO0FBQ2IsZ0JBQVEsVUFBVTtBQUFBLE1BQ3BCO0FBQ0EsWUFBTSxJQUFJLFFBQVEsSUFBSTtBQUFBLElBQ3hCLENBQUM7QUFDRCxTQUFLLFFBQVEsUUFBUSxDQUFDLFVBQVU7QUFDOUIsWUFBTSxNQUFNLE1BQU0sSUFBSSxJQUFJLE1BQU07QUFBQSxJQUNsQyxDQUFDO0FBRUQsVUFBTSxZQUFZLE9BQU8sS0FBSyxLQUFLO0FBQ25DLFVBQU0sWUFBWSxVQUFVO0FBQzVCLFVBQU0sWUFBWSxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsT0FBTyxDQUFDO0FBRW5ELFdBQU8sRUFBRSxXQUFXLFdBQVcsV0FBVyxPQUFPLE1BQU07QUFBQSxFQUN6RDtBQUFBLEVBRVEsV0FBVyxVQUFnQztBQUNqRCxXQUFPLEtBQUssWUFBWSxJQUFJLFFBQVEsS0FBSyxLQUFLLGFBQWEsSUFBSSxRQUFRLEtBQUs7QUFBQSxFQUM5RTtBQUFBLEVBRVEsY0FBbUM7QUFDekMsV0FBTyxDQUFDLEdBQUcsS0FBSyxhQUFhLE9BQU8sR0FBRyxHQUFHLEtBQUssWUFBWSxPQUFPLENBQUM7QUFBQSxFQUNyRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxhQUFhLFdBQStCO0FBQzFDLFVBQU0sbUJBQW1CLFVBQVUsdUJBQXVCLFNBQVM7QUFDbkUsUUFBSSxTQUFTO0FBRWIsVUFBTSxTQUFTLGlCQUFpQixJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVc7QUFFeEQsVUFBTSxhQUF1QixDQUFDO0FBQzlCLFdBQU8sUUFBUSxDQUFDLE9BQU87QUFDckIsVUFBSSxDQUFDLEtBQUssZ0JBQWdCLElBQUksRUFBRSxHQUFHO0FBQ2pDLGlCQUFTO0FBQ1QsbUJBQVcsS0FBSyxFQUFFO0FBQUEsTUFDcEI7QUFBQSxJQUNGLENBQUM7QUFDRCxZQUFRLElBQUksS0FBSyxLQUFLLFVBQVU7QUFFaEMsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFVBQVUsV0FBc0I7QUFDOUIsV0FBTyxVQUFVLFNBQVMsV0FBVyxLQUFLLFlBQVksQ0FBQztBQUFBLEVBQ3pEO0FBQ0Y7OztBQ3pOTyxJQUFNLGVBQU4sTUFBNEM7QUFBQSxFQWdCakQsWUFDRSxRQUNpQixRQUNBLE9BQ0EsUUFDakI7QUFIaUI7QUFDQTtBQUNBO0FBRWpCLFNBQUssY0FBYztBQUNuQixTQUFLLFlBQVksWUFBWSxLQUFLLFdBQVc7QUFDN0MsU0FBSyxZQUFZLFlBQVksS0FBSyxjQUFjO0FBQ2hELFVBQU0sYUFBYSxLQUFLLE9BQU8sY0FBYyxDQUFDO0FBQzlDLFVBQU0sZUFBZSxLQUFLLE9BQU8sZ0JBQWdCLENBQUM7QUFDbEQsU0FBSyxlQUFlLElBQUksYUFBYSxLQUFLLFVBQVUsS0FBSyxZQUFZLFlBQVksWUFBWTtBQUM3RixTQUFLLFFBQVEsSUFBSSxhQUFhO0FBQUEsTUFDNUIsWUFBWSxPQUFPO0FBQUEsTUFDbkIsV0FBVyxPQUFPO0FBQUEsTUFDbEIsZ0JBQWdCO0FBQUEsTUFDaEIsaUJBQWlCO0FBQUEsSUFDbkIsQ0FBQztBQUVELFVBQU0sc0JBQXNCLE9BQU8sa0JBQWtCLENBQUM7QUFFdEQsd0JBQW9CLFFBQVEsQ0FBQyxNQUFNO0FBQ2pDLFdBQUssMkJBQTJCLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVztBQUFBLElBQzlELENBQUM7QUFFRCxVQUFNLFlBQVksVUFBVSxhQUFhLEtBQUssTUFBTTtBQUNwRCxTQUFLLG1CQUFtQixJQUFJLGlCQUFpQixFQUFFLFFBQVEsVUFBVSxXQUFXLE9BQU8sVUFBVSxVQUFVLENBQUM7QUFDeEcsU0FBSyxlQUFlLElBQUk7QUFBQSxNQUN0QixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUNBLFNBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxNQUFNO0FBQ3JDLFNBQUssVUFBVTtBQUNmLFNBQUssU0FBUztBQUNkLFNBQUssZ0JBQWdCO0FBQUEsRUFDdkI7QUFBQSxFQXJEaUIsTUFBTTtBQUFBLEVBQ04sYUFBYSxJQUFJLFlBQVk7QUFBQSxFQUM3QixXQUFXLElBQUksU0FBUztBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLGNBQThCLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDMUQsaUJBQWlDLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDN0Q7QUFBQSxFQUNBO0FBQUEsRUFDQSw2QkFBNkIsb0JBQUksSUFBeUM7QUFBQSxFQUNuRjtBQUFBLEVBQ0EsY0FBNkI7QUFBQSxFQUNwQixPQUEwQixDQUFDO0FBQUEsRUEwQ3BDLGtCQUFrQjtBQUN4QixVQUFNLG9CQUFvQixLQUFLLFNBQVMsVUFBVSxDQUFDLE9BQU87QUFDeEQsV0FBSyxpQkFBaUIsRUFBRTtBQUN4QixZQUFNLGlCQUFpQixLQUFLLDJCQUEyQixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDeEUscUJBQWUsUUFBUSxDQUFDLGlCQUFpQjtBQUN2QyxhQUFLLFdBQVcsS0FBSyxZQUFZO0FBQUEsTUFDbkMsQ0FBQztBQUFBLElBQ0gsR0FBRyxLQUFLLE1BQU0sbUJBQW1CO0FBQ2pDLFVBQU0sc0JBQXNCLEtBQUssV0FBVyxVQUFVLENBQUMsWUFBWTtBQUlqRSxXQUFLLGlCQUFpQixPQUFPO0FBQzdCLFVBQUksUUFBUSxTQUFTLDhCQUE4QjtBQUNqRCxhQUFLLFNBQVM7QUFBQSxNQUNoQjtBQUVBLFVBQUksUUFBUSxTQUFTLDZCQUE2QjtBQUNoRCxnQkFBUSxJQUFJLEtBQUssTUFBTSwyQ0FBMkM7QUFDbEUsZ0JBQVEsSUFBSSxPQUFPO0FBQ25CLGNBQU0sU0FBUyxRQUFRLFFBQVE7QUFDL0IsY0FBTSxRQUFRLFFBQVEsUUFBUTtBQUM5QixjQUFNLFlBQVksV0FBVyxJQUFJO0FBQ2pDLGNBQU0sTUFBMEIsTUFBTSxJQUFJLENBQUMsT0FBTztBQUFBLFVBQ2hEO0FBQUEsVUFDQSxNQUFNO0FBQUEsUUFDUixFQUFFO0FBQ0YsYUFBSyxPQUFPLFlBQVk7QUFBQSxVQUN0QixtQkFBbUI7QUFBQSxVQUNuQjtBQUFBLFFBQ0YsQ0FBQztBQUVELGFBQUssU0FBUztBQUFBLE1BRWhCO0FBQUEsSUFDRixHQUFHLEtBQUssR0FBRztBQUVYLFNBQUssS0FBSyxLQUFLLG1CQUFtQjtBQUNsQyxTQUFLLEtBQUssS0FBSyxpQkFBaUI7QUFBQSxFQUNsQztBQUFBLEVBRVEsWUFBWTtBQUNsQixTQUFLLFlBQVksTUFBTSxTQUFTLEtBQUssTUFBTSxhQUFhO0FBQ3hELFNBQUssWUFBWSxNQUFNLFFBQVEsS0FBSyxNQUFNLFlBQVk7QUFDdEQsU0FBSyxZQUFZLE1BQU0sa0JBQWtCLEtBQUssT0FBTyxtQkFBbUI7QUFDeEUsU0FBSyxZQUFZLE1BQU0sV0FBVztBQUVsQyxVQUFNLGFBQWEsQ0FBQyxRQUF3QjtBQUMxQyxVQUFJLE1BQU0sU0FBUztBQUNuQixVQUFJLE1BQU0sUUFBUTtBQUNsQixVQUFJLE1BQU0sV0FBVztBQUFBLElBQ3ZCO0FBRUEsZUFBVyxLQUFLLFdBQVc7QUFDM0IsZUFBVyxLQUFLLGNBQWM7QUFBQSxFQUNoQztBQUFBLEVBRVEsV0FBVztBQU9qQixTQUFLLGFBQWEsY0FBYztBQUNoQyxVQUFNLFdBQVcsS0FBSyxPQUFPLFlBQVk7QUFJekMsUUFBSSxLQUFLLGFBQWE7QUFDcEIsV0FBSyxZQUFZLFFBQVE7QUFDekIsV0FBSyxZQUFZLFlBQVk7QUFBQSxJQUMvQjtBQUNBLFFBQUksQ0FBQyxVQUFVO0FBRWIsV0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLE1BQU07QUFDckMsVUFBSSxLQUFLLE9BQU8sTUFBTSxTQUFTLEdBQUc7QUFDaEMsYUFBSyxTQUFTO0FBQUEsTUFDaEI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sVUFBVSxJQUFJLE1BQU0sVUFBVSxLQUFLLFVBQVUsS0FBSyxZQUFZLEtBQUssS0FBSztBQUU5RSxTQUFLLGNBQWM7QUFDbkIsWUFBUSxlQUFlLEtBQUssV0FBVztBQUV2QyxTQUFLLGFBQWEsUUFBUSxRQUFRO0FBQ2xDLFVBQU0sS0FBSyxLQUFLLGFBQWEsU0FBUztBQUl0QyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsVUFBVTtBQUNSLFFBQUksS0FBSyxhQUFhO0FBQ3BCLFdBQUssWUFBWSxRQUFRO0FBQ3pCLFdBQUssWUFBWSxZQUFZO0FBQUEsSUFDL0I7QUFDQSxTQUFLLGFBQWEsUUFBUTtBQUMxQixTQUFLLGFBQWEsUUFBUTtBQUMxQixTQUFLLEtBQUssUUFBUSxDQUFDLFFBQVE7QUFDekIsVUFBSTtBQUFBLElBQ04sQ0FBQztBQUNELFVBQU0sVUFBVSxLQUFLLFNBQVMsU0FBUztBQUN2QyxVQUFNLFdBQVcsS0FBSyxXQUFXLFNBQVM7QUFDMUMsWUFBUSxPQUFPLFFBQVEscUJBQXFCLEdBQUcsS0FBSyxNQUFNLHlDQUF5QyxPQUFPO0FBQzFHLFlBQVEsT0FBTyxTQUFTLHFCQUFxQixHQUFHLEtBQUssTUFBTSx5Q0FBeUMsUUFBUTtBQUFBLEVBQzlHO0FBQUEsRUFDQSxXQUFXLFNBQXlDO0FBQ2xELFlBQVEsSUFBSSxPQUFPO0FBQUEsRUFDckI7QUFBQSxFQUVBLGFBQWEsU0FBcUQ7QUFDaEUsWUFBUSxJQUFJLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRUEsaUJBQWlCLG1CQUFzQztBQUFBLEVBQUM7QUFBQSxFQUV4RCxVQUFVLFFBQXlCO0FBQ2pDLFlBQVEsSUFBSSxNQUFNO0FBQUEsRUFDcEI7QUFDRjs7O0FDL01PLElBQU0sdUJBQU4sTUFBTSxzQkFBOEM7QUFBQSxFQWlEdkQsWUFBWSxVQUFxQyxjQUF1QixhQUFxQjtBQUE1QztBQUM3QyxTQUFLLFdBQVc7QUFDaEIsVUFBTSxVQUFVLGVBQWUsSUFBSTtBQUNuQyxVQUFNLGtCQUFrQixjQUFjLGNBQWM7QUFDcEQsU0FBSyxpQkFBaUI7QUFBQSxNQUNsQjtBQUFBLE1BQ0E7QUFBQSxNQUNBLGNBQWM7QUFBQSxNQUNkLFNBQVM7QUFBQSxRQUNMLEVBQUUsT0FBTyxzQkFBcUIsTUFBTSxPQUFPLFlBQVksc0JBQXFCLE1BQU0sTUFBTTtBQUFBLFFBQ3hGLEVBQUUsT0FBTyxzQkFBcUIsS0FBSyxPQUFPLFlBQVksc0JBQXFCLEtBQUssTUFBTTtBQUFBLE1BQzFGO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFBQSxFQTlEUztBQUFBLEVBQ1QsT0FBd0IsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLE9BQU87QUFBQSxFQUN6RCxPQUF3QixRQUFRLEVBQUUsT0FBTyxHQUFHLE9BQU8sUUFBUTtBQUFBLEVBQ2xEO0FBQUEsRUFFVCxxQkFBd0M7QUFDcEMsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sYUFBYSxLQUFLO0FBQUEsTUFDbEIsZ0JBQWdCLEtBQUssV0FBVztBQUFBLE1BQ2hDLFlBQVksc0JBQXFCLEtBQUs7QUFBQSxNQUN0QyxPQUFPLHNCQUFxQixLQUFLO0FBQUEsTUFDakMsVUFBVTtBQUFBLElBQ2Q7QUFBQSxFQUNKO0FBQUEsRUFDQSxzQkFBeUM7QUFDckMsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sYUFBYSxLQUFLO0FBQUEsTUFDbEIsZ0JBQWdCLEtBQUssV0FBVztBQUFBLE1BQ2hDLFlBQVksc0JBQXFCLE1BQU07QUFBQSxNQUN2QyxPQUFPLHNCQUFxQixNQUFNO0FBQUEsTUFDbEMsVUFBVTtBQUFBLElBQ2Q7QUFBQSxFQUNKO0FBQUEsRUFFQSxvQkFBa0M7QUFDOUIsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxxQkFBbUM7QUFDL0IsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBaUJKOzs7QUNuRUEsSUFBTSxZQUFZO0FBR2xCLElBQU0sYUFBYTtBQUluQixJQUFNLE9BQU8sQ0FBeUIsUUFBVyxPQUE2QjtBQUM1RSxNQUFJLE9BQU8sT0FBTztBQUFVLFdBQU87QUFDbkMsU0FBTyxHQUFHLFVBQVU7QUFDdEI7QUFFQSxJQUFNLFdBQVcsQ0FBeUIsV0FBcUI7QUFDN0QsUUFBTSxVQUFVO0FBQ2hCLFFBQU0sTUFBTSxVQUFVLFFBQVEsWUFBWTtBQUMxQyxNQUFJLFNBQVM7QUFDYixXQUFTLElBQUksR0FBRyxJQUFJLFdBQVcsS0FBSztBQUNsQyxVQUFNLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUM5RCxjQUFVO0FBQUEsRUFDWjtBQUNBLFNBQU87QUFDVDtBQU1PLElBQU0seUJBQXlCLENBQXlCLFdBQWM7QUFJM0UsUUFBTSxTQUFTLE1BQWEsU0FBUyxNQUFNO0FBTTNDLFFBQU0sS0FBSyxDQUFDLE9BQTRCLEtBQUssUUFBUSxFQUFFO0FBTXZELFFBQU0sa0JBQWtCLENBQUMsT0FBc0I7QUFDN0MsUUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHO0FBQ1gsWUFBTSxJQUFJLE1BQU0sZUFBZSxFQUFFLEVBQUU7QUFBQSxJQUNyQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBS0EsUUFBTSxPQUFVO0FBTWhCLFFBQU0sU0FBUyxDQUFDLE9BQXNCO0FBQ3BDLFdBQU8sR0FBRyxFQUFFLElBQUksS0FBSyxPQUFPO0FBQUEsRUFDOUI7QUFFQSxTQUFPLE9BQU8sT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLGlCQUFpQixLQUFLLENBQUM7QUFDcEU7QUFHTyxJQUFNLFdBQVcsdUJBQXVCLFFBQVE7QUFFaEQsSUFBTSxTQUFTLHVCQUF1QixNQUFNOyIsCiAgIm5hbWVzIjogWyJTY2hlbWFEdG8iLCAiRFRpbWVzdGFtcCIsICJEVXRpbCIsICJpc051bWJlciIsICJEQ3NzIiwgIkRTdHlsZSIsICJBbnN3ZXJlZFF1ZXN0aW9uIiwgIkNvbmRpdGlvbiIsICJjb25kaXRpb24iLCAiUnVsZSIsICJ0YWciLCAiREV2ZW50SGFuZGxlciIsICJkdG8iLCAiZHRvIiwgIlNjYWxlIiwgIlJlc3VsdCIsICJEU3RhdGUiXQp9Cg==
2245
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1YmxpYy1hcGkudHMiLCAiLi4vc3JjL2R0by9TY2hlbWFEdG8udHMiLCAiLi4vc3JjL2NvbW1vbi9EVGltZXN0YW1wLnRzIiwgIi4uL3NyYy91dGlscy9EVXRpbC50cyIsICIuLi9zcmMvRGVsZW1lbnQvY3NzLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EU3R5bGUudHMiLCAiLi4vc3JjL0RlbGVtZW50L1ZpZGVvQ29udGFpbmVyLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9BdWRpb0NvbnRhaW5lci50cyIsICIuLi9zcmMvc2VydmljZXMvRE1lZGlhLW1hbmFnZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL0RDb21tYW5kQnVzLnRzIiwgIi4uL3NyYy9ldmVudHMvZXZlbnQtYnVzLnRzIiwgIi4uL3NyYy9wbGF5ZXIvaGlzdG9yeS1xdWUudHMiLCAiLi4vc3JjL3J1bGVzL2NvbmRpdGlvbi50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS50cyIsICIuLi9zcmMvcnVsZXMvcnVsZS1lbmdpbmUudHMiLCAiLi4vc3JjL3BsYXllci9uZXh0LXF1ZS50cyIsICIuLi9zcmMvcGxheWVyL2RwbGF5ZXIudHMiLCAiLi4vc3JjL2V2ZW50LWhhbmRsZXJzL0RFdmVudEhhbmRsZXIudHMiLCAiLi4vc3JjL0RlbGVtZW50L0RFbGVtZW50LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EZGl2LnRzIiwgIi4uL3NyYy9EZWxlbWVudC9ESW1nLnRzIiwgIi4uL3NyYy9EZWxlbWVudC9EVGV4dC50cyIsICIuLi9zcmMvZW5naW5lL2VsZW1lbnQtZmFjdG9yeS50cyIsICIuLi9zcmMvZW5naW5lL0RQYWdlLnRzIiwgIi4uL3NyYy9lbmdpbmUvc2NhbGUudHMiLCAiLi4vc3JjL3NlcnZpY2VzL3Jlc291cmNlLXByb3ZpZGVyLnRzIiwgIi4uL3NyYy9jb21tb24vcmVzdWx0LnRzIiwgIi4uL3NyYy9zdGF0ZS9Ec3RhdGUudHMiLCAiLi4vc3JjL3N0YXRlL3N0YXRlLXNlcnZpY2UudHMiLCAiLi4vc3JjL2VuZ2luZS9TY2hlbWFFbmdpbmUudHMiLCAiLi4vc3JjL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHkudHMiLCAiLi4vc3JjL3V0aWxzL0lELnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBTY2hlbWFFbmdpbmUgfSBmcm9tIFwiLi9lbmdpbmUvU2NoZW1hRW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vU2NoZW1hRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudC1oYW5kbGVycy9ERXZlbnRIYW5kbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzL0RFdmVudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL2ZhY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bGVzL3J1bGUtZW5naW5lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ydWxlcy9jb25kaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL2Jvb2xlYW4tcHJvcGVydHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXRlL0RzdGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRGVsZW1lbnQvRFN0eWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9EQXV0by1wbGF5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9EZWxlbWVudC9jc3NcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL0lEXCI7XG4iLCAiaW1wb3J0IHsgREF1dG9QbGF5U2VxdWVuY2UgfSBmcm9tIFwiLi4vRGVsZW1lbnQvREF1dG8tcGxheVwiO1xuaW1wb3J0IHsgREF1ZGlvRHRvLCBERWxlbWVudER0bywgREltZ0R0bywgRFZpZGVvRHRvIH0gZnJvbSBcIi4vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcIi4uL3J1bGVzL3J1bGVcIjtcbmltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgUGFnZVF1ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuLi9zdGF0ZS9Ec3RhdGVcIjtcbmltcG9ydCB7IFBhZ2VJRCwgU2NoZW1hSUQgfSBmcm9tIFwiLi4vdXRpbHMvSURcIjtcblxuZXhwb3J0IHR5cGUgUGFnZVF1ZVJ1bGVzID0gUnVsZTxQYWdlUXVlQ29tbWFuZCwgbmV2ZXI+O1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFBhZ2VJRDtcbiAgcmVhZG9ubHkgZWxlbWVudHM6IEFycmF5PERFbGVtZW50RHRvPjtcbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZ1tdO1xuICByZWFkb25seSBtYWluVmlkZW9JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSB2aWRlbz86IEFycmF5PERWaWRlb0R0bz47XG4gIHJlYWRvbmx5IGF1ZGlvPzogQXJyYXk8REF1ZGlvRHRvPjtcbiAgcmVhZG9ubHkgYXV0b1BsYXlTZXF1ZW5jZT86IERBdXRvUGxheVNlcXVlbmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTZXF1ZW5jZUR0byB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVzOiBBcnJheTxQYWdlUXVlUnVsZXM+O1xuICByZWFkb25seSBwYWdlczogQXJyYXk8UGFnZUR0bz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRHRvIHtcbiAgcmVhZG9ubHkgaWQ6IFNjaGVtYUlEO1xuICByZWFkb25seSBiYXNlSGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhc2VXaWR0aDogbnVtYmVyO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFnZXM6IFBhZ2VEdG9bXTtcbiAgcmVhZG9ubHkgcnVsZXM6IEFycmF5PFBhZ2VRdWVSdWxlcz47XG4gIHJlYWRvbmx5IHN0YXRlUHJvcHM/OiBSZWFkb25seUFycmF5PERTdGF0ZS5Qcm9wPjtcbiAgcmVhZG9ubHkgc3RhdGVRdWVyaWVzPzogUmVhZG9ubHlBcnJheTxEU3RhdGUuU3RhdGVRdWVyeT47XG4gIHJlYWRvbmx5IHN0YXRlRnJvbUV2ZW50OiBSZWFkb25seUFycmF5PERTdGF0ZS5mcm9tRXZlbnRIYW5kbGVyPjtcbiAgcmVhZG9ubHkgcGFnZVNlcXVlbmNlcz86IEFycmF5PFBhZ2VTZXF1ZW5jZUR0bz47XG4gIHJlYWRvbmx5IHByZWRlZmluZWRGYWN0cz86IFJlYWRvbmx5QXJyYXk8RmFjdD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2NoZW1hRHRvIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlc291cmNlcyA9IChcbiAgICBzY2hlbWE6IFNjaGVtYUR0byxcbiAgKToge1xuICAgIHZpZGVvTGlzdDogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+O1xuICAgIGF1ZGlvTGlzdDogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+O1xuICAgIGltYWdlTGlzdDogUmVhZG9ubHlBcnJheTxESW1nRHRvPjtcbiAgfSA9PiB7XG4gICAgY29uc3QgeyBwYWdlcyB9ID0gc2NoZW1hO1xuICAgIGNvbnN0IHZpZGVvTGlzdCA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEVmlkZW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLnZpZGVvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLnZpZGVvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGF1ZGlvTGlzdDogQXJyYXk8REF1ZGlvRHRvPiA9IHBhZ2VzLnJlZHVjZTxBcnJheTxEQXVkaW9EdG8+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyLmF1ZGlvKSkge1xuICAgICAgICBhY2MucHVzaCguLi5jdXJyLmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHsgdmlkZW9MaXN0LCBhdWRpb0xpc3QsIGltYWdlTGlzdDogW10gfTtcbiAgfTtcbn1cbiIsICJleHBvcnQgdHlwZSBEVGltZXN0YW1wID0gbnVtYmVyICYgeyBfX3RpbWVzdGFtcF9fOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERUaW1lc3RhbXAge1xuICAgIGV4cG9ydCBjb25zdCBub3cgPSAoKSA9PiBEYXRlLm5vdygpIGFzIERUaW1lc3RhbXA7XG4gICAgZXhwb3J0IHR5cGUgRGlmZiA9IG51bWJlciAmIHsgX19kaWZmX186IHRydWUgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhZGRNaWxscyA9ICh0OiBEVGltZXN0YW1wLCBtczogbnVtYmVyKTogRFRpbWVzdGFtcCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHQgKyBNYXRoLmFicyhtcyk7XG4gICAgICAgIHJldHVybiByZXMgYXMgRFRpbWVzdGFtcDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGRpZmYgPSAodDE6IERUaW1lc3RhbXAsIHQyOiBEVGltZXN0YW1wKTogRGlmZiA9PiB7XG4gICAgICAgIGNvbnN0IHQxQWJzID0gTWF0aC5hYnModDEpO1xuICAgICAgICBjb25zdCB0MkFicyA9IE1hdGguYWJzKHQyKTtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHQxQWJzIC0gdDJBYnMpIGFzIERpZmY7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBkaWZmTm93ID0gKHQ6IERUaW1lc3RhbXApOiBEaWZmID0+IHtcbiAgICAgICAgcmV0dXJuIGRpZmYodCwgbm93KCkpO1xuICAgIH07XG59XG4iLCAiZXhwb3J0IHR5cGUgUmFuZG9tT2JqZWN0SWQgPSBzdHJpbmcgJiB7IHJhbmRvbU9iamVjdElkOiB0cnVlIH07XG5leHBvcnQgbmFtZXNwYWNlIERVdGlsIHtcbiAgICBleHBvcnQgY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgbGV0dGVycyA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5elwiO1xuICAgICAgICBjb25zdCB1cHBlcmNhc2UgPSBsZXR0ZXJzLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGFsbCA9IGxldHRlcnMgKyB1cHBlcmNhc2U7XG4gICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGxlbmd0aCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBhbGwuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbC5sZW5ndGgpKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCByYW5kb21PYmplY3RJZCA9ICgpID0+IHJhbmRvbVN0cmluZygzMikgYXMgUmFuZG9tT2JqZWN0SWQ7XG5cbiAgICBleHBvcnQgY29uc3QgZGVsZXRlUHJvcCA9IDxPYmosIEtleSBleHRlbmRzIGtleW9mIE9iaj4ob2JqOiBPYmosIGtleTogS2V5KTogT21pdDxPYmosIEtleT4gPT4ge1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0luUmFuZ2UgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbiAgICB9O1xuICAgIGV4cG9ydCBjb25zdCBpc0luZmluaXR5ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB8fCBudW1iZXIgPT09IEluZmluaXR5O1xuICAgIH07XG4gICAgZXhwb3J0IHR5cGUgTm9uRW1wdHlBcnJheTxUPiA9IFtULCAuLi5UW11dO1xuICAgIGV4cG9ydCBjb25zdCBpc05vbkVtcHR5QXJyYXkgPSA8VD4oYXJyYXk6IEFycmF5PFQ+KTogYXJyYXkgaXMgTm9uRW1wdHlBcnJheTxUPiA9PiB7XG4gICAgICAgIHJldHVybiBhcnJheS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbmV2ZXJDaGVjayA9IChhcmdzOiBuZXZlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk9PUFM6IFRoaXMgdmFsdWUgc2xpcHBlZCB0aHJvdWdoIHRoZSBuZXZlci1jaGVja1wiLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKHN0cjogdW5rbm93bik6IHN0ciBpcyBzdHJpbmcgPT4gdHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIjtcblxuICAgIGV4cG9ydCBjb25zdCBoYXNLZXkgPSA8VCBleHRlbmRzIHN0cmluZz4ob2JqOiB1bmtub3duLCBrZXk6IFQpOiBvYmogaXMgUmVjb3JkPHR5cGVvZiBrZXksIHVua25vd24+ID0+IHtcbiAgICAgICAgaWYgKCFpc1JlY29yZChvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc1JlY29yZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzQm9vbCA9IChvYmo6IGJvb2xlYW4pOiBvYmogaXMgYm9vbGVhbiA9PiB0eXBlb2Ygb2JqID09PSBcImJvb2xlYW5cIjtcblxuICAgIGV4cG9ydCBjb25zdCBpc1RydWUgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgdHJ1ZSA9PiBib29sID09PSB0cnVlO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzRmFsc2UgPSAoYm9vbDogYm9vbGVhbik6IGJvb2wgaXMgZmFsc2UgPT4gYm9vbCA9PT0gZmFsc2U7XG5cbiAgICBleHBvcnQgY29uc3QgaXNEZWZpbmVkID0gKG9iajogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBub3ROdWxsID0gb2JqICE9PSBudWxsO1xuICAgICAgICBjb25zdCBub3RVbmRlZmluZWQgPSBvYmogIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vdE51bGwgJiYgbm90VW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzS2luZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgeyByZWFkb25seSBraW5kOiBzdHJpbmcgfSA9PiB7XG4gICAgICAgIGlmICghaGFzS2V5KG9iaiwgXCJraW5kXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmoua2luZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmoua2luZC5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaGFzVmFsdWUgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHsgdmFsdWU6IHVua25vd24gfSA9PiB7XG4gICAgICAgIHJldHVybiBoYXNLZXkob2JqLCBcInZhbHVlXCIpO1xuICAgIH07XG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKHZhbHVlPzogbnVtYmVyKTogdmFsdWUgaXMgbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3QgaXNOdW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XG4gICAgICAgIGNvbnN0IG5vdE5hTiA9ICFOdW1iZXIuaXNOYU4odmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNOdW1iZXIgJiYgbm90TmFOO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgbWF4Rm4gPSAodXBwZXJMaW1pdDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlLCB1cHBlckxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IG1pbkZuID0gKGxvd2VyTGltaXQ6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSwgbG93ZXJMaW1pdCk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERDc3Mge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgUHgge1xuICAgICAgICByZWFkb25seSBfdW5pdDogXCJweFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFN0cmluZyA9IGAke251bWJlcn1weGAgfCBgJHtudW1iZXJ9JWA7XG4gICAgZXhwb3J0IGludGVyZmFjZSBQZXJjZW50IHtcbiAgICAgICAgcmVhZG9ubHkgX3VuaXQ6IFwicGVyY2VudFwiO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIExlbmd0aFVuaXQgPSBQeCB8IFBlcmNlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHNjYWxlIHRvIDMlIG9mIGJhc2VTY2FsZVxuICAgICAqIEBwYXJhbSB1bml0XG4gICAgICogQHBhcmFtIHNjYWxlXG4gICAgICovXG4gICAgZXhwb3J0IGNvbnN0IHRvU3RyaW5nID0gKHVuaXQ6IFJlYWRvbmx5PExlbmd0aFVuaXQ+LCBzY2FsZTogbnVtYmVyKTogTGVuZ3RoU3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgY2xhbXBlZFNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIDAuMDMpO1xuICAgICAgICBpZiAodW5pdC5fdW5pdCA9PT0gXCJweFwiKSB7XG4gICAgICAgICAgICBpZiAodW5pdC52YWx1ZSA8IDAuMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjBweFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZCh1bml0LnZhbHVlICogY2xhbXBlZFNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heChyb3VuZGVkLCAxKTtcbiAgICAgICAgICAgIHJldHVybiAoY2xhbXBlZCArIFwicHhcIikgYXMgTGVuZ3RoU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodW5pdC52YWx1ZSArIFwiJVwiKSBhcyBMZW5ndGhTdHJpbmc7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBpc0xlbmd0aFVuaXQgPSAodW5pdD86IExlbmd0aFVuaXQpOiB1bml0IGlzIExlbmd0aFVuaXQgPT4ge1xuICAgICAgICBpZiAoIXVuaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bml0S2V5OiBrZXlvZiBMZW5ndGhVbml0ID0gXCJfdW5pdFwiO1xuICAgICAgICBjb25zdCB2YWx1ZUtleToga2V5b2YgTGVuZ3RoVW5pdCA9IFwidmFsdWVcIjtcbiAgICAgICAgY29uc3QgaGFzVW5pdEtleSA9IERVdGlsLmhhc0tleSh1bml0LCB1bml0S2V5KTtcbiAgICAgICAgY29uc3QgaGFzVmFsdWVLZXkgPSBEVXRpbC5oYXNLZXkodW5pdCwgdmFsdWVLZXkpO1xuICAgICAgICByZXR1cm4gaGFzVW5pdEtleSAmJiBoYXNWYWx1ZUtleTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERDc3MgfSBmcm9tIFwiLi9jc3NcIjtcbmltcG9ydCB7IEVsZW1lbnRLZXlOYW1lcyB9IGZyb20gXCIuL0RTdHlsZS11dGlsc1wiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcblxudHlwZSBEU3R5bGUyID0gQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbmV4cG9ydCBpbnRlcmZhY2UgRFN0eWxlIHtcbiAgICBvcGFjaXR5OiBudW1iZXI7XG4gICAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogXCJ2aXNpYmxlXCIgfCBcImhpZGRlblwiO1xuICAgIGN1cnNvcjpcbiAgICAgICAgfCBcInBvaW50ZXJcIlxuICAgICAgICB8IFwiaGVscFwiXG4gICAgICAgIHwgXCJjb3B5XCJcbiAgICAgICAgfCBcIndhaXRcIlxuICAgICAgICB8IFwibm90LWFsbG93ZWRcIlxuICAgICAgICB8IFwiY29udGV4dC1tZW51XCJcbiAgICAgICAgfCBcIm1vdmVcIlxuICAgICAgICB8IFwiZ3JhYmJpbmdcIlxuICAgICAgICB8IFwiZ3JhYlwiXG4gICAgICAgIHwgXCJ6b29tLWluXCJcbiAgICAgICAgfCBcInpvb20tb3V0XCJcbiAgICAgICAgfCBcIm5vbmVcIlxuICAgICAgICB8IFwiYXV0b1wiXG4gICAgICAgIHwgXCJkZWZhdWx0XCI7XG5cbiAgICAvLyBQT1NJVElPTlxuICAgIGg6IG51bWJlcjtcbiAgICB3OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcblxuICAgIC8vIEJPUkRFUlNcbiAgICBib3JkZXJTdHlsZTogXCJzb2xpZFwiIHwgXCJub25lXCIgfCBcImRvdHRlZFwiIHwgXCJkYXNoZWRcIjtcbiAgICBib3JkZXJSYWRpdXM6IERDc3MuUHggfCBEQ3NzLlBlcmNlbnQ7XG4gICAgYm9yZGVyV2lkdGg6IERDc3MuUHg7XG4gICAgYm9yZGVyQ29sb3I6IHN0cmluZztcblxuICAgIG1hcmdpbjogRENzcy5QeCB8IERDc3MuUGVyY2VudDtcbiAgICBwYWRkaW5nOiBEQ3NzLlB4IHwgRENzcy5QZXJjZW50O1xuXG4gICAgLy8gVHJhbnNsYXRlXG4gICAgdHJhbnNmb3JtOiBzdHJpbmc7XG4gICAgdHJhbnNsYXRlOiBzdHJpbmc7XG5cbiAgICAvLyBURVhUXG4gICAgZm9udFNpemU6IERDc3MuUHg7XG4gICAgdGV4dENvbG9yOiBzdHJpbmc7XG4gICAgZm9udFdlaWdodDogMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwgNjAwIHwgNzAwIHwgODAwIHwgOTAwO1xuICAgIHRleHRBbGlnbjogXCJyaWdodFwiIHwgXCJsZWZ0XCIgfCBcImNlbnRlclwiO1xuICAgIGxldHRlclNwYWNpbmc6IERDc3MuUHg7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRFN0eWxlIHtcbiAgICBleHBvcnQgY29uc3Qgbm9ybWFsaXplID0gPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oZWw6IFQpOiBUID0+IHtcbiAgICAgICAgZWwuc3R5bGUucGFkZGluZyA9IFwiMFwiO1xuICAgICAgICBlbC5zdHlsZS5tYXJnaW4gPSBcIjBcIjtcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGVsLnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcblxuICAgIGV4cG9ydCBjb25zdCBhcHBseVN0eWxlcyA9IDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGVsOiBULCBzdHlsZTogUGFydGlhbDxEU3R5bGU+LCBzY2FsZTogbnVtYmVyKTogVCA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHNjYWxlUHggPSBEQ3NzLnRvU3RyaW5nQ3JlKHRoaXMuc2NhbGUpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgICAgICBib3JkZXJTdHlsZSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250V2VpZ2h0LFxuICAgICAgICAgICAgdGV4dENvbG9yLFxuICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgdHJhbnNsYXRlLFxuICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIGxldHRlclNwYWNpbmcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgdmlzaWJpbGl0eSxcbiAgICAgICAgfSA9IHN0eWxlO1xuXG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUuZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dENvbG9yKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5jb2xvciA9IHRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dEFsaWduKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlcldpZHRoID0gRENzcy50b1N0cmluZyhib3JkZXJXaWR0aCwgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250V2VpZ2h0KSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5mb250V2VpZ2h0ID0gZm9udFdlaWdodCArIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvcmRlclN0eWxlKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJTdHlsZSA9IGJvcmRlclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb250U2l6ZSkge1xuICAgICAgICAgICAgZWwuc3R5bGUuZm9udFNpemUgPSBEQ3NzLnRvU3RyaW5nKGZvbnRTaXplLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoeCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSB4ICsgXCIlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERVdGlsLmlzTnVtYmVyKHkpKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSB5ICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIoaCkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGggKyBcIiVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRFV0aWwuaXNOdW1iZXIodykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gdyArIFwiJVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERDc3MuaXNMZW5ndGhVbml0KGJvcmRlclJhZGl1cykpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLmJvcmRlclJhZGl1cyA9IERDc3MudG9TdHJpbmcoYm9yZGVyUmFkaXVzLCBzY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgZWwuc3R5bGUubGV0dGVyU3BhY2luZyA9IERDc3MudG9TdHJpbmcobGV0dGVyU3BhY2luZywgc2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJnaW4pIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLm1hcmdpbiA9IERDc3MudG9TdHJpbmcobWFyZ2luLCBzY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnBhZGRpbmcgPSBEQ3NzLnRvU3RyaW5nKHBhZGRpbmcsIHNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEVXRpbC5pc051bWJlcihvcGFjaXR5KSkge1xuICAgICAgICAgICAgZWwuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHkgKyBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgLy8gY29uc3QgcHJvcE5hbWVzID0gbmV3IFNldCguLi5FbGVtZW50S2V5TmFtZXMpO1xuICAgIC8vIGV4cG9ydCBjb25zdCB2YWxpZEtleSA9IChrZXlOYW1lOiBzdHJpbmcpID0+IHByb3BOYW1lcy5oYXMoa2V5TmFtZSk7XG59XG4iLCAiaW1wb3J0IHsgRFZpZGVvRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgRFN0eWxlIH0gZnJvbSBcIi4vRFN0eWxlXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5jb25zdCBBQk9SVF9QTEFZX1RPX0VORCA9IFwiQUJPUlRfUExBWV9UT19FTkRcIjtcbmV4cG9ydCBpbnRlcmZhY2UgQ2FuUGxheVRvRW5kIHtcbiAgICBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGNsYXNzIFZpZGVvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRzogc3RyaW5nO1xuICAgIHByaXZhdGUgZHRvPzogRFZpZGVvRHRvO1xuICAgIHByaXZhdGUgZGVmYXVsdFN0eWxlczogUGFydGlhbDxEU3R5bGU+ID0geyBoOiA0NSwgdzogMTAwLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCB5OiA1NSB9O1xuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIlZJREVPX1BBVVNFRF9FVkVOVFwiLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcGxheSh1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5lbC5zcmMgIT09IHVybCkge1xuICAgICAgICAgICAgdGhpcy5lbC5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZHVjZXJJZCA9IHRoaXMuZHRvPy5pZCA/PyBcIkRWaWRlb1wiO1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJWSURFT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmKHRoaXMuZWwuc3JjICE9PSB1cmwpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuXG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKSB7XG4gICAgICAgIHRoaXMuZWwudm9sdW1lID0gMTtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5kdG8/LnVybDtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbmRlZE9yRXJyb3JlZCA9IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICBBQk9SVF9QTEFZX1RPX0VORCxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDQVRDSEVEIEFCQk9SVC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJBYm9ydGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUExBWVwiKTtcbiAgICAgICAgICAgIHRoaXMucGxheSh1cmwpO1xuICAgICAgICAgICAgYXdhaXQgZW5kZWRPckVycm9yZWQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLlRBRyArIFwiIGZpbmFsbHkgYmxvY2sgcGxheVRvRW5kKCkgY29tcGxldGVkIHZpZGVvSWQ6IFwiICsgdGhpcy5kdG8/LmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsOiBIVE1MVmlkZW9FbGVtZW50LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNjYWxlOiBTY2FsZVNlcnZpY2UgLy8gZHRvPzogRFZpZGVvRHRvXG4gICAgKSB7XG4gICAgICAgIHRoaXMuVEFHID0gXCJbIERfVmlkZW8gXSA6IFwiO1xuICAgICAgICB0aGlzLmVsLmNvbnRyb2xzID0gZmFsc2U7XG4gICAgICAgIERTdHlsZS5ub3JtYWxpemUodGhpcy5lbCk7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCB0aGlzLmRlZmF1bHRTdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuXG4gICAgICAgIHRoaXMuZWwub25lbmRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJWSURFT19FTkRFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWwub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETyBMT0dHIElOVEVSTkFMIFNUQVRFX0NIQU5HRVMuXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5lbC5vbnBhdXNlID0gKCkgPT4ge307XG4gICAgICAgIHRoaXMuZWwub25lcnJvciA9ICgpID0+IHt9O1xuICAgICAgICB0aGlzLmVsLm9uY2FucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQodGhpcy5UQUcgKyBcIlJFQURZIFRPIFBMQVlcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkR1cmF0aW9uOiBcIiArIHRoaXMuZWwuZHVyYXRpb24pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJZDogXCIgKyB0aGlzLmlkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ3VycmVudCBUaW1lOiBcIiArIHRoaXMuZWwuY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJBdWRvUGxheTogXCIgKyB0aGlzLmVsLmF1dG9wbGF5KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0xPQURFRF9NRVRBREFUQV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEVmlkZW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUT0RPIFVTRSBUSElTIFNZTlRBWD9cbiAgICAgICAgdGhpcy5lbC5vbmR1cmF0aW9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmVsLmR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNJbmZpbml0eSA9IERVdGlsLmlzSW5maW5pdHkoZHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlZJREVPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRWaWRlb1wiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VySWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuZWwuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy5lbC5jdXJyZW50VGltZTtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gdGhpcy5lbC52b2x1bWU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5lbC5pc0Nvbm5lY3RlZDtcbiAgICAgICAgY29uc3QgcGxheWJhY2tRdWFsaXR5ID0gdGhpcy5lbC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpO1xuICAgICAgICBjb25zdCBkZWZhdWx0UGxheWJhY2tSYXRlID0gdGhpcy5lbC5kZWZhdWx0UGxheWJhY2tSYXRlO1xuICAgICAgICBjb25zdCBwYXVzZWQgPSB0aGlzLmVsLnBhdXNlZDtcbiAgICAgICAgY29uc3QgcGxheWVkID0gdGhpcy5lbC5wbGF5ZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgcGF1c2VkLFxuICAgICAgICAgICAgcGxheWVkLFxuICAgICAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgICAgICBpc0Nvbm5lY3RlZCxcbiAgICAgICAgICAgIHBsYXliYWNrUXVhbGl0eSxcbiAgICAgICAgICAgIGRlZmF1bHRQbGF5YmFja1JhdGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0RHRvKGR0bzogRFZpZGVvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50RHRvKCk6IERWaWRlb0R0byB8IGZhbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlczogUGFydGlhbDxEU3R5bGU+KSB7XG4gICAgICAgIERTdHlsZS5hcHBseVN0eWxlcyh0aGlzLmVsLCBzdHlsZXMsIHRoaXMuc2NhbGUuc2NhbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kdG8/LmlkID8/IFwiRFZpZGVvXCI7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHt9XG59XG4iLCAiaW1wb3J0IHsgQ2FuUGxheVRvRW5kIH0gZnJvbSBcIi4vVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IERBdWRpb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBERXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvQ29udGFpbmVyIGltcGxlbWVudHMgQ2FuUGxheVRvRW5kIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEQXVkaW8gXTogXCI7XG4gICAgcHJvdGVjdGVkIGR0bzogREF1ZGlvRHRvIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBlbDogSFRNTEF1ZGlvRWxlbWVudDtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBERXZlbnREaXNwYXRjaGVyKSB7XG4gICAgICAgIHRoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIik7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIC8vIHRoaXMuZWwub25cbiAgICAgICAgdGhpcy5vbkxvYWQgPSB0aGlzLm9uTG9hZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLm9uTG9hZGVkTWV0YWRhdGEgPSB0aGlzLm9uTG9hZGVkTWV0YWRhdGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbmxvYWRlZG1ldGFkYXRhID0gdGhpcy5vbkxvYWRlZE1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVsLm9ucGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkNhblBsYXlUaHJvdWdoID0gdGhpcy5vbkNhblBsYXlUaHJvdWdoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jYW5wbGF5dGhyb3VnaCA9IHRoaXMub25DYW5QbGF5VGhyb3VnaDtcbiAgICAgICAgdGhpcy5lbC5vbmVuZGVkID0gKF8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZWwuc3JjO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0VOREVEX0VWRU5UXCIsXG4gICAgICAgICAgICAgICAgZGF0YTogeyB1cmwgfSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERUaW1lc3RhbXAubm93KCksXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVsLm9uZHVyYXRpb25jaGFuZ2UgPSAoXzogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5lbC5kdXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5maW5pdHkgPSBkdXJhdGlvbiA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIkFVRElPX0RVUkFUSU9OX0NIQU5HRV9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZHVyYXRpb246IHRoaXMuZWwuZHVyYXRpb24sIGlzSW5maW5pdHkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldEF1ZGlvKGR0bzogREF1ZGlvRHRvKSB7XG4gICAgICAgIHRoaXMuZHRvID0gZHRvO1xuICAgICAgICB0aGlzLmVsLnNyYyA9IGR0by51cmw7XG4gICAgICAgIHRoaXMuZWwubG9hZCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVsLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmVsLmxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZWwucGF1c2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVE9ETyBFTUlUIEVSUk9SIEVWRU5ULlxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGF5KHVybDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNyYyAhPT0gdXJsKSB7XG4gICAgICAgICAgICB0aGlzLmVsLnNyYyA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19QTEFZX0VWRU5UXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWxcbiAgICAgICAgICAgIC5wbGF5KClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Mb2FkZWRNZXRhZGF0YShfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19NRVRBREFUQV9MT0FERURfRVZFTlRcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgIGtpbmQ6IFwiQVVESU9fTE9BRF9FVkVOVFwiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREF1ZGlvXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArIGV2ZW50LnR5cGUpO1xuICAgIH1cblxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHRvPy5pZCA/PyBcIkRBdWRpb1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DYW5QbGF5VGhyb3VnaChfOiBFdmVudCkge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJBVURJT19DQU5fUExBWV9USFJPVUdIX0VWRU5UXCIsXG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRBdWRpb1wiLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBvblBsYXkoXzogRXZlbnQpIHt9XG5cbiAgICBhc3luYyBwbGF5VG9FbmQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuZGVkT3JFcnJvcmVkID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wbGF5KHRoaXMuZWwuc3JjKTtcbiAgICAgICAgICAgIGF3YWl0IGVuZGVkT3JFcnJvcmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gTEVUIFBBUkVOVCBERUFMIFdJVEggRVJST1JTPyBUSEUgTUFOQUdFUj8/IE1BTkFHRVJTIENBTEwgQUJPUlQuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICAgICAga2luZDogXCJBVURJT19FUlJPUl9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogXCJEQXVkaW9cIixcbiAgICAgICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZXJyb3I6IGUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBhZ2VEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgVmlkZW9Db250YWluZXIgfSBmcm9tIFwiLi4vRGVsZW1lbnQvVmlkZW9Db250YWluZXJcIjtcbmltcG9ydCB7IEF1ZGlvQ29udGFpbmVyIH0gZnJvbSBcIi4uL0RlbGVtZW50L0F1ZGlvQ29udGFpbmVyXCI7XG5pbXBvcnQgeyBBdXRvUGxheUVsZW1lbnQsIERBdXRvUGxheVNlcXVlbmNlIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RBdXRvLXBsYXlcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL2VuZ2luZS9zY2FsZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VQcm92aWRlciB9IGZyb20gXCIuL3Jlc291cmNlLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBBdXRvcGxheVRhc2ssIFNlcXVlbmNlTWFuYWdlciB9IGZyb20gXCIuL3NlcXVlbmNlLW1hbmFnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWVkaWFNYW5hZ2VyIHtcbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKTogdm9pZDtcbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgRE1lZGlhTWFuYWdlciBpbXBsZW1lbnRzIElNZWRpYU1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBJTlNUQU5DRV9DT1VOVCA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgTUVESUFfTUFOQUdFUiBdIDogXCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlkZW9Db250YWluZXI6IFZpZGVvQ29udGFpbmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvQ29udGFpbmVyOiBBdWRpb0NvbnRhaW5lcjtcbiAgcHJpdmF0ZSBwYWdlRW50ZXI6IERUaW1lc3RhbXA7XG4gIHByaXZhdGUgc2luY2VQYWdlRW50ZXI6IERUaW1lc3RhbXAuRGlmZjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogUGFnZUR0byB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29tbWFuZHM6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlja2VyUmVmOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VxdWVuY2VNYW5hZ2VyOiBTZXF1ZW5jZU1hbmFnZXIgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogSFRNTERpdkVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlLFxuICApIHtcbiAgICBETWVkaWFNYW5hZ2VyLklOU1RBTkNFX0NPVU5UID0gRE1lZGlhTWFuYWdlci5JTlNUQU5DRV9DT1VOVCArIDE7XG4gICAgdGhpcy5pbnN0YW5jZU51bWJlciA9IERNZWRpYU1hbmFnZXIuSU5TVEFOQ0VfQ09VTlQ7XG4gICAgY29uc3QgdmlkZW9FbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKTtcbiAgICB0aGlzLmhvc3RFbC5hcHBlbmQodmlkZW9FbCk7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lciA9IG5ldyBWaWRlb0NvbnRhaW5lcih2aWRlb0VsLCBldmVudEJ1cywgdGhpcy5zY2FsZSk7XG4gICAgdGhpcy5hdWRpb0NvbnRhaW5lciA9IG5ldyBBdWRpb0NvbnRhaW5lcih0aGlzLmV2ZW50QnVzKTtcbiAgICB0aGlzLnRpY2sgPSB0aGlzLnRpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiB9KTtcbiAgICBjb25zdCBub3cgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIHRoaXMucGFnZUVudGVyID0gbm93O1xuICAgIHRoaXMuc2luY2VQYWdlRW50ZXIgPSBEVGltZXN0YW1wLmRpZmYobm93LCBub3cpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGFjdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kSGFuZGxlcihhY3Rpb24pO1xuICAgIH0sIHRoaXMuVEFHKTtcblxuICAgIHRoaXMudGlja2VyUmVmID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHt9LCAxMDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGFsbCBtZWRpYSB0aGF0IGlzIHBsYXlpbmdcbiAgICovXG4gIGNsZWFyQWxsTWVkaWEoKSB7XG4gICAgdGhpcy52aWRlb0NvbnRhaW5lci5wYXVzZSgpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIucGF1c2UoKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGNvbnNvbGUubG9nKFwiVE9ETyBERVNUUk9ZIEFMTCBNRURJQVwiKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRpY2tlclJlZik7XG4gICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXJSZWYpO1xuICAgIHRoaXMuYXVkaW9Db250YWluZXIuZGVzdHJveSgpO1xuICAgIHRoaXMudmlkZW9Db250YWluZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgc2V0UGFnZShwYWdlOiBQYWdlRHRvKSB7XG4gICAgLy8gVE9ETyBTVE9QIFZJREVPL0FVRElPIFRIQVQgTUlHSFQgQkUgUExBWUlORyBJTiBUSEUgRE9NPz9cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnBhdXNlKCk7XG4gICAgdGhpcy5wYWdlRW50ZXIgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgIC8vIFRPRE8gVEhpcyBtaWdodCBiZSBhIGJ1ZyBpZiBzb21lb25lXG5cbiAgICBjb25zdCBzZXEgPSBwYWdlLmF1dG9QbGF5U2VxdWVuY2U7XG4gICAgLy8gdGhpcy5zZXF1ZW5jZSA9IHNlcSA/IFsuLi5zZXEuaXRlbXNdIDogW107XG4gICAgY29uc3QgeyBtYWluVmlkZW9JZCwgYXVkaW8gfSA9IHBhZ2U7XG4gICAgY29uc3QgYXVkaW9FbGVtZW50cyA9IHBhZ2UuYXVkaW87XG5cbiAgICBpZiAobWFpblZpZGVvSWQpIHtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRWaWRlb0J5SWQobWFpblZpZGVvSWQpO1xuICAgICAgaWYgKGR0bykge1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldER0byhkdG8pO1xuICAgICAgICB0aGlzLnZpZGVvQ29udGFpbmVyLnNldFN0eWxlKHsgLi4uZHRvLnN0eWxlLCB2aXNpYmlsaXR5OiBcInZpc2libGVcIiB9KTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIuc2V0U3R5bGUoeyB2aXNpYmlsaXR5OiBcImhpZGRlblwiIH0pO1xuICAgICAgLy8gSElERT9cbiAgICB9XG4gICAgaWYgKGF1ZGlvRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gYXVkaW9FbGVtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICB0aGlzLmF1ZGlvQ29udGFpbmVyLnNldEF1ZGlvKGZpcnN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlcSkge1xuICAgICAgdGhpcy5wbGF5U2VxdWVuY2Uoc2VxKTtcbiAgICB9XG4gICAgLy8gY29uc3QgaGFzVmlkZW8gPVxuICB9XG5cbiAgcHJpdmF0ZSBjb21tYW5kSGFuZGxlcihjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiVklERU9fUExBWV9DT01NQU5EXCIpIHtcbiAgICAgIGNvbnN0IHZpZGVvID0gY29tbWFuZC50YXJnZXRJZDtcbiAgICAgIGNvbnN0IGR0byA9IHRoaXMudmlkZW9Db250YWluZXIuZ2V0Q3VycmVudER0bygpO1xuXG4gICAgICBpZiAoZHRvICYmIGR0by5pZCA9PT0gY29tbWFuZC50YXJnZXRJZCkge1xuICAgICAgICBjb25zb2xlLmxvZyh2aWRlbyk7XG4gICAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGxheShkdG8udXJsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJWSURFT19QQVVTRV9DT01NQU5EXCIpIHtcbiAgICAgIHRoaXMudmlkZW9Db250YWluZXIucGF1c2UoKTtcbiAgICB9XG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gXCJBVURJT19QTEFZX0NPTU1BTkRcIikge1xuICAgICAgdGhpcy5hdWRpb0NvbnRhaW5lclxuICAgICAgICAucGxheVRvRW5kKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge30pXG4gICAgICAgIC5jYXRjaCgpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBcIkFVRElPX1BBVVNFX0NPTU1BTkRcIikge1xuICAgICAgLy8gdGhpcy5hdWRpb0NvbnRhaW5lci5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBsYXlTZXF1ZW5jZShzZXE6IERBdXRvUGxheVNlcXVlbmNlKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIFNUQVJURUQgLS0gVE9ETyBFVkVOVCBGT1IgVEhJUz8/XCIpO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBzZXEuaXRlbXM7XG4gICAgY29uc3QgdGVzdENsb25lID0gWy4uLmVsZW1lbnRzXTtcbiAgICBjb25zdCBmaXJzdCA9IHRlc3RDbG9uZS5wb3AoKTtcblxuICAgIGlmICghZmlyc3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICBzZXEuc3RhcnRDb21tYW5kcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjKTtcbiAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGMpO1xuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KERTdGF0ZVByb3BzLm1lZGlhQmxvY2tlZEJ5U2VxdWVuY2Uuc2V0VHJ1ZUNvbW1hbmQpO1xuICAgIC8vIGlmIChzZXEuYmxvY2tVc2VySW5wdXQpIHtcbiAgICAvLyAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoRFN0YXRlUHJvcHMuaW5wdXRCbG9ja2luZ0J5U2VxdWVuY2UuZ2V0U2V0VHJ1ZUNvbW1hbmQoKSk7XG4gICAgLy8gfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09IFwiYXV0b3BsYXktdmlkZW9cIikge1xuICAgICAgICBjb25zdCBkdG8gPSB0aGlzLnJlc291cmNlUHJvdmlkZXIuZ2V0VmlkZW9CeUlkKGl0ZW0udmlkZW9JZCk7XG4gICAgICAgIGlmIChkdG8pIHRoaXMudmlkZW9Db250YWluZXIuc2V0RHRvKGR0byk7XG4gICAgICAgIGF3YWl0IHRoaXMudmlkZW9Db250YWluZXIucGxheVRvRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5raW5kID09PSBcImF1dG9wbGF5LWF1ZGlvXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2coaXRlbSk7XG4gICAgICAgIGNvbnN0IGR0byA9IHRoaXMucmVzb3VyY2VQcm92aWRlci5nZXRBdWRpb0J5SWQoaXRlbS5hdWRpb0lkKTtcbiAgICAgICAgaWYgKGR0bykgdGhpcy5hdWRpb0NvbnRhaW5lci5zZXRBdWRpbyhkdG8pO1xuICAgICAgICBhd2FpdCB0aGlzLmF1ZGlvQ29udGFpbmVyLnBsYXlUb0VuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXEuZW5kQ29tbWFuZHMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoYyk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5hY3Rpb25TZXJ2aWNlLmVtaXQoRFN0YXRlUHJvcHMubWVkaWFCbG9ja2VkQnlTZXF1ZW5jZS5zZXRGYWxzZUNvbW1hbmQpO1xuICAgIC8vIHRoaXMuYWN0aW9uU2VydmljZS5lbWl0KERTdGF0ZVByb3BzLmlucHV0QmxvY2tpbmdCeVNlcXVlbmNlLnNldEZhbHNlQ29tbWFuZCk7XG4gICAgY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlNFUVVFTkNFIEVOREVEXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc2V0UGFnZSgpXG5cbiAgcHJpdmF0ZSB0aWNrKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudmlkZW8xLmdldFN0YXRzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQgfSBmcm9tIFwiLi9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERDb21tYW5kU3RvcmUge1xuICBzdWJzY3JpYmUoY2FsbGJhY2s6ICgpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEQ29tbWFuZERpc3BhdGNoZXIge1xuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRTdWJzY3JpYmVyRGF0YSB7XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBjYWxsYmFjazogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIERDb21tYW5kQnVzIGltcGxlbWVudHMgRENvbW1hbmRTdG9yZSwgRENvbW1hbmREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgQ09NTUFORF9CVVMgXSBcIjtcbiAgbG9nQ29tbWFuZHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kTG9nOiBBcnJheTxEQ29tbWFuZCAmIHsgdGltZXN0YW1wOiBEVGltZXN0YW1wIH0+ID0gW107XG4gIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDxDb21tYW5kU3Vic2NyaWJlckRhdGE+KCk7XG4gIC8vIHJlYWRvbmx5IHN1YlxuXG4gIHN1YnNjcmliZShjYjogKGNvbW1hbmQ6IERDb21tYW5kKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHN1YjogQ29tbWFuZFN1YnNjcmliZXJEYXRhID0ge1xuICAgICAgc3Vic2NyaWJlcklkLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgIH07XG5cbiAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzdWIpO1xuICAgIH07XG4gIH1cblxuICBlbWl0KGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRFRpbWVzdGFtcC5ub3coKTtcbiAgICB0aGlzLmNvbW1hbmRMb2cucHVzaCh7IC4uLmNvbW1hbmQsIHRpbWVzdGFtcCB9KTtcbiAgICBpZiAodGhpcy5sb2dDb21tYW5kcykge1xuICAgICAgdGhpcy5sb2dDb21tYW5kKGNvbW1hbmQpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIHN1YnNjcmliZXIuY2FsbGJhY2soY29tbWFuZCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IFsuLi50aGlzLmNvbW1hbmRMb2ddLFxuICAgICAgc3Vic2NyaWJlcnM6IFsuLi50aGlzLnN1YnNjcmliZXJzXSxcbiAgICAgIHN1YnNjcmliZXJzQ291bnQ6IHRoaXMuc3Vic2NyaWJlcnMuc2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKSB7XG4gICAgY29uc29sZS5ncm91cENvbGxhcHNlZCh0aGlzLlRBRyArIFwiIFwiICsgY29tbWFuZC5raW5kKTtcbiAgICBjb25zb2xlLmxvZyhcIlRhcmdldElEIDogXCIgKyBjb21tYW5kLnRhcmdldElkKTtcbiAgICBjb25zb2xlLmxvZyhjb21tYW5kLnBheWxvYWQpO1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuL0RFdmVudHNcIjtcblxuaW50ZXJmYWNlIFN1YnNjcmliZXJEYXRhIHtcbiAgICByZWFkb25seSBzdWJzY3JpYmVySWQ6IHN0cmluZztcbiAgICByZWFkb25seSBjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgREV2ZW50U3RvcmUge1xuICAgIHN1YnNjcmliZShjYjogKGV2ZW50OiBERXZlbnQpID0+IHZvaWQsIHN1YnNjcmliZXJJZDogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBERXZlbnREaXNwYXRjaGVyIHtcbiAgICBlbWl0KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xufVxuZXhwb3J0IGNsYXNzIEV2ZW50QnVzIGltcGxlbWVudHMgREV2ZW50U3RvcmUsIERFdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgVEFHID0gXCJbICBFVkVOVF9CVVMgIF0gOlwiO1xuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PChldmVudDogREV2ZW50KSA9PiB2b2lkPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlcnMgPSBuZXcgU2V0PFN1YnNjcmliZXJEYXRhPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBvbiBtb2R1bGUgZW5kLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudExvZzogREV2ZW50W10gPSBbXTtcbiAgICBjb25zb2xlTG9nRXZlbnRzID0gZmFsc2U7XG4gICAgLy8gcmVhZG9ubHkgc3ViXG5cbiAgICBzdWJzY3JpYmUoY2I6IChldmVudDogREV2ZW50KSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgICAgICAvLyB0aGlzLnN1YnNjcmliZXJzLmFkZChjYik7XG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXJEYXRhOiBTdWJzY3JpYmVyRGF0YSA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJJZCxcbiAgICAgICAgICAgIGNiLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gYWRkZWQ6IFwiICsgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQ6IFwiICsgdGhpcy5zdWJzY3JpYmVycy5zaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uc29sZUxvZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gcmVtb3ZlZDogXCIgKyBzdWJzY3JpYmVySWQpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzdWJzY3JpcHRpb24gY291bnQgIDogXCIgKyB0aGlzLnN1YnNjcmliZXJzLnNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoY2IpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlckRhdGEpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0YXRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcnNDb3VudDogdGhpcy5zdWJzY3JpYmVycy5zaXplLFxuICAgICAgICAgICAgZXZlbnRMb2c6IFsuLi50aGlzLmV2ZW50TG9nXSxcbiAgICAgICAgICAgIHN1YnNjcmliZXJzOiBbLi4udGhpcy5zdWJzY3JpYmVyc10sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZW1pdChldmVudDogREV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnNvbGVMb2dFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnRMb2cucHVzaChldmVudCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NBTExJTkcgRU1JVCcpO1xuICAgICAgICAgICAgZGF0YS5jYihldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGlzLmxvZ0V2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnQoZXZlbnQ6IERFdmVudCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKHRoaXMuVEFHICsgXCIgXCIgKyBldmVudC5raW5kKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJQcm9kdWNlcklkOiBcIiArIGV2ZW50LnByb2R1Y2VySWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudC5kYXRhKTtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9nRXZlbnRzKCkge1xuICAgICAgICBjb25zb2xlLmdyb3VwKHRoaXMuVEFHICsgXCJMT0dHXCIpO1xuICAgICAgICBjb25zb2xlLnRhYmxlKHRoaXMuZXZlbnRMb2cpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZhY3QgfSBmcm9tIFwiLi4vcnVsZXMvZmFjdFwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIHJlYWRvbmx5IHRpbWVzdGFtcDogRFRpbWVzdGFtcDtcbiAgICByZWFkb25seSBmYWN0OiBGYWN0O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFuc3dlcmVkUXVlc3Rpb24ge1xuICAgIGV4cG9ydCBjb25zdCBlcSA9IChhOiBBbnN3ZXJlZFF1ZXN0aW9uLCBiOiBBbnN3ZXJlZFF1ZXN0aW9uKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBhLmZhY3QgPT09IGIuZmFjdDtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VIaXN0b3J5IHtcbiAgICByZWFkb25seSBwYWdlSWQ6IHN0cmluZztcbiAgICByZWFkb25seSBhbnN3ZXJlZFF1ZXN0aW9uczogQW5zd2VyZWRRdWVzdGlvbltdO1xufVxuXG5leHBvcnQgY2xhc3MgSGlzdG9yeVF1ZSB7XG4gICAgcHJpdmF0ZSBoaXN0b3J5OiBQYWdlSGlzdG9yeVtdID0gW107XG5cbiAgICBnZXRGYWN0cygpOiBBcnJheTxGYWN0PiB7XG4gICAgICAgIGNvbnN0IGFuc3dlcnMgPSB0aGlzLmhpc3RvcnkubWFwKChoKSA9PiBoLmFuc3dlcmVkUXVlc3Rpb25zKS5mbGF0KDEpO1xuICAgICAgICBjb25zdCBmYWN0cyA9IGFuc3dlcnMubWFwKChhKSA9PiBhLmZhY3QpO1xuICAgICAgICAvLyBUT0RPIEZJTkQgTEFURVNUIEZBQ1QgKGFuc3dlcikgaWYgaGF2ZSBtdWx0aXBsZS5cbiAgICAgICAgcmV0dXJuIGZhY3RzO1xuICAgIH1cblxuICAgIGdldEFuc3dlcnMoKTogQXJyYXk8QW5zd2VyZWRRdWVzdGlvbj4ge1xuICAgICAgICBjb25zdCBhbnN3ZXJzID0gdGhpcy5oaXN0b3J5Lm1hcCgoaCkgPT4gaC5hbnN3ZXJlZFF1ZXN0aW9ucykuZmxhdCgxKTtcbiAgICAgICAgcmV0dXJuIGFuc3dlcnM7XG4gICAgfVxuXG4gICAgYWRkVG9IaXN0b3J5KHBhZ2U6IFBhZ2VIaXN0b3J5KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHBhZ2UpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmV4cG9ydCB0eXBlIENvbmRpdGlvbiA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYyB8IENvbmRpdGlvbi5Db21wbGV4O1xuXG5leHBvcnQgbmFtZXNwYWNlIENvbmRpdGlvbiB7XG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nT3BlcmF0b3IgPSBcImVxXCIgfCBcIm5vdC1lcVwiIHwgXCJsb25nZXItdGhlblwiIHwgXCJzaG9ydGVyLXRoZW5cIjtcblxuICAgIGV4cG9ydCB0eXBlIE51bWVyaWNPcGVyYXRvciA9XG4gICAgICAgIHwgXCJlcVwiXG4gICAgICAgIHwgXCJub3QtZXFcIlxuICAgICAgICB8IFwiZ3JlYXRlci10aGVuXCJcbiAgICAgICAgfCBcImxlc3MtdGhlblwiXG4gICAgICAgIHwgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCJcbiAgICAgICAgfCBcImxlc3MtdGhlbi1pbmNsdXNpdmVcIjtcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTnVtZXJpYyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJudW1lcmljLWNvbmRpdGlvblwiO1xuICAgICAgICByZWFkb25seSBvcGVyYXRvcjogTnVtZXJpY09wZXJhdG9yO1xuICAgICAgICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0cmluZyB7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUlkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHJlZmVyZW5jZUxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlTGFiZWw6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzdHJpbmctY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG9wZXJhdG9yOiBTdHJpbmdPcGVyYXRvcjtcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbXBsZXgge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImNvbXBsZXgtY29uZGl0aW9uXCI7XG4gICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgICAgICByZWFkb25seSBzb21lOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+O1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIFNpbXBsZSA9IENvbmRpdGlvbi5TdHJpbmcgfCBDb25kaXRpb24uTnVtZXJpYztcblxuICAgIC8qKlxuICAgICAqIEFuIGVtcHR5IGNvbmRpdGlvbiB3aWxsIGV2YWx1YXRlIHRvIGZhbHNlLFxuICAgICAqIEBwYXJhbSBjb25kaXRpb246IENvbmRpdGlvbi5BbnlcbiAgICAgKiBAcGFyYW0gZmFjdHNcbiAgICAgKi9cbiAgICBleHBvcnQgY29uc3QgZXZhbHVhdGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChjb25kaXRpb24ua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBldmFsdWF0ZVNpbXBsZShjb25kaXRpb24sIGZhY3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbXBsZXgtY29uZGl0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZXZhbHVhdGVDb21wbGV4KGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBjb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVDb21wbGV4ID0gKGNvbmRpdGlvbjogQ29uZGl0aW9uLkNvbXBsZXgsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChjb25kaXRpb24uc29tZS5sZW5ndGggPT09IDAgJiYgY29uZGl0aW9uLmFsbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxTb2x2ZWQgPSBjb25kaXRpb24uYWxsLm1hcCgoY29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZhbHVhdGVTaW1wbGUoY29uZGl0aW9uLCBmYWN0cyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvbWVFdmFsdWF0ZWQgPSBjb25kaXRpb24uc29tZS5tYXAoKGNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlU2ltcGxlKGNvbmRpdGlvbiwgZmFjdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYWxsUmVzdWx0ID0gYWxsU29sdmVkLmV2ZXJ5KERVdGlsLmlzVHJ1ZSk7XG4gICAgICAgIGNvbnN0IHNvbWVSZXN1bHQgPSBzb21lRXZhbHVhdGVkLmxlbmd0aCA9PT0gMCB8fCBzb21lRXZhbHVhdGVkLnNvbWUoRFV0aWwuaXNUcnVlKTtcbiAgICAgICAgcmV0dXJuIHNvbWVSZXN1bHQgJiYgYWxsUmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBldmFsdWF0ZVNpbXBsZSA9IChjb25kaXRpb246IENvbmRpdGlvbi5TaW1wbGUsIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZhY3QgPSBmYWN0cy5maW5kKChmKSA9PiBmLnJlZmVyZW5jZUlkID09PSBjb25kaXRpb24ucmVmZXJlbmNlSWQpO1xuICAgICAgICBpZiAoIWZhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1lcmljLWNvbmRpdGlvblwiOlxuICAgICAgICAgICAgICAgIGlmIChmYWN0LmtpbmQgPT09IFwibnVtZXJpYy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVOdW1lcmljKGNvbmRpdGlvbiwgZmFjdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmFjdC5raW5kID09PSBcInN0cmluZy1mYWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbHVhdGVTdHJpbmcoY29uZGl0aW9uLCBmYWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNFbXB0eSA9IChjb21wbGV4OiBDb21wbGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wbGV4LmFsbC5sZW5ndGggPT09IDAgJiYgY29tcGxleC5zb21lLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZhbHVhdGVTdHJpbmcgPSAoY29uZGl0aW9uOiBSZWFkb25seTxDb25kaXRpb24uU3RyaW5nPiwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IGNvbmRpdGlvbi5vcGVyYXRvcjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25kaXRpb24udmFsdWUgPT09IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2hvcnRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnZhbHVlICE9PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsb25nZXItdGhlblwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi52YWx1ZSAhPT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGV2YWx1YXRlTnVtZXJpYyA9IChjb25kaXRpb246IE51bWVyaWMsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3Qgb3AgPSBjb25kaXRpb24ub3BlcmF0b3I7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gY29uZGl0aW9uLnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlID09PSBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub3QtZXFcIjpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSAhPT0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ3JlYXRlci10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPiBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJncmVhdGVyLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPj0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGVzcy10aGVuXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPCBjb25kaXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJsZXNzLXRoZW4taW5jbHVzaXZlXCI6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUgPD0gY29uZGl0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGNvbnN0IF9nZXRBbGxTaW1wbGUgPSAoY29uZGl0aW9uOiBDb25kaXRpb24pOiBSZWFkb25seUFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0+IHtcbiAgICAgICAgY29uc3Qgc2ltcGxlOiBBcnJheTxDb25kaXRpb24uU2ltcGxlPiA9IFtdO1xuICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiY29tcGxleC1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uYWxsKTtcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaCguLi5jb25kaXRpb24uc29tZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtZXJpYy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZy1jb25kaXRpb25cIjpcbiAgICAgICAgICAgICAgICBzaW1wbGUucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IGdldEFsbFNpbXBsZUNvbmRpdGlvbnMgPSAoXG4gICAgICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uIHwgQXJyYXk8Q29uZGl0aW9uPlxuICAgICk6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uLlNpbXBsZT4gPT4ge1xuICAgICAgICBjb25zdCBzaW1wbGU6IEFycmF5PENvbmRpdGlvbi5TaW1wbGU+ID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgc2ltcGxlLnB1c2goLi4uX2dldEFsbFNpbXBsZShjKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNpbXBsZS5wdXNoKC4uLl9nZXRBbGxTaW1wbGUoY29uZGl0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuL2ZhY3RcIjtcbmltcG9ydCB7IERVdGlsIH0gZnJvbSBcIi4uL3V0aWxzL0RVdGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZTxPblN1Y2Nlc3NBY3Rpb24sIE9uRmFpbHVyZUFjdGlvbj4ge1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsOiBSZWFkb25seUFycmF5PENvbmRpdGlvbj47XG4gIHJlYWRvbmx5IHNvbWU6IFJlYWRvbmx5QXJyYXk8Q29uZGl0aW9uPjtcbiAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PE9uU3VjY2Vzc0FjdGlvbj47XG4gIHJlYWRvbmx5IG9uRmFpbHVyZTogUmVhZG9ubHlBcnJheTxPbkZhaWx1cmVBY3Rpb24+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bGUge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHJ1bGUgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSBydWxlXG4gICAqL1xuXG4gIGV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKHJ1bGU6IFJ1bGU8YW55LCBhbnk+KTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgZW1wdHlDb25kaXRpb25zID0gcnVsZS5hbGwubGVuZ3RoID09PSAwICYmIHJ1bGUuc29tZS5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgZW1wdHlBY3Rpb25zID0gcnVsZS5vblN1Y2Nlc3MubGVuZ3RoID09PSAwICYmIHJ1bGUub25GYWlsdXJlLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gZW1wdHlDb25kaXRpb25zIHx8IGVtcHR5QWN0aW9ucztcbiAgfTtcblxuICBleHBvcnQgY29uc3Qgc29sdmUgPSAocnVsZTogUnVsZTxhbnksIGFueT4sIGZhY3RzOiBSZWFkb25seUFycmF5PEZhY3Q+KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHJ1bGUuc29tZS5sZW5ndGggPT09IDAgJiYgcnVsZS5hbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUT0RPIFJFVFVSTiBXQVJOSU5HPyBPUiBMT0dHSU5HID9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb21lU29sdmVkID0gcnVsZS5zb21lLm1hcCgoY29uZGl0aW9uKSA9PiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCBmYWN0cykpO1xuXG4gICAgY29uc3Qgc29tZVJlc3VsdCA9IHNvbWVTb2x2ZWQubGVuZ3RoID09PSAwIHx8IHNvbWVTb2x2ZWQuc29tZShEVXRpbC5pc1RydWUpO1xuXG4gICAgY29uc3QgYWxsU29sdmVkID0gcnVsZS5hbGwubWFwKChjb25kaXRpb24pID0+IENvbmRpdGlvbi5ldmFsdWF0ZShjb25kaXRpb24sIGZhY3RzKSkuZXZlcnkoRFV0aWwuaXNUcnVlKTtcblxuICAgIHJldHVybiBhbGxTb2x2ZWQgJiYgc29tZVJlc3VsdDtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4vZmFjdFwiO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gXCIuL3J1bGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTb2x2ZVJlc3VsdDxTLCBGPiB7XG4gIG1hdGNoaW5nOiBSZWFkb25seUFycmF5PE1hdGNoPFMsIEY+PjtcbiAgZXJyb3JzOiBSZWFkb25seUFycmF5PFJ1bGVFbmdpbmVFcnJvcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2g8UywgRj4ge1xuICByZWFkb25seSBtYXRjaGluZ1J1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBydWxlRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWN0aW9uTGlzdDogUmVhZG9ubHlBcnJheTxTPiB8IFJlYWRvbmx5QXJyYXk8Rj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkga2luZD86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUnVsZUVuZ2luZTxTLCBGPiB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb2x2ZUFsbChydWxlczogUnVsZTxTLCBGPltdLCBmYWN0czogRmFjdFtdKTogU29sdmVSZXN1bHQ8UywgRj4ge1xuICAgIGNvbnN0IGVycm9yczogUnVsZUVuZ2luZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCBtYXRjaGluZzogTWF0Y2g8UywgRj5bXSA9IFtdO1xuICAgIHJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgIGlmIChSdWxlLmlzRW1wdHkocnVsZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcIkVtcHR5IHJ1bGU6IFwiICsgcnVsZS5pZCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoUnVsZS5zb2x2ZShydWxlLCBmYWN0cykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2g6IE1hdGNoPFMsIEY+ID0ge1xuICAgICAgICAgIHJ1bGVEZXNjcmlwdGlvbjogcnVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBtYXRjaGluZ1J1bGVJZDogcnVsZS5pZCA/PyBcIm5vLWlkLWdpdmVuXCIsXG4gICAgICAgICAgYWN0aW9uTGlzdDogWy4uLnJ1bGUub25TdWNjZXNzXSxcbiAgICAgICAgfTtcbiAgICAgICAgbWF0Y2hpbmcucHVzaChtYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbWF0Y2hpbmcsIGVycm9ycyB9O1xuICB9XG5cbiAgc29sdmUocnVsZTogUnVsZTxTLCBGPiwgZmFjdHM6IEZhY3RbXSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gVmFsaWRhdGUsIGFuZCBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIFJ1bGUuc29sdmUocnVsZSwgZmFjdHMpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUGFnZUR0byB9IGZyb20gXCIuLi9kdG8vU2NoZW1hRHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBOZXh0UXVlIHtcbiAgICBwcml2YXRlIG9yaWdpbmFsT3JkZXI6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgYWxsUGFnZXM6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIHByaXZhdGUgZXhjbHVkZWRUYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBleGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSByZW1haW5pbmc6IFBhZ2VEdG9bXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHBhZ2VzOiBQYWdlRHRvW10gPSBbXSkge1xuICAgICAgICB0aGlzLnJlc2V0UXVlKHBhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIHJlc2V0IHF1ZSB3aXRoIHRoZSBuZXcgcGFnZXMuXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgcmVzZXRRdWUocGFnZXM6IFBhZ2VEdG9bXSkge1xuICAgICAgICB0aGlzLmFsbFBhZ2VzID0gWy4uLnBhZ2VzXTtcbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSBbLi4ucGFnZXNdO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsT3JkZXIgPSB0aGlzLmFsbFBhZ2VzLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgfVxuXG4gICAgcG9wKCk6IFBhZ2VEdG8gfCBmYWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnJlbWFpbmluZy5zaGlmdCgpO1xuICAgICAgICAvLyBUT0RPIENMT05FPz9cbiAgICAgICAgcmV0dXJuIG5leHQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcGVlaygpOiBQYWdlRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5yZW1haW5pbmdbMF07XG4gICAgICAgIHJldHVybiBuZXh0ID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGp1bXBUb1BhZ2VCeUlkKHBhZ2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZW1haW5pbmcuZmluZEluZGV4KChwKSA9PiBwLmlkID09PSBwYWdlSWQpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1haW5pbmcgPSB0aGlzLnJlbWFpbmluZy5zbGljZShpbmRleCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5VGFnKHRhZzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnKSkge1xuICAgICAgICAgICAgdGFnLmZvckVhY2goKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRUYWdzLmFkZCh0YWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkVGFncy5hZGQodGFnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdpbGwgbm90IGJlIGluY2x1ZGVkXG4gICAgICogQHBhcmFtIHBhZ2VzXG4gICAgICovXG4gICAgaW5zZXJ0QXNOZXh0QnlGb3JjZShwYWdlczogUGFnZUR0b1tdKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nLnVuc2hpZnQoLi4ucGFnZXMpO1xuICAgIH1cblxuICAgIHJlbW92ZUJ5UGFnZUlkKHBhZ2VJZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFnZUlkKSkge1xuICAgICAgICAgICAgcGFnZUlkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlZEJ5UGFnZUlkLmFkZChpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5hZGQocGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlclJlbWFpbmluZygpO1xuICAgICAgICAvLyB0aGlzLmV4Y2x1ZGVkQnlQYWdlSWQuYWRkKHBhZ2VJZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJSZW1haW5pbmcoKSB7XG4gICAgICAgIHRoaXMucmVtYWluaW5nID0gdGhpcy5yZW1haW5pbmcuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0gcC50YWdzID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWVkZWRCeVRhZyA9ICF0YWdzLnNvbWUoKHRhZykgPT4gdGhpcy5leGNsdWRlZFRhZ3MuaGFzKHRhZykpO1xuICAgICAgICAgICAgY29uc3QgaXNJbmNsdWRlZEJ5UGFnZUlkID0gIXRoaXMuZXhjbHVkZWRCeVBhZ2VJZC5oYXMocC5pZCk7XG4gICAgICAgICAgICByZXR1cm4gaXNJbmNsdWRlZEJ5UGFnZUlkICYmIGlzSW5jbHVlZGVkQnlUYWc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9yZGVyLmxlbmd0aDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQW5zd2VyZWRRdWVzdGlvbiwgSGlzdG9yeVF1ZSwgUGFnZUhpc3RvcnkgfSBmcm9tIFwiLi9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgUnVsZUVuZ2luZSB9IGZyb20gXCIuLi9ydWxlcy9ydWxlLWVuZ2luZVwiO1xuaW1wb3J0IHsgTmV4dFF1ZSB9IGZyb20gXCIuL25leHQtcXVlXCI7XG5pbXBvcnQgeyBQYWdlRHRvLCBTY2hlbWFEdG8gfSBmcm9tIFwiLi4vZHRvL1NjaGVtYUR0b1wiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNvbW1hbmQsIFBhZ2VRdWVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBEVXRpbCB9IGZyb20gXCIuLi91dGlscy9EVXRpbFwiO1xuXG5leHBvcnQgdHlwZSBEUGxheWVyRGF0YSA9IFBpY2s8U2NoZW1hRHRvLCBcInBhZ2VzXCIgfCBcInBhZ2VTZXF1ZW5jZXNcIiB8IFwicnVsZXNcIj47XG5leHBvcnQgY2xhc3MgRFBsYXllciB7XG4gIHByaXZhdGUgaGlzdG9yeSA9IG5ldyBIaXN0b3J5UXVlKCk7XG4gIHByaXZhdGUgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lPFBhZ2VRdWVDb21tYW5kLCBQYWdlUXVlQ29tbWFuZD4oKTtcbiAgcHJpdmF0ZSBuZXh0UXVlID0gbmV3IE5leHRRdWUoKTtcbiAgcHJpdmF0ZSBkYXRhOiBEUGxheWVyRGF0YTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBEUGxheWVyRGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5uZXh0UXVlLnJlc2V0UXVlKGRhdGEucGFnZXMpO1xuICB9XG5cbiAgc2F2ZUhpc3RvcnkocGFnZUhpc3Rvcnk6IFBhZ2VIaXN0b3J5KSB7XG4gICAgY29uc29sZS5sb2coXCJTQVZFIEhJU1RPUllcIiwgcGFnZUhpc3RvcnkpO1xuICAgIHRoaXMuaGlzdG9yeS5hZGRUb0hpc3RvcnkocGFnZUhpc3RvcnkpO1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5oaXN0b3J5LmdldEZhY3RzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ydWxlRW5naW5lLnNvbHZlQWxsKHRoaXMuZGF0YS5ydWxlcywgZmFjdHMpO1xuICAgIGNvbnN0IG1hdGNoaW5nUnVsZXMgPSByZXN1bHQubWF0Y2hpbmc7XG4gICAgY29uc3QgYWN0aW9ucyA9IG1hdGNoaW5nUnVsZXMubWFwKChyKSA9PiByLmFjdGlvbkxpc3QpLmZsYXQoMSk7XG4gICAgYWN0aW9ucy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhhLnBheWxvYWQpO1xuICAgICAgc3dpdGNoIChhLmtpbmQpIHtcbiAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0pVTVBfVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgICAgdGhpcy5uZXh0UXVlLmp1bXBUb1BhZ2VCeUlkKGEucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAgICAgICB0aGlzLm5leHRRdWUucmVtb3ZlQnlQYWdlSWQoYS5wYXlsb2FkLnBhZ2VJZHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9UQUdfQ09NTUFORFwiOlxuICAgICAgICAgIHRoaXMubmV4dFF1ZS5yZW1vdmVCeVRhZyhhLnBheWxvYWQudGFnSWRzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlVOS05PV04gQUNUSU9OXCIsIGEpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coYWN0aW9ucyk7XG4gIH1cblxuICBnZXRSZXN1bHRzKCk6IEFuc3dlcmVkUXVlc3Rpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZXRBbnN3ZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGdvVG9QYWdlQnlJZChwYWdlSWQ6IHN0cmluZykge1xuICAgIHRoaXMubmV4dFF1ZS5qdW1wVG9QYWdlQnlJZChwYWdlSWQpO1xuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGlvbkNvbW1hbmQoY29tbWFuZDogTmF2aWdhdGlvbkNvbW1hbmQpIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSBcIlBBR0VfUVVFX05FWFRfUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIC8vIE5PIE5FRUQgVE8gRE8gQU5ZVEhJTkdcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuZ29Ub1BhZ2VCeUlkKGNvbW1hbmQucGF5bG9hZC5wYWdlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgICAgIHRoaXMuaW5zZXJ0U2VxdWVuY2VCeUlkKGNvbW1hbmQucGF5bG9hZC5zZXF1ZW5jZUlkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIERVdGlsLm5ldmVyQ2hlY2soY29tbWFuZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dFBhZ2UoKTogUGFnZUR0byB8IGZhbHNlIHtcbiAgICAvLyBUT0RPIEhBTkRMRSBSVUxFUyEhXG4gICAgcmV0dXJuIHRoaXMubmV4dFF1ZS5wb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0U2VxdWVuY2VCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXEgPSB0aGlzLmRhdGEucGFnZVNlcXVlbmNlcz8uZmluZCgocykgPT4gcy5pZCA9PT0gaWQpO1xuICAgIGlmIChzZXEpIHtcbiAgICAgIHRoaXMubmV4dFF1ZS5pbnNlcnRBc05leHRCeUZvcmNlKFsuLi5zZXEucGFnZXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSE9XIFRPIEhBTkRMRSBJTlZBTElEIElEX1JFRlM/PyBMT0dHRVI/P1xuICAgICAgLy8gTE9HIElOVkFMSUQgQ09NTUFORC5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG90YWwgbnVtYmVyIG9mIHBhZ2VzLlxuICAgKi9cbiAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5leHRRdWUucGFnZUNvdW50O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRENvbW1hbmQsIEVsZW1lbnRDb21tYW5kLCBTdGF0ZUNvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRcIjtcbmltcG9ydCB7IERFdmVudCB9IGZyb20gXCIuLi9ldmVudHMvREV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERFdmVudEhhbmRsZXI8RSBleHRlbmRzIERFdmVudCA9IERFdmVudD4ge1xuICAgIHJlYWRvbmx5IG9uRXZlbnQ6IEVbXCJraW5kXCJdO1xuICAgIHJlYWRvbmx5IHdoZW4/OiB7IHByb2R1Y2VySWQ/OiBzdHJpbmc7IGNvbmRpdGlvbj86IENvbmRpdGlvbiB9O1xuICAgIHJlYWRvbmx5IHRoZW5FeGVjdXRlOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNoYW5nZWRIYW5kbGVyIHtcbiAgICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSB3aGVuVHJ1ZTogUmVhZG9ubHlBcnJheTxFbGVtZW50Q29tbWFuZD47XG4gICAgcmVhZG9ubHkgd2hlbkZhbHNlOiBSZWFkb25seUFycmF5PEVsZW1lbnRDb21tYW5kPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBERXZlbnRIYW5kbGVyIHtcbiAgICBleHBvcnQgdHlwZSBMb29rVXAgPSBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PjtcbiAgICBleHBvcnQgY29uc3QgY3JlYXRlTG9va1VwID0gKGhhbmRsZXJzPzogUmVhZG9ubHlBcnJheTxERXZlbnRIYW5kbGVyPik6IExvb2tVcCA9PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8REV2ZW50SGFuZGxlcltcIm9uRXZlbnRcIl0sIEFycmF5PERFdmVudEhhbmRsZXI+PigpO1xuICAgICAgICBoYW5kbGVycz8uZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2luZCA9IGgub25FdmVudDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBtYXAuZ2V0KGtpbmQpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IGN1cnJlbnQgPyBbLi4uY3VycmVudCwgaF0gOiBbaF07XG4gICAgICAgICAgICBtYXAuc2V0KGtpbmQsIGFjdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IERTdHlsZSB9IGZyb20gXCIuL0RTdHlsZVwiO1xuaW1wb3J0IHsgREVsZW1lbnRCYXNlRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kLCBFbGVtZW50Q29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IERFdmVudEhhbmRsZXIgfSBmcm9tIFwiLi4vZXZlbnQtaGFuZGxlcnMvREV2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgRFV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRFV0aWxcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IERUaW1lc3RhbXAgfSBmcm9tIFwiLi4vY29tbW9uL0RUaW1lc3RhbXBcIjtcbmltcG9ydCB7IEFuaW1hdGlvbkR0byB9IGZyb20gXCIuLi9kdG8vQW5pbWF0aW9uRHRvXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi4vc3RhdGUvRHN0YXRlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBERWxlbWVudDxUIGV4dGVuZHMgSFRNTEVsZW1lbnQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWw6IFQ7XG4gICAgcHJpdmF0ZSBjbGlja0hhbmRsZXJJc0VuYWJsZWQgPSB0cnVlO1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgY3VyclN0eWxlOiBQYXJ0aWFsPERTdHlsZT4gPSB7XG4gICAgICAgIGZvbnRTaXplOiB7IF91bml0OiBcInB4XCIsIHZhbHVlOiAxMDAgfSxcbiAgICAgICAgZm9udFdlaWdodDogNTAwLFxuICAgICAgICB0ZXh0Q29sb3I6IFwiYmxhY2tcIixcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICB9O1xuXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBvblF1ZXJ5Q2hhbmdlZEhhbmRsZXJzID1cbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcnM6IERFdmVudEhhbmRsZXIuTG9va1VwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRCdXM6IEV2ZW50QnVzO1xuICAgIHByb3RlY3RlZCBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZUR0bzogREVsZW1lbnRCYXNlRHRvO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbDogVCxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBjb21tYW5kQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgZHRvOiBERWxlbWVudEJhc2VEdG8sXG4gICAgICAgIHNjYWxlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLmlkID0gZHRvLmlkO1xuICAgICAgICB0aGlzLmJhc2VEdG8gPSBkdG87XG4gICAgICAgIC8vIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gREV2ZW50SGFuZGxlci5jcmVhdGVMb29rVXAoZHRvLmV2ZW50SGFuZGxlcnMpO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIC8vIENMSUNLXG4gICAgICAgIHRoaXMub25DbGlja0hhbmRsZXIgPSB0aGlzLm9uQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGlja0hhbmRsZXI7XG5cbiAgICAgICAgLy8gSE9WRVJcbiAgICAgICAgdGhpcy5vbk1vdXNlT3ZlciA9IHRoaXMub25Nb3VzZU92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5lbC5vbm1vdXNlb3ZlciA9IHRoaXMub25Nb3VzZU92ZXI7XG5cbiAgICAgICAgaWYgKGR0bykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoZHRvPy5zdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWFuZFN1YnNjcmlwdGlvbiA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9TVFlMRV9DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoYy5wYXlsb2FkLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0RJU0FCTEVfQ0xJQ0tfQ09NTUFORFwiICYmIGMudGFyZ2V0SWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMua2luZCA9PT0gXCJFTEVNRU5UX0VOQUJMRV9DTElDS19DT01NQU5EXCIgJiYgYy50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVySXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjLmtpbmQgPT09IFwiRUxFTUVOVF9BTklNQVRFX0NPTU1BTkRcIiAmJiBjLnRhcmdldElkID09PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJUT0RPIElNUExFTUVOVCBBTklNQVRJT05fSEFORExFUiBJTiBERWxlbWVudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaWQpO1xuICAgICAgICAvLyBUT0RPIE1FTU9SWSBMRUFLXG4gICAgICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuZXZlbnRIYW5kbGVycy5nZXQoZXZlbnQua2luZCkgPz8gW107XG4gICAgICAgICAgICAvLyBUT0RPIEFwcGx5IENvbmRpdGlvbnMgaW4gV0hFTi5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gaGFuZGxlcnMubWFwKChoKSA9PiBoLnRoZW5FeGVjdXRlKS5mbGF0KDEpO1xuICAgICAgICAgICAgY29tbWFuZHMuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZG9BY3Rpb24oY29tbWFuZCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiSE9TVF9TQ0FMRV9DSEFOR0VEX0VWRU5UXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhBTkRMRSBUSElTIFNDQUxFIENIQU5HRSEhXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2ZW50LmtpbmQgPT09IFwiU1RBVEVfUVVFUllfUkVTVUxUX0NIQU5HRURfRVZFTlRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlDaGFuZ2VkSGFuZGxlcihldmVudC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXCJFTEVNRU5UOiBcIik7XG4gICAgICAgIHRoaXMubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY29tbWFuZFN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZXZlbnRTdWJzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGRlc3Ryb3koKTogdm9pZDtcblxuICAgIC8vIGFic3RyYWN0IHNldFNjYWxlKHNjYWxlOiBudW1iZXIpOiB2b2lkO1xuXG4gICAgLy8gLyoqXG4gICAgLy8gICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZS1lbWl0IGNvbW1hbmRzIGZyb20gZXZlbnQtaGFuZGxlcnM/XG4gICAgLy8gICogQHBhcmFtIGNvbW1hbmRcbiAgICAvLyAgKiBAcHJpdmF0ZVxuICAgIC8vICAqL1xuICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZHNFbWl0dGVkQnlQcml2YXRlRXZlbnRIYW5kbGVycyhjb21tYW5kOiBEQ29tbWFuZCkge1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhjb21tYW5kKTtcbiAgICAvLyAgICAgc3dpdGNoIChjb21tYW5kLmtpbmQpIHtcbiAgICAvLyAgICAgICAgIGNhc2UgXCJFTEVNRU5UX1NUWUxFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICBpZiAoY29tbWFuZC50YXJnZXRJZCA9PT0gdGhpcy5pZCkge1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyhjb21tYW5kLnBheWxvYWQuY2hhbmdlcyk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfQU5JTUFURV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgLy8gVE9ETyBDSEVDSyBGT1IgVEFSR0VUIElEXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5oYW5kbGVBbmltYXRlU2VsZkFjdGlvbihjb21tYW5kLnBheWxvYWQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRU5BQkxFX0NMSUNLX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCA9IHRydWU7XG4gICAgLy8gICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVTdHlsZXMoY29tbWFuZC5wYXlsb2FkLmNoYW5nZXMpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVMRU1FTlRfRElTQUJMRV9DTElDS19DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jbGlja0hhbmRsZXJJc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAvLyAgICAgICAgICAgICAvLyB0aGlzLmhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGNvbW1hbmQucGF5bG9hZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUExBWV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiVklERU9fUEFVU0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIkVOR0lORV9MRUFWRV9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19KVU1QX1RPX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJWSURFT19TRVRfVk9MVU1FX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QTEFZX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJBVURJT19QQVVTRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiQVVESU9fU0VUX1ZPTFVNRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9HT19UT19TRVFVRU5DRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfR09fVE9fUEFHRV9DT01NQU5EXCI6XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgLy8gICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICBjYXNlIFwiUEFHRV9RVUVfRVhDTFVERV9CWV9QQUdFX0lEX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJQQUdFX1FVRV9KVU1QX1RPX1BBR0VfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgY2FzZSBcIlBBR0VfUVVFX0VYQ0xVREVfQllfVEFHX0NPTU1BTkRcIjpcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChjb21tYW5kKTtcbiAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgIGNhc2UgXCJTVEFURV9NVVRBVEVfQ09NTUFORFwiOlxuICAgIC8vICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgZGVmYXVsdDpcbiAgICAvLyAgICAgICAgICAgICBEVXRpbC5uZXZlckNoZWNrKGNvbW1hbmQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBxdWVyeUNoYW5nZWRIYW5kbGVyKHJlc3VsdDogRFN0YXRlLlN0YXRlUXVlcnlSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbWF5YmVIYW5kbGVycyA9IHRoaXMuYmFzZUR0by5vblN0YXRlQ2hhbmdlO1xuICAgICAgICBpZiAoIW1heWJlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeUhhbmRsZXJzID0gbWF5YmVIYW5kbGVycy5maWx0ZXIoKGgpID0+IGgucXVlcnlOYW1lID09PSByZXN1bHQucXVlcnlOYW1lKTtcbiAgICAgICAgcXVlcnlIYW5kbGVycy5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmN1cnIpIHtcbiAgICAgICAgICAgICAgICBoLndoZW5UcnVlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGgud2hlbkZhbHNlLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb0FjdGlvbihjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVzLmVtaXQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhmaW5kQnlRdWVyeSwgdmFsdWUpO1xuICAgICAgICAvLyBjb25zdCBhbGwgPSB0aGlzLmJhc2VEdG8uc3RhdGVRdWVyeUNoYW5nZSA/PyBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2tIYW5kbGVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coKTtcbiAgICAgICAgaWYgKCF0aGlzLmNsaWNrSGFuZGxlcklzRW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5pZCArIFwiQ2xpY2sgZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xpY2tBY3Rpb24gPSB0aGlzLmJhc2VEdG8ub25DbGljaztcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJOQVRJVkUgQ0xJQ0sgRUxFTUVOVDogSGFuZGxlcnMgXCIgKyBjbGlja0FjdGlvbj8ubGVuZ3RoKTtcbiAgICAgICAgaWYgKGNsaWNrQWN0aW9uICYmIGNsaWNrQWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEFSR0VUSUQ6IFwiICsgY2xpY2tBY3Rpb25bMF0udGFyZ2V0SWQgKyBcIiBcIiArIHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEJ1cy5lbWl0KHtcbiAgICAgICAgICAgICAgICBraW5kOiBcIlVTRVJfQ0xJQ0tFRF9FVkVOVFwiLFxuICAgICAgICAgICAgICAgIHByb2R1Y2VyOiBcIkRVc2VyXCIsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXJJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVsZW1lbnRJZDogdGhpcy5pZCB9LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xpY2tBY3Rpb24uZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1cy5lbWl0KGNvbW1hbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTW91c2VPdmVyKF86IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZXYpO1xuICAgIH1cblxuICAgIHNldFN0eWxlKHN0eWxlOiBQYXJ0aWFsPERTdHlsZT4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoc3R5bGUpO1xuICAgIH1cblxuICAgIGFwcGVuZFlvdXJzZWxmKHBhcmVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZCh0aGlzLmVsKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocGFyZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFuaW1hdGVTZWxmQWN0aW9uKGR0bzogQW5pbWF0aW9uRHRvKSB7XG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmdTZWxmID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyBrZXlmcmFtZXMsIG9wdGlvbnMgfSA9IGR0bztcblxuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmVsLmFuaW1hdGUoa2V5ZnJhbWVzLCBvcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKGU6IEFuaW1hdGlvblBsYXliYWNrRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBhbmltYXRpb24ub25yZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJBTklNQVRJT04gUkVNT1ZFRDogXCIgKyBhbmltYXRpb24uaWQpO1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZ1NlbGYgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgYW5pbWF0aW9uLm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQU5JTUFUSU9OIENBTkNFTEVEOiBcIiArIGFuaW1hdGlvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nU2VsZiA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplKCkge1xuICAgICAgICBEU3R5bGUubm9ybWFsaXplKHRoaXMuZWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVTdHlsZXMoc3R5bGU6IFBhcnRpYWw8RFN0eWxlPikge1xuICAgICAgICB0aGlzLmN1cnJTdHlsZSA9IE9iamVjdC5hc3NpZ24odGhpcy5jdXJyU3R5bGUsIHN0eWxlKTtcbiAgICAgICAgRFN0eWxlLmFwcGx5U3R5bGVzKHRoaXMuZWwsIHRoaXMuY3VyclN0eWxlLCB0aGlzLnNjYWxlLnNjYWxlKTtcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4vREVsZW1lbnRcIjtcbmltcG9ydCB7IEREaXZEdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRFRleHQgfSBmcm9tIFwiLi9EVGV4dFwiO1xuaW1wb3J0IHsgREltZyB9IGZyb20gXCIuL0RJbWdcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBERGl2IGV4dGVuZHMgREVsZW1lbnQ8SFRNTERpdkVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBERGl2IF06IFwiO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U3R5bGUgPSB7IHg6IDIyLCB5OiA0IH07XG4gICAgcHJpdmF0ZSBjaGlsZHJlbjogQXJyYXk8RFRleHQgfCBESW1nPiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGR0bzogRERpdkR0byxcbiAgICAgICAgZXZlbnRCdXM6IEV2ZW50QnVzLFxuICAgICAgICBhY3Rpb25TZXJ2aWNlOiBEQ29tbWFuZEJ1cyxcbiAgICAgICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgICAgICAgY2hpbGRyZW46IEFycmF5PERUZXh0IHwgREltZz5cbiAgICApIHtcbiAgICAgICAgY29uc3QgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHN1cGVyKGQsIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLmFwcGVuZFlvdXJzZWxmKHRoaXMuZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuL0RFbGVtZW50XCI7XG5pbXBvcnQgeyBESW1nRHRvIH0gZnJvbSBcIi4uL2R0by9ERWxlbWVudC5kdG9cIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vZW5naW5lL3NjYWxlXCI7XG5pbXBvcnQgeyBEVGltZXN0YW1wIH0gZnJvbSBcIi4uL2NvbW1vbi9EVGltZXN0YW1wXCI7XG5cbmV4cG9ydCBjbGFzcyBESW1nIGV4dGVuZHMgREVsZW1lbnQ8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHByaXZhdGUgc3RhdGljIElNQUdFX0NPVU5UID0gMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGltYWdlQ291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBUQUc6IHN0cmluZztcbiAgICByZWFkb25seSBUSU1JTkdfVEFHOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkU3RhcnQ6IERUaW1lc3RhbXA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkdG86IERJbWdEdG8sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uU3ViamVjdDogRENvbW1hbmRCdXMsXG4gICAgICAgIHJlYWRvbmx5IGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICAgICAgcmVhZG9ubHkgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKSwgZXZlbnRCdXMsIGFjdGlvblN1YmplY3QsIGR0bywgc2NhbGVTZXJ2aWNlKTtcbiAgICAgICAgREltZy5JTUFHRV9DT1VOVCArPSAxO1xuICAgICAgICB0aGlzLmltYWdlQ291bnQgPSBESW1nLklNQUdFX0NPVU5UO1xuICAgICAgICB0aGlzLlRBRyA9IFwiW0RfSU1HIFwiICsgREltZy5JTUFHRV9DT1VOVCArIFwiIF06IFwiO1xuICAgICAgICB0aGlzLlRJTUlOR19UQUcgPSBcImxvYWQtdGltZSAoXCIgKyBESW1nLklNQUdFX0NPVU5UICsgXCIpIFwiO1xuICAgICAgICB0aGlzLmVsLmxvYWRpbmcgPSBcImVhZ2VyXCI7XG4gICAgICAgIHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICAvLyBCaW5kIEhhbmRsZXJzXG4gICAgICAgIHRoaXMub25FcnJvciA9IHRoaXMub25FcnJvci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IHRoaXMub25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIC8vIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmVsLm9ubG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICB0aGlzLmVsLm9uZXJyb3IgPSB0aGlzLm9uRXJyb3I7XG4gICAgICAgIC8vIHRoaXMuZWwub25jbGljayA9IHRoaXMub25DbGljaztcbiAgICAgICAgdGhpcy5lbC5zcmMgPSBkdG8udXJsO1xuICAgICAgICBjb25zb2xlLnRpbWUodGhpcy5USU1JTkdfVEFHKTtcbiAgICB9XG5cbiAgICBsb2coKTogdm9pZCB7fVxuXG4gICAgc2V0U2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICBjb25zb2xlLmxvZyhzY2FsZSk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FcnJvcihldjogRXZlbnQgfCBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGV2IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCIgXCIgKyBldi50eXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgZXYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvYWQoXzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbG9hZFRpbWUgPSBEVGltZXN0YW1wLmRpZmZOb3codGhpcy5sb2FkU3RhcnQpO1xuXG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICAgICAgICBraW5kOiBcIklNQUdFX0xPQURFRF9FVkVOVFwiLFxuICAgICAgICAgICAgcHJvZHVjZXI6IFwiREltYWdlXCIsXG4gICAgICAgICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEVGltZXN0YW1wLm5vdygpLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGxvYWRUaW1lLFxuICAgICAgICAgICAgICAgIG5hdHVyYWxIZWlnaHQ6IHRoaXMuZWwubmF0dXJhbEhlaWdodCxcbiAgICAgICAgICAgICAgICBuYXR1cmFsV2lkdGg6IHRoaXMuZWwubmF0dXJhbFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5lbC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuZWwud2lkdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgREVsZW1lbnQgfSBmcm9tIFwiLi9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRFRleHREdG8gfSBmcm9tIFwiLi4vZHRvL0RFbGVtZW50LmR0b1wiO1xuaW1wb3J0IHsgRENvbW1hbmRCdXMgfSBmcm9tIFwiLi4vY29tbWFuZHMvRENvbW1hbmRCdXNcIjtcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSBcIi4uL2V2ZW50cy9ldmVudC1idXNcIjtcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gXCIuLi9lbmdpbmUvc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERUZXh0IGV4dGVuZHMgREVsZW1lbnQ8SFRNTFBhcmFncmFwaEVsZW1lbnQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBEUGFyYWdyYXBoIF06IFwiO1xuICAgIHByb3RlY3RlZCBkZWZhdWx0U3R5bGUgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKGR0bzogRFRleHREdG8sIGV2ZW50QnVzOiBFdmVudEJ1cywgYWN0aW9uU2VydmljZTogRENvbW1hbmRCdXMsIHNjYWxlOiBTY2FsZVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIiksIGV2ZW50QnVzLCBhY3Rpb25TZXJ2aWNlLCBkdG8sIHNjYWxlKTtcbiAgICAgICAgdGhpcy5lbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgdGhpcy5lbC5pbm5lclRleHQgPSBcIlwiICsgZHRvLnRleHQ7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUoZHRvLnN0eWxlKTtcbiAgICB9XG5cbiAgICBzZXRTY2FsZShzY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJyU3R5bGUpO1xuICAgICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZWwuc3R5bGUuZm9udFNpemU7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJzY2FsZTogXCIgKyBzY2FsZSArIFwiIEZvbnRzaXplOiBcIiArIGZvbnRTaXplKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBERWxlbWVudCB9IGZyb20gXCIuLi9EZWxlbWVudC9ERWxlbWVudFwiO1xuaW1wb3J0IHsgRERpdiB9IGZyb20gXCIuLi9EZWxlbWVudC9EZGl2XCI7XG5pbXBvcnQgeyBESW1nIH0gZnJvbSBcIi4uL0RlbGVtZW50L0RJbWdcIjtcbmltcG9ydCB7IERUZXh0IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RUZXh0XCI7XG5pbXBvcnQgeyBERGl2RHRvLCBERWxlbWVudER0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURFbGVtZW50ID0gKFxuICAgIGR0bzogREVsZW1lbnREdG8sXG4gICAgYWN0aW9uQnVzOiBEQ29tbWFuZEJ1cyxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZVxuKTogREVsZW1lbnQ8YW55PiA9PiB7XG4gICAgc3dpdGNoIChkdG8uX3RhZykge1xuICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgICAgICBjb25zdCBjaGlsZEVscyA9IGNyZWF0ZUNoaWxkcmVuRm9yRGl2KGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGl2ID0gbmV3IEREaXYoZHRvLCBldmVudEJ1cywgYWN0aW9uQnVzLCBzY2FsZSwgY2hpbGRFbHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0RpdjtcbiAgICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBESW1nKGR0bywgYWN0aW9uQnVzLCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEVGV4dChkdG8sIGV2ZW50QnVzLCBhY3Rpb25CdXMsIHNjYWxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrOiBuZXZlciA9IGR0bztcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZHRvIGdpdmVuIHRvIHRoZSBjcmVhdGVERWxlbWVudCBmdW5jdGlvbi5cIik7XG4gICAgICAgIC8vIFRPRE8gTE9HR0lORyBvciBjcmVhdGUgYW55IEhUTUwtRUxFTUVOVD8/XG4gICAgfVxufTtcblxuY29uc3QgY3JlYXRlQ2hpbGRyZW5Gb3JEaXYgPSAoXG4gICAgZHRvOiBERGl2RHRvLFxuICAgIGFjdGlvblN1YmplY3Q6IERDb21tYW5kQnVzLFxuICAgIGV2ZW50QnVzOiBFdmVudEJ1cyxcbiAgICBzY2FsZTogU2NhbGVTZXJ2aWNlXG4pOiBERGl2W1wiY2hpbGRyZW5cIl0gPT4ge1xuICAgIGNvbnN0IGNoaWxkRHRvID0gZHRvLmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkRWxzOiBBcnJheTxESW1nIHwgRFRleHQ+ID0gW107XG4gICAgLy8gY29uc29sZS5sb2coY2hpbGRFbGVtZW50cyk7XG4gICAgY2hpbGREdG8uZm9yRWFjaCgoZHRvKSA9PiB7XG4gICAgICAgIGlmIChkdG8uX3RhZyA9PT0gXCJwXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBuZXcgRFRleHQoZHRvLCBldmVudEJ1cywgYWN0aW9uU3ViamVjdCwgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHRvLl90YWcgPT09IFwiaW1nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gbmV3IERJbWcoZHRvLCBhY3Rpb25TdWJqZWN0LCBldmVudEJ1cywgc2NhbGUpO1xuICAgICAgICAgICAgY2hpbGRFbHMucHVzaChuZXdJbWFnZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRFbHM7XG59O1xuIiwgImltcG9ydCB7IERFbGVtZW50IH0gZnJvbSBcIi4uL0RlbGVtZW50L0RFbGVtZW50XCI7XG5pbXBvcnQgeyBQYWdlRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IGNyZWF0ZURFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEQ29tbWFuZEJ1cyB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZEJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcblxuZXhwb3J0IGNsYXNzIERQYWdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgRFBhZ2UgXTogXCI7XG4gIHByaXZhdGUgZWxlbWVudHM6IERFbGVtZW50PEhUTUxFbGVtZW50PltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZEJ1cztcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogU2NhbGVTZXJ2aWNlO1xuICAvLyBUb2RvIEdMT0JBTCBFVkVOVF9CVVNTIEFORCBQQUdFIEVWRU5UUzpcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGR0bzogUGFnZUR0byxcbiAgICBldmVudEJ1czogRXZlbnRCdXMsXG4gICAgY29tbWFuZEJ1czogRENvbW1hbmRCdXMsXG4gICAgc2NhbGU6IFNjYWxlU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuY29tbWFuZEJ1cyA9IGNvbW1hbmRCdXM7XG4gICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuICAgIHRoaXMuZWxlbWVudHMgPSBkdG8uZWxlbWVudHMubWFwKChkdG8pID0+IGNyZWF0ZURFbGVtZW50KGR0bywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLmV2ZW50QnVzLCB0aGlzLnNjYWxlKSk7XG4gIH1cblxuICBhcHBlbmRZb3Vyc2VsZihwYXJlbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBBUFBFTkRJTkcgVE8gUEFSRU5UXCIpO1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmFwcGVuZFlvdXJzZWxmKHBhcmVudCk7XG4gICAgICAvLyBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwuZWwpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgKCFwcmVsb2FkTW9kZSkge1xuICAgIHRoaXMuZXZlbnRCdXMuZW1pdCh7XG4gICAgICBraW5kOiBcIlBBR0VfRU5URVJfRVZFTlRcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHByb2R1Y2VyOiBcIkRQYWdlXCIsXG4gICAgICBwcm9kdWNlcklkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogeyBwYWdlSWQ6IHRoaXMuaWQgfSxcbiAgICB9KTtcbiAgICAvLyB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZygpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLlRBRyArICdzY2FsZSAtICcgKyB0aGlzLnNjYWxlKTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kdG8uaWQ7XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgU2NhbGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlSGVpZ2h0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VXaWR0aDtcbiAgcHJpdmF0ZSBjb250YWluZXJIZWlnaHQgPSAxMzAwO1xuICBwcml2YXRlIGNvbnRhaW5lcldpZHRoID0gMTMwMDtcblxuICBnZXQgc2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjYWxlO1xuICB9XG5cbiAgZ2V0IHBhZ2VIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUhlaWdodCAqIHRoaXMuc2NhbGU7XG4gIH1cbiAgZ2V0IHBhZ2VXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlV2lkdGggKiB0aGlzLl9zY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjYWxlID0gMTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZXJzID0gbmV3IFNldDwoc2NhbGU6IG51bWJlcikgPT4gdm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IHsgYmFzZUhlaWdodDogbnVtYmVyOyBiYXNlV2lkdGg6IG51bWJlcjsgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7IGNvbnRhaW5lcldpZHRoOiBudW1iZXIgfSkge1xuICAgIHRoaXMuYmFzZUhlaWdodCA9IGNvbmZpZy5iYXNlSGVpZ2h0O1xuICAgIHRoaXMuYmFzZVdpZHRoID0gY29uZmlnLmJhc2VXaWR0aDtcbiAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IGNvbmZpZy5jb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy5jb250YWluZXJXaWR0aCA9IGNvbmZpZy5jb250YWluZXJXaWR0aDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cblxuICBzZXRDb250YWluZXJCb3VuZHMoYm91bmRzOiB7IGhlaWdodDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0pIHtcbiAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gYm91bmRzLndpZHRoO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gYm91bmRzLmhlaWdodDtcbiAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVTY2FsZSgpIHtcbiAgICBjb25zdCBzY2FsZUZuID0gU2NhbGUuY2FsYyh0aGlzLmJhc2VIZWlnaHQsIHRoaXMuYmFzZVdpZHRoKTtcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlRm4oeyBoZWlnaHQ6IHRoaXMuY29udGFpbmVySGVpZ2h0LCB3aWR0aDogdGhpcy5jb250YWluZXJXaWR0aCB9KTtcbiAgICBjb25zdCBoYXNDaGFuZ2VkID0gdGhpcy5zY2FsZSAhPT0gc2NhbGU7XG4gICAgdGhpcy5fc2NhbGUgPSBzY2FsZTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBmbih0aGlzLl9zY2FsZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZShzY2FsZUNoYW5nZUhhbmRsZXI6IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkLCBzdWJzY3JpYmVySWQ6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKHN1YnNjcmliZXJJZCk7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoc2NhbGVDaGFuZ2VIYW5kbGVyKTtcbiAgICBzY2FsZUNoYW5nZUhhbmRsZXIodGhpcy5fc2NhbGUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmRlbGV0ZShzY2FsZUNoYW5nZUhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBuYW1lc3BhY2UgU2NhbGUge1xuICBleHBvcnQgY29uc3QgY2FsYyA9IChiYXNlSGVpZ2h0OiBudW1iZXIsIGJhc2VXaWR0aDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIChjb250YWluZXI6IHsgaGVpZ2h0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSkgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjb250YWluZXIuaGVpZ2h0IC8gYmFzZUhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjb250YWluZXIud2lkdGggLyBiYXNlV2lkdGg7XG4gICAgICByZXR1cm4gTWF0aC5taW4oaGVpZ2h0UmF0aW8sIHdpZHRoUmF0aW8pO1xuICAgIH07XG4gIH07XG5cbiAgdHlwZSBTY2FsZVBvc0lucHV0ID0geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaDogbnVtYmVyOyB3OiBudW1iZXIgfTtcblxuICBleHBvcnQgY29uc3Qgc2NhbGVGdW5jdGlvbkNyZWF0b3IgPSAoc2NhbGU6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAodmFsdWU6IG51bWJlcikgPT4gdmFsdWUgKiBzY2FsZTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBEQXVkaW9EdG8sIERJbWdEdG8sIERWaWRlb0R0byB9IGZyb20gXCIuLi9kdG8vREVsZW1lbnQuZHRvXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVByb3ZpZGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiWyBSRVNPVVJDRV9QUk9WSURFUiBdOiBcIjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZGVvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERWaWRlb0R0bz4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1ZGlvTWFwID0gbmV3IE1hcDxzdHJpbmcsIERBdWRpb0R0bz4oKTtcbiAgICBjb25zdHJ1Y3RvcihkYXRhOiB7IHZpZGVvczogUmVhZG9ubHlBcnJheTxEVmlkZW9EdG8+OyBhdWRpbzogUmVhZG9ubHlBcnJheTxEQXVkaW9EdG8+IH0pIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIlZJREVPX0NPVU5UIFwiICsgZGF0YS52aWRlb3MubGVuZ3RoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIkFVRElPX0NPVU5UIFwiICsgZGF0YS5hdWRpby5sZW5ndGgpO1xuICAgICAgICBkYXRhLnZpZGVvcy5mb3JFYWNoKCh2aWRlbykgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb01hcC5zZXQodmlkZW8uaWQsIHZpZGVvKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEuYXVkaW8uZm9yRWFjaCgoYXVkaW8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9NYXAuc2V0KGF1ZGlvLmlkLCBhdWRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldEF1ZGlvQnlJZChpZDogc3RyaW5nKTogREF1ZGlvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZUF1ZGlvID0gdGhpcy5hdWRpb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlQXVkaW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIkF1ZGlvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZUF1ZGlvID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGdldFZpZGVvQnlJZChpZDogc3RyaW5nKTogRFZpZGVvRHRvIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBtYXliZVZpZGVvID0gdGhpcy52aWRlb01hcC5nZXQoaWQpO1xuICAgICAgICBpZiAoIW1heWJlVmlkZW8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5UQUcgKyBcIlZpZGVvIGJ5IGlkIFwiICsgaWQgKyBcIiBkb250IGV4aXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXliZVZpZGVvID8/IGZhbHNlO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgT2s8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSB2YWx1ZTogVCkge31cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmKHRoaXMudmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IE9rPEE+KHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGYWlsdXJlPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nKSB7fVxuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFwPEE+KF9mOiAodDogVCkgPT4gQSk6IElSZXN1bHQ8QT4ge1xuICAgICAgICByZXR1cm4gbmV3IEZhaWx1cmU8QT4odGhpcy5tZXNzYWdlKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJUmVzdWx0PFQ+IHtcbiAgICBpc09rKCk6IHRoaXMgaXMgT2s8VD47XG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPjtcbiAgICBtYXA8QT4oZjogKHQ6IFQpID0+IEEpOiBJUmVzdWx0PEE+O1xufVxuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBGYWlsdXJlPFQ+IHwgT2s8VD47XG5leHBvcnQgbmFtZXNwYWNlIFJlc3VsdCB7XG4gICAgZXhwb3J0IGNvbnN0IG9rID0gPFQ+KHZhbHVlOiBUKSA9PiBuZXcgT2s8VD4odmFsdWUpO1xuICAgIGV4cG9ydCBjb25zdCBmYWlsdXJlID0gPFQ+KG1lc3NhZ2U6IHN0cmluZykgPT4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG4iLCAiaW1wb3J0IHsgRmFjdCB9IGZyb20gXCIuLi9ydWxlcy9mYWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IFN0YXRlQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kcy9EQ29tbWFuZFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIERTdGF0ZSB7XG4gICAgaW50ZXJmYWNlIFByb3BEZWZpbml0aW9uPFR5cGVOYW1lLCBUeXBlIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJlYWRvbmx5IF90eXBlOiBUeXBlTmFtZTtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgcHJvcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGluaXRpYWxWYWx1ZT86IFR5cGU7XG4gICAgICAgIHJlYWRvbmx5IG9wdGlvbnM/OiBSZWFkb25seUFycmF5PFByb3BWYWx1ZTxUeXBlPj47XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgTnVtZXJpY1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcIm51bWJlclwiLCBudW1iZXI+O1xuICAgIGV4cG9ydCB0eXBlIFN0cmluZ1Byb3AgPSBQcm9wRGVmaW5pdGlvbjxcInN0cmluZ1wiLCBzdHJpbmc+O1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBmcm9tRXZlbnRIYW5kbGVyIHtcbiAgICAgICAgcmVhZG9ubHkgb25FdmVudDogREV2ZW50W1wia2luZFwiXTtcbiAgICAgICAgcmVhZG9ubHkgdGhlbkV4ZWN1dGU6IFJlYWRvbmx5QXJyYXk8U3RhdGVDb21tYW5kPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFByb3BWYWx1ZTxUPiB7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBUO1xuICAgICAgICByZWFkb25seSB2YWx1ZUxhYmVsOiBzdHJpbmc7XG4gICAgfVxuICAgIGV4cG9ydCB0eXBlIFByb3AgPSBOdW1lcmljUHJvcCB8IFN0cmluZ1Byb3A7XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFN0cmluZ011dGF0aW9uIHtcbiAgICAgICAgcmVhZG9ubHkga2luZDogXCJzZXQtc3RyaW5nXCI7XG4gICAgICAgIHJlYWRvbmx5IHByb3BOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBJbmNyZW1lbnROdW1iZXJNdXRhdGlvbiB7XG4gICAgICAgIHJlYWRvbmx5IGtpbmQ6IFwiaW5jcmVtZW50LW51bWJlclwiO1xuICAgICAgICByZWFkb25seSBwcm9wTmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBzdGVwU2l6ZTogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBpZk5vdEV4aXN0VGhlblNldFRvOiBudW1iZXI7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGVjcmVtZW50TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcImRlY3JlbWVudC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgc3RlcFNpemU6IG51bWJlcjtcbiAgICAgICAgcmVhZG9ubHkgaWZOb3RFeGlzdFRoZW5TZXRUbzogbnVtYmVyO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0TnVtYmVyTXV0YXRpb24ge1xuICAgICAgICByZWFkb25seSBraW5kOiBcInNldC1udW1iZXJcIjtcbiAgICAgICAgcmVhZG9ubHkgcHJvcE5hbWU6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICB9XG4gICAgZXhwb3J0IHR5cGUgTnVtYmVyTXV0YXRpb25zID0gSW5jcmVtZW50TnVtYmVyTXV0YXRpb24gfCBEZWNyZW1lbnROdW1iZXJNdXRhdGlvbiB8IFNldE51bWJlck11dGF0aW9uO1xuXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVNdXRhdGlvbiA9IFNldFN0cmluZ011dGF0aW9uIHwgTnVtYmVyTXV0YXRpb25zO1xuXG4gICAgZXhwb3J0IGNvbnN0IGlzTnVtYmVyTXV0YXRpb24gPSAobXV0YXRpb25zOiBTdGF0ZU11dGF0aW9uKTogbXV0YXRpb25zIGlzIE51bWJlck11dGF0aW9ucyA9PiB7XG4gICAgICAgIGlmICghbXV0YXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbXV0YXRpb25zLmtpbmQgPT09IFwic2V0LW51bWJlclwiIHx8XG4gICAgICAgICAgICBtdXRhdGlvbnMua2luZCA9PT0gXCJkZWNyZW1lbnQtbnVtYmVyXCIgfHxcbiAgICAgICAgICAgIG11dGF0aW9ucy5raW5kID09PSBcImluY3JlbWVudC1udW1iZXJcIlxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBleHBvcnQgY29uc3QgaXNTdHJpbmdNdXRhdGlvbiA9IChtdXRhdGlvbjogU3RhdGVNdXRhdGlvbik6IG11dGF0aW9uIGlzIFNldFN0cmluZ011dGF0aW9uID0+IHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uICYmIG11dGF0aW9uLmtpbmQgPT09IFwic2V0LXN0cmluZ1wiO1xuICAgIH07XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN0YXRlUXVlcnkge1xuICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGNvbmRpdGlvbjogQ29uZGl0aW9uO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU3RhdGVRdWVyeVJlc3VsdCB7XG4gICAgICAgIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBwcmV2OiBib29sZWFuO1xuICAgICAgICByZWFkb25seSBjdXJyOiBib29sZWFuO1xuICAgIH1cblxuICAgIGV4cG9ydCBjb25zdCBudW1lcmljUHJvcFRvRmFjdCA9IChwcm9wOiBOdW1lcmljUHJvcCwgdmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0Lk51bWVyaWMgPSB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtZmFjdFwiLFxuICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2VMYWJlbDogcHJvcC5wcm9wRGVzY3JpcHRpb24gPz8gXCIgW1NUQVRFX1BST1BFUlRZXSA6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbGFiZWw6IFwiIFtWQUxVRV0gOiBcIiArIHZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmFjdDtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGNvbnN0IHN0cmluZ1Byb3BUb0ZhY3QgPSAocHJvcDogU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0OiBGYWN0LlN0cmluZyA9IHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RyaW5nLWZhY3RcIixcbiAgICAgICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGFiZWw6IFwiIFtTVEFURV9QUk9QRVJUWV0gOiBcIiArIHByb3AucHJvcE5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBcIiBbVkFMVUVdIDogXCIgKyB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZhY3Q7XG4gICAgfTtcbn1cbiIsICJpbXBvcnQgeyBGYWN0IH0gZnJvbSBcIi4uL3J1bGVzL2ZhY3RcIjtcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gXCIuLi9jb21tb24vcmVzdWx0XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcnVsZXMvY29uZGl0aW9uXCI7XG5pbXBvcnQgeyBEU3RhdGUgfSBmcm9tIFwiLi9Ec3RhdGVcIjtcbmltcG9ydCB7IERFdmVudERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vZXZlbnRzL2V2ZW50LWJ1c1wiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgUXVlcnlDaGFuZ2VkRXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFRBRyA9IFwiIFsgU1RBVEVfU0VSVklDRSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c1N0cmluZyA9IG5ldyBNYXA8c3RyaW5nLCBGYWN0LlN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYWN0c051bWVyaWMgPSBuZXcgTWFwPHN0cmluZywgRmFjdC5OdW1lcmljPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BEZWZpbml0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEU3RhdGUuUHJvcD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcXVlcnk6IERTdGF0ZS5TdGF0ZVF1ZXJ5OyBsYXN0UmVzdWx0OiBib29sZWFuIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmVDb21tYW5kczogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEJ1czogREV2ZW50RGlzcGF0Y2hlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdXM6IERDb21tYW5kQnVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFJlYWRvbmx5QXJyYXk8RFN0YXRlLlByb3A+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlMaXN0OiBSZWFkb25seUFycmF5PERTdGF0ZS5TdGF0ZVF1ZXJ5PiA9IFtdLFxuICApIHtcbiAgICBwcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUHJvcGVydHkocHJvcCk7XG4gICAgfSk7XG4gICAgY29uc3QgZmFjdHMgPSB0aGlzLmdldEFsbEZhY3RzKCk7XG4gICAgcXVlcnlMaXN0LmZvckVhY2goKGRlZmluaXRpb24pID0+IHtcbiAgICAgIHRoaXMucmVnaXN0ZXJRdWVyeShkZWZpbml0aW9uLCBmYWN0cyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb21tYW5kcyA9IHRoaXMuY29tbWFuZEJ1cy5zdWJzY3JpYmUoKGNvbW1hbmQpID0+IHtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm11dGF0aW9uKGNvbW1hbmQucGF5bG9hZC5tdXRhdGlvbik7XG4gICAgICB9XG4gICAgfSwgdGhpcy5UQUcpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29tbWFuZHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJRdWVyeShxdWVyeTogRFN0YXRlLlN0YXRlUXVlcnksIGN1cnJlbnRGYWN0czogUmVhZG9ubHlBcnJheTxGYWN0Pikge1xuICAgIGNvbnN0IHJlc3VsdCA9IENvbmRpdGlvbi5ldmFsdWF0ZShxdWVyeS5jb25kaXRpb24sIGN1cnJlbnRGYWN0cyk7XG4gICAgdGhpcy5xdWVyaWVzLnNldChxdWVyeS5uYW1lLCB7IHF1ZXJ5OiBxdWVyeSwgbGFzdFJlc3VsdDogcmVzdWx0IH0pO1xuICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiBxdWVyeS5uYW1lLCBwcmV2OiByZXN1bHQsIGN1cnI6IHJlc3VsdCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJQcm9wZXJ0eShwcm9wOiBEU3RhdGUuUHJvcCkge1xuICAgIGlmICh0aGlzLnByb3BEZWZpbml0aW9ucy5oYXMocHJvcC5wcm9wTmFtZSkpIHtcbiAgICAgIC8vIExPR0dJTkdcbiAgICAgIGNvbnNvbGUud2FybihcIlByb3AgZXhjaXN0cyBhbHJlYWR5LlwiLCBwcm9wLnByb3BOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5zZXQocHJvcC5wcm9wTmFtZSwgcHJvcCk7XG5cbiAgICBpZiAocHJvcC5pbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wLl90eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLnN0cmluZ1Byb3BUb0ZhY3QocHJvcCwgcHJvcC5pbml0aWFsVmFsdWUpO1xuICAgICAgdGhpcy5mYWN0c1N0cmluZy5zZXQoZmFjdC5yZWZlcmVuY2VJZCwgZmFjdCk7XG4gICAgfVxuICAgIGlmIChwcm9wLl90eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBmYWN0ID0gRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIHByb3AuaW5pdGlhbFZhbHVlKTtcbiAgICAgIHRoaXMuZmFjdHNOdW1lcmljLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZVN0cmluZyhwcm9wOiBEU3RhdGUuU3RyaW5nUHJvcCwgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnIgPSB0aGlzLmZhY3RzU3RyaW5nLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoY3Vycikge1xuICAgICAgY29uc3QgdXBkYXRlZDogRmFjdC5TdHJpbmcgPSB7IC4uLmN1cnIsIHZhbHVlIH07XG4gICAgICB0aGlzLnNldEZhY3QodXBkYXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IEZhY3QuU3RyaW5nID0ge1xuICAgICAgICBraW5kOiBcInN0cmluZy1mYWN0XCIsXG4gICAgICAgIHJlZmVyZW5jZUlkOiBwcm9wLnByb3BOYW1lLFxuICAgICAgICByZWZlcmVuY2VMYWJlbDogXCJsYWJlbCBmb3I6IFwiICsgcHJvcC5wcm9wTmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGxhYmVsOiBcIlZhbHVlOiBcIiArIHZhbHVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2V0RmFjdChjcmVhdGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZU51bWJlcihwcm9wOiBEU3RhdGUuTnVtZXJpY1Byb3AsIG11dGF0aW9uOiBEU3RhdGUuTnVtYmVyTXV0YXRpb25zKSB7XG4gICAgY29uc3QgY3VyciA9IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wLnByb3BOYW1lKTtcbiAgICBpZiAoIWN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdChEU3RhdGUubnVtZXJpY1Byb3BUb0ZhY3QocHJvcCwgbXV0YXRpb24udmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImluY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoRFN0YXRlLm51bWVyaWNQcm9wVG9GYWN0KHByb3AsIG11dGF0aW9uLmlmTm90RXhpc3RUaGVuU2V0VG8pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBtdXRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnIpIHtcbiAgICAgIHN3aXRjaCAobXV0YXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwic2V0LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBtdXRhdGlvbi52YWx1ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlY3JlbWVudC1udW1iZXJcIjpcbiAgICAgICAgICB0aGlzLnNldEZhY3QoeyAuLi5jdXJyLCB2YWx1ZTogY3Vyci52YWx1ZSAtIG11dGF0aW9uLnN0ZXBTaXplIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5jcmVtZW50LW51bWJlclwiOlxuICAgICAgICAgIHRoaXMuc2V0RmFjdCh7IC4uLmN1cnIsIHZhbHVlOiBjdXJyLnZhbHVlICsgbXV0YXRpb24uc3RlcFNpemUgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc3QgY2hlY2s6IG5ldmVyID0gbXV0YXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVF1ZXJpZXMoKTogUmVhZG9ubHlBcnJheTx7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuOyBkaWRDaGFuZ2U6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGZhY3RzID0gdGhpcy5nZXRBbGxGYWN0cygpO1xuICAgIGNvbnN0IGFsbDogQXJyYXk8eyBxdWVyeU5hbWU6IHN0cmluZzsgcHJldjogYm9vbGVhbjsgY3VycjogYm9vbGVhbjsgZGlkQ2hhbmdlOiBib29sZWFuIH0+ID0gW107XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHEpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBxLmxhc3RSZXN1bHQ7XG5cbiAgICAgIGNvbnN0IGN1cnIgPSBDb25kaXRpb24uZXZhbHVhdGUocS5xdWVyeS5jb25kaXRpb24sIGZhY3RzKTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHByZXYgIT09IGN1cnI7XG4gICAgICBxLmxhc3RSZXN1bHQgPSBjdXJyO1xuICAgICAgYWxsLnB1c2goeyBxdWVyeU5hbWU6IHEucXVlcnkubmFtZSwgcHJldiwgY3VyciwgZGlkQ2hhbmdlIH0pO1xuICAgICAgLy8gZGVmLnZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFsbDtcbiAgfVxuXG4gIHByaXZhdGUgbXV0YXRpb24obXV0YXRpb246IERTdGF0ZS5TdGF0ZU11dGF0aW9uKTogeyBzdWNjZXNzOiBib29sZWFuIH0ge1xuICAgIGNvbnN0IHByb3BEZWYgPSB0aGlzLnByb3BEZWZpbml0aW9ucy5nZXQobXV0YXRpb24ucHJvcE5hbWUpO1xuICAgIGlmICghcHJvcERlZikge1xuICAgICAgLy8gVE9ETyBMT0dHSU5HXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcInN0cmluZ1wiICYmIERTdGF0ZS5pc1N0cmluZ011dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVTdHJpbmcocHJvcERlZiwgbXV0YXRpb24udmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wRGVmLl90eXBlID09PSBcIm51bWJlclwiICYmIERTdGF0ZS5pc051bWJlck11dGF0aW9uKG11dGF0aW9uKSkge1xuICAgICAgdGhpcy5tdXRhdGVOdW1iZXIocHJvcERlZiwgbXV0YXRpb24pO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSB0aGlzLmV2YWx1YXRlUXVlcmllcygpO1xuICAgIGNvbnN0IGNoYW5nZWRSZXN1bHQgPSBxdWVyeVJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmRpZENoYW5nZSk7XG4gICAgY2hhbmdlZFJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgIHRoaXMuZW1pdFF1ZXJ5Q2hhbmdlZEV2ZW50KHsgcXVlcnlOYW1lOiByZXMucXVlcnlOYW1lLCBwcmV2OiByZXMucHJldiwgY3VycjogcmVzLmN1cnIgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRRdWVyeUNoYW5nZWRFdmVudChkYXRhOiB7IHF1ZXJ5TmFtZTogc3RyaW5nOyBwcmV2OiBib29sZWFuOyBjdXJyOiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBxdWVyeUNoYW5nZWRFdmVudDogUXVlcnlDaGFuZ2VkRXZlbnQgPSB7XG4gICAgICBraW5kOiBcIlNUQVRFX1FVRVJZX1JFU1VMVF9DSEFOR0VEX0VWRU5UXCIsXG4gICAgICBwcm9kdWNlcjogXCJTVEFURS1TRVJWSUNFXCIsXG4gICAgICBwcm9kdWNlcklkOiBcIlNUQVRFLVNFUlZJQ0VcIixcbiAgICAgIHRpbWVzdGFtcDogRFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIGRhdGEsXG4gICAgfTtcbiAgICBjb25zdCB7IHF1ZXJ5TmFtZSwgY3VyciwgcHJldiB9ID0gcXVlcnlDaGFuZ2VkRXZlbnQuZGF0YTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIlsgUVVFUllfQ0hBTkdFRCBcIiArIHF1ZXJ5TmFtZSArIFwiXSA6IFwiICsgcHJldiArIFwiIC0+IFwiICsgY3Vycik7XG4gICAgdGhpcy5ldmVudEJ1cy5lbWl0KHF1ZXJ5Q2hhbmdlZEV2ZW50KTtcbiAgfVxuXG4gIGdldFByb3BBc0ZhY3QocHJvcE5hbWU6IHN0cmluZyk6IFJlc3VsdDxGYWN0PiB7XG4gICAgY29uc3QgcHJvcERlZiA9IHRoaXMucHJvcERlZmluaXRpb25zLmdldChwcm9wTmFtZSk7XG4gICAgaWYgKCFwcm9wRGVmKSB7XG4gICAgICByZXR1cm4gUmVzdWx0LmZhaWx1cmUoXG4gICAgICAgIFwiTm8gZGVmaW5pdGlvbiBmb3JtIHByb3BlcnR5IG55IG5hbWUgXCIgKyBwcm9wTmFtZSArIFwiIGlzIHJlZ2lzdGVyZWQuIChQYXNzIGluIGNvbnN0cnVjdG9yLilcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mYWN0c1N0cmluZy5nZXQocHJvcE5hbWUpID8/IHRoaXMuZmFjdHNOdW1lcmljLmdldChwcm9wTmFtZSk7XG5cbiAgICByZXR1cm4gdmFsdWUgPyBSZXN1bHQub2sodmFsdWUpIDogUmVzdWx0LmZhaWx1cmUoXCJQcm9wZXJ0eSBcIiArIHByb3BOYW1lICsgXCIgaGFzIG5vIHZhbHVlLlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RmFjdChmYWN0OiBGYWN0KSB7XG4gICAgc3dpdGNoIChmYWN0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJudW1lcmljLWZhY3RcIjpcbiAgICAgICAgdGhpcy5mYWN0c051bWVyaWMuc2V0KGZhY3QucmVmZXJlbmNlSWQsIGZhY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzdHJpbmctZmFjdFwiOlxuICAgICAgICB0aGlzLmZhY3RzU3RyaW5nLnNldChmYWN0LnJlZmVyZW5jZUlkLCBmYWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBjaGVjazogbmV2ZXIgPSBmYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlKCkge1xuICAgIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgYm9vbGVhbj4gPSB7fTtcbiAgICB0aGlzLnByb3BEZWZpbml0aW9ucy5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBtYXliZUZhY3QgPSB0aGlzLmdldEFueUZhY3QoZGVmLnByb3BOYW1lKTtcbiAgICAgIGlmIChtYXliZUZhY3QpIHtcbiAgICAgICAgdmFsdWUgPSBtYXliZUZhY3QudmFsdWU7XG4gICAgICB9XG4gICAgICBwcm9wc1tkZWYucHJvcE5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5xdWVyaWVzLmZvckVhY2goKHF1ZXJ5KSA9PiB7XG4gICAgICBwcm9wc1txdWVyeS5xdWVyeS5uYW1lXSA9IHF1ZXJ5Lmxhc3RSZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgY29uc3QgcHJvcENvdW50ID0gcHJvcE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBwcm9wQXJyYXkgPSBbLi4udGhpcy5wcm9wRGVmaW5pdGlvbnMudmFsdWVzKCldO1xuXG4gICAgcmV0dXJuIHsgcHJvcENvdW50LCBwcm9wTmFtZXMsIHByb3BBcnJheSwgc3RhdGU6IHByb3BzIH07XG4gIH1cblxuICBwcml2YXRlIGdldEFueUZhY3QocHJvcE5hbWU6IHN0cmluZyk6IEZhY3QgfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZmFjdHNTdHJpbmcuZ2V0KHByb3BOYW1lKSA/PyB0aGlzLmZhY3RzTnVtZXJpYy5nZXQocHJvcE5hbWUpID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxGYWN0cygpOiBSZWFkb25seUFycmF5PEZhY3Q+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmFjdHNOdW1lcmljLnZhbHVlcygpLCAuLi50aGlzLmZhY3RzU3RyaW5nLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGNoZWNrIHRoYXQgYWxsIHJlZmVyZW5jZUlkcyB1c2VkIGluIENvbmRpdGlvbiBpcyByZWdpc3RlcmVkIGFzIGEgdmFsaWQgcHJvcGVydHkgaW4gc3RhdGUuXG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICovXG4gIGNhbkJlTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpbXBsZUNvbmRpdGlvbnMgPSBDb25kaXRpb24uZ2V0QWxsU2ltcGxlQ29uZGl0aW9ucyhjb25kaXRpb24pO1xuICAgIGxldCBoYXNBbGwgPSB0cnVlO1xuXG4gICAgY29uc3QgYWxsSWRzID0gc2ltcGxlQ29uZGl0aW9ucy5tYXAoKGMpID0+IGMucmVmZXJlbmNlSWQpO1xuXG4gICAgY29uc3QgbWlzc2luZ0lkczogc3RyaW5nW10gPSBbXTtcbiAgICBhbGxJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmICghdGhpcy5wcm9wRGVmaW5pdGlvbnMuaGFzKGlkKSkge1xuICAgICAgICBoYXNBbGwgPSBmYWxzZTtcbiAgICAgICAgbWlzc2luZ0lkcy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRBRywgbWlzc2luZ0lkcyk7XG5cbiAgICByZXR1cm4gaGFzQWxsO1xuICB9XG4gIGlzTWF0Y2hlZChjb25kaXRpb246IENvbmRpdGlvbikge1xuICAgIHJldHVybiBDb25kaXRpb24uZXZhbHVhdGUoY29uZGl0aW9uLCB0aGlzLmdldEFsbEZhY3RzKCkpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hRHRvIH0gZnJvbSBcIi4uL2R0by9TY2hlbWFEdG9cIjtcbmltcG9ydCB7IERNZWRpYU1hbmFnZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvRE1lZGlhLW1hbmFnZXJcIjtcbmltcG9ydCB7IERDb21tYW5kQnVzIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kQnVzXCI7XG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9ldmVudHMvZXZlbnQtYnVzXCI7XG5pbXBvcnQgeyBEUGxheWVyIH0gZnJvbSBcIi4uL3BsYXllci9kcGxheWVyXCI7XG5pbXBvcnQgeyBBbnN3ZXJlZFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3BsYXllci9oaXN0b3J5LXF1ZVwiO1xuaW1wb3J0IHsgRFRpbWVzdGFtcCB9IGZyb20gXCIuLi9jb21tb24vRFRpbWVzdGFtcFwiO1xuaW1wb3J0IHsgRFBhZ2UgfSBmcm9tIFwiLi9EUGFnZVwiO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2NhbGVcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vc2VydmljZXMvcmVzb3VyY2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IFN0YXRlU2VydmljZSB9IGZyb20gXCIuLi9zdGF0ZS9zdGF0ZS1zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEQ29tbWFuZCwgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5pbXBvcnQgeyBERXZlbnQgfSBmcm9tIFwiLi4vZXZlbnRzL0RFdmVudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVMb2dnZXIge1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGFwcEV2ZW50KGV2ZW50OiBERXZlbnQpOiB2b2lkO1xuICBhcHBDb21tYW5kKGNvbW1hbmQ6IERDb21tYW5kKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFSZXN1bHQge1xuICByZWFkb25seSBldmVudExvZzogUmVhZG9ubHlBcnJheTxERXZlbnQ+O1xuICByZWFkb25seSBjb21tYW5kTG9nOiBSZWFkb25seUFycmF5PERDb21tYW5kPjtcbiAgcmVhZG9ubHkgYW5zd2VyczogUmVhZG9ubHlBcnJheTxhbnk+O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU2NoZW1hRW5naW5lIHtcbiAgb25Db21wbGV0ZShoYW5kbGVyOiAocmVzdWx0OiBTY2hlbWFSZXN1bHQpID0+IHZvaWQpOiB2b2lkO1xuICBvbkNvbW1hbmRPckV2ZW50KGl0ZW06IERFdmVudCB8IERDb21tYW5kKTogdm9pZDtcbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZDtcbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFFbmdpbmUgaW1wbGVtZW50cyBJU2NoZW1hRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBUQUcgPSBcIlsgU0NIRU1BX0VOR0lORSBdIDpcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kQnVzID0gbmV3IERDb21tYW5kQnVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRCdXMgPSBuZXcgRXZlbnRCdXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYU1hbmFnZXI6IERNZWRpYU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IFNjYWxlU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdWlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZWRpYUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlUHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTZXJ2aWNlOiBTdGF0ZVNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRXZlbnRUb1N0YXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgUmVhZG9ubHlBcnJheTxTdGF0ZUNvbW1hbmQ+PigpO1xuICBwcml2YXRlIHBsYXllcjogRFBsYXllcjtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogRFBhZ2UgfCBmYWxzZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdEVsOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hRHRvLFxuICApIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50ID0gaG9zdEVsO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy51aUNvbnRhaW5lcik7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLm1lZGlhQ29udGFpbmVyKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzID0gdGhpcy5zY2hlbWEuc3RhdGVQcm9wcyA/PyBbXTtcbiAgICBjb25zdCBzdGF0ZVF1ZXJpZXMgPSB0aGlzLnNjaGVtYS5zdGF0ZVF1ZXJpZXMgPz8gW107XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UgPSBuZXcgU3RhdGVTZXJ2aWNlKHRoaXMuZXZlbnRCdXMsIHRoaXMuY29tbWFuZEJ1cywgc3RhdGVQcm9wcywgc3RhdGVRdWVyaWVzKTtcbiAgICB0aGlzLnNjYWxlID0gbmV3IFNjYWxlU2VydmljZSh7XG4gICAgICBiYXNlSGVpZ2h0OiBzY2hlbWEuYmFzZUhlaWdodCxcbiAgICAgIGJhc2VXaWR0aDogc2NoZW1hLmJhc2VXaWR0aCxcbiAgICAgIGNvbnRhaW5lcldpZHRoOiB3aWR0aCxcbiAgICAgIGNvbnRhaW5lckhlaWdodDogaGVpZ2h0LFxuICAgIH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5sb2dDb21tYW5kcyA9IHRydWU7XG4gICAgY29uc3QgZ2xvYmFsRXZlbnRIYW5kbGVycyA9IHNjaGVtYS5zdGF0ZUZyb21FdmVudCA/PyBbXTtcblxuICAgIGdsb2JhbEV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxFdmVudFRvU3RhdGVIYW5kbGVycy5zZXQoaC5vbkV2ZW50LCBoLnRoZW5FeGVjdXRlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlcyA9IFNjaGVtYUR0by5nZXRSZXNvdXJjZXModGhpcy5zY2hlbWEpO1xuICAgIHRoaXMucmVzb3VyY2VQcm92aWRlciA9IG5ldyBSZXNvdXJjZVByb3ZpZGVyKHsgdmlkZW9zOiByZXNvdXJjZXMudmlkZW9MaXN0LCBhdWRpbzogcmVzb3VyY2VzLmF1ZGlvTGlzdCB9KTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlciA9IG5ldyBETWVkaWFNYW5hZ2VyKFxuICAgICAgdGhpcy5tZWRpYUNvbnRhaW5lcixcbiAgICAgIHRoaXMuY29tbWFuZEJ1cyxcbiAgICAgIHRoaXMuZXZlbnRCdXMsXG4gICAgICB0aGlzLnJlc291cmNlUHJvdmlkZXIsXG4gICAgICB0aGlzLnNjYWxlLFxuICAgICk7XG4gICAgdGhpcy5wbGF5ZXIgPSBuZXcgRFBsYXllcih0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5zdHlsZVNlbGYoKTtcbiAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgdGhpcy5ob29rVXBMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaG9va1VwTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudEJ1cy5zdWJzY3JpYmUoKGV2KSA9PiB7XG4gICAgICB0aGlzLm9uQ29tbWFuZE9yRXZlbnQoZXYpO1xuICAgICAgY29uc3QgZ2xvYmFsSGFuZGxlcnMgPSB0aGlzLmdsb2JhbEV2ZW50VG9TdGF0ZUhhbmRsZXJzLmdldChldi5raW5kKSA/PyBbXTtcbiAgICAgIGdsb2JhbEhhbmRsZXJzLmZvckVhY2goKHN0YXRlQ29tbWFuZCkgPT4ge1xuICAgICAgICB0aGlzLmNvbW1hbmRCdXMuZW1pdChzdGF0ZUNvbW1hbmQpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5UQUcgKyBcIkhPT0tfVVBfTElTVEVORVJTXCIpO1xuICAgIGNvbnN0IGNvbW1hbmRTdWJzY3JpcHRpb24gPSB0aGlzLmNvbW1hbmRCdXMuc3Vic2NyaWJlKChjb21tYW5kKSA9PiB7XG4gICAgICAvLyBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgLy9cbiAgICAgIC8vIH1cbiAgICAgIHRoaXMub25Db21tYW5kT3JFdmVudChjb21tYW5kKTtcbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiUEFHRV9RVUVfTkVYVF9QQUdFX0NPTU1BTkRcIikge1xuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFwiRU5HSU5FX0xFQVZFX1BBR0VfQ09NTUFORFwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuVEFHICsgXCJTRVFVRU5DRSBTVEFSVEVEIC0tIFRPRE8gRVZFTlQgRk9SIFRISVM/P1wiKTtcbiAgICAgICAgY29uc29sZS5sb2coY29tbWFuZCk7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGNvbW1hbmQucGF5bG9hZC5wYWdlSWQ7XG4gICAgICAgIGNvbnN0IGZhY3RzID0gY29tbWFuZC5wYXlsb2FkLmZhY3RzQ29sbGVjdGVkO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEVGltZXN0YW1wLm5vdygpO1xuICAgICAgICBjb25zdCBhbnM6IEFuc3dlcmVkUXVlc3Rpb25bXSA9IGZhY3RzLm1hcCgoZikgPT4gKHtcbiAgICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgICAgZmFjdDogZixcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnBsYXllci5zYXZlSGlzdG9yeSh7XG4gICAgICAgICAgYW5zd2VyZWRRdWVzdGlvbnM6IGFucyxcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgLy8gY29uc3QgaGlzdG9yeTogUGFnZUhpc3RvcnkgPSB7IHBhZ2U6IHt9LCBhbnN3ZXJlZFF1ZXN0aW9uczogW10gfTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLlRBRyk7XG5cbiAgICB0aGlzLnN1YnMucHVzaChjb21tYW5kU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnN1YnMucHVzaChldmVudFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlU2VsZigpIHtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuc2NhbGUucGFnZUhlaWdodCArIFwicHhcIjtcbiAgICB0aGlzLmhvc3RFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5zY2FsZS5wYWdlV2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNjaGVtYS5iYWNrZ3JvdW5kQ29sb3IgPz8gXCJ3aGl0ZVwiO1xuICAgIHRoaXMuaG9zdEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgLy8gdGhpcy5ob3N0RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29uc3QgbWFrZVN0YXRpYyA9IChkaXY6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIwcHhcIjtcbiAgICAgIGRpdi5zdHlsZS53aWR0aCA9IFwiMHB4XCI7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcInN0YXRpY1wiO1xuICAgIH07XG5cbiAgICBtYWtlU3RhdGljKHRoaXMudWlDb250YWluZXIpO1xuICAgIG1ha2VTdGF0aWModGhpcy5tZWRpYUNvbnRhaW5lcik7XG4gIH1cblxuICBwcml2YXRlIG5leHRQYWdlKCkge1xuICAgIC8vIFRPRE8gU0hPVUxEIFRISVMgQkUgUEFSVCBPRiBUSEUgU0NIRU1BPz8gVEhJUyBJUyBDTEVBTlVQIExPR0lDXG4gICAgLy8gdGhpcy5jb21tYW5kQnVzLmVtaXQoeyBraW5kOiBcIlZJREVPX1BBVVNFX0NPTU1BTkRcIiwgdGFyZ2V0OiBcIlZJREVPXCIsIHRhcmdldElkOiBcIlZJREVPXCIsIHBheWxvYWQ6IHt9IH0pO1xuICAgIC8vIHRoaXMuY29tbWFuZEJ1cy5lbWl0KHsga2luZDogXCJBVURJT19QQVVTRV9DT01NQU5EXCIsIHRhcmdldDogXCJBVURJT1wiLCB0YXJnZXRJZDogXCJBVURJT1wiLCBwYXlsb2FkOiB7fSB9KTtcbiAgICAvLyBjb25zdCBjdXJyUGFnZUlkID0gdGhpcy5jdXJyZW50UGFnZSA/IHRoaXMuY3VycmVudFBhZ2UuaWQgOiBcIk5PX1BBR0VcIjtcbiAgICAvLyBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiTkVYVF9QQUdFIEZST006IFwiICsgY3VyclBhZ2VJZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5UQUcgKyBcIiBORVhUX1BBR0UgU1RBUlRFRCBBVDogXCIgKyBjdXJyUGFnZUlkKTtcbiAgICB0aGlzLm1lZGlhTWFuYWdlci5jbGVhckFsbE1lZGlhKCk7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSB0aGlzLnBsYXllci5nZXROZXh0UGFnZSgpO1xuICAgIC8vIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhzdGF0ZSk7XG4gICAgLy8gVE9ETyBDTEVBTiBVUCBQQUdFIENPTVBPTkVOVFMgdGhpcy5wYWdlLkNsZWFuVXAoKVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudWlDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFuZXh0UGFnZSkge1xuICAgICAgLy8gVE9ETyBGSUdVUkUgT1VUIFdIQVFUIFRPIERPIEFUIEVORCBPRiBURVNUISEgU3RhcnQgb3Zlcj8/XG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHRoaXMuc2NoZW1hKTtcbiAgICAgIGlmICh0aGlzLnNjaGVtYS5wYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbmV3UGFnZSA9IG5ldyBEUGFnZShuZXh0UGFnZSwgdGhpcy5ldmVudEJ1cywgdGhpcy5jb21tYW5kQnVzLCB0aGlzLnNjYWxlKTtcblxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBuZXdQYWdlO1xuICAgIG5ld1BhZ2UuYXBwZW5kWW91cnNlbGYodGhpcy51aUNvbnRhaW5lcik7XG5cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5zZXRQYWdlKG5leHRQYWdlKTtcbiAgICBjb25zdCBzMSA9IHRoaXMuc3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgLy8gY29uc29sZS5sb2coczEpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiTmV4dC1wYWdlOiBcIiArIG5ld1BhZ2UuaWQpO1xuICAgIC8vIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy51aUNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgICB0aGlzLm1lZGlhTWFuYWdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2UuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgIHN1YigpO1xuICAgIH0pO1xuICAgIGNvbnN0IGV2U3RhdHMgPSB0aGlzLmV2ZW50QnVzLmdldFN0YXRzKCk7XG4gICAgY29uc3QgY21kU3RhdHMgPSB0aGlzLmNvbW1hbmRCdXMuZ2V0U3RhdHMoKTtcbiAgICBjb25zb2xlLmFzc2VydChldlN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCIgRXZlbnRidXMgc2hvdWxkIGhhdmUgbm8gc3Vic2NyaWJlcnMgXCIsIGV2U3RhdHMpO1xuICAgIGNvbnNvbGUuYXNzZXJ0KGNtZFN0YXRzLnN1YnNjcmliZXJzQ291bnQgPT09IDAsIHRoaXMuVEFHICsgXCJDb21tYW5kYnVzIHNob3VsZCBoYXZlIG5vIHN1YnNjcmliZXJzXCIsIGNtZFN0YXRzKTtcbiAgfVxuICBvbkNvbXBsZXRlKGhhbmRsZXI6IChyZXN1bHQ6IFNjaGVtYVJlc3VsdCkgPT4gdm9pZCkge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25GYXRhbEVycm9yKGhhbmRsZXI6IChlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGhhbmRsZXIpO1xuICB9XG5cbiAgb25Db21tYW5kT3JFdmVudChfZXZlbnRfb3JfY29tbWFuZDogREV2ZW50IHwgRENvbW1hbmQpIHt9XG5cbiAgc2V0U2NoZW1hKHNjaGVtYTogU2NoZW1hRHRvKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coc2NoZW1hKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERTdGF0ZSB9IGZyb20gXCIuL0RzdGF0ZVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3J1bGVzL2NvbmRpdGlvblwiO1xuaW1wb3J0IHsgU3RhdGVDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRzL0RDb21tYW5kXCI7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuU3RhdGVQcm9wZXJ0eTxQcm9wTmFtZSBleHRlbmRzIHN0cmluZz4ge1xuICAgIHJlYWRvbmx5IHByb3BOYW1lOiBQcm9wTmFtZTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUUlVFID0geyB2YWx1ZTogMSwgbGFiZWw6IFwiVFJVRVwiIH07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRkFMU0UgPSB7IHZhbHVlOiAwLCBsYWJlbDogXCJGQUxTRVwiIH07XG4gICAgcmVhZG9ubHkgcHJvcERlZmluaXRpb246IERTdGF0ZS5OdW1lcmljUHJvcDtcblxuICAgIGdldElzVHJ1ZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBCb29sZWFuU3RhdGVQcm9wZXJ0eS5UUlVFLnZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXFcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0SXNGYWxzZUNvbmRpdGlvbigpOiBDb25kaXRpb24uTnVtZXJpYyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIm51bWVyaWMtY29uZGl0aW9uXCIsXG4gICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy5wcm9wTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxhYmVsOiB0aGlzLnByb3BOYW1lICsgXCJbIEJPT0xFQU4gXVwiLFxuICAgICAgICAgICAgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJlcVwiLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFNldFRydWVDb21tYW5kKCk6IFN0YXRlQ29tbWFuZCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIlNUQVRFX01VVEFURV9DT01NQU5EXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBcIlNUQVRFXCIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHsgcHJvcE5hbWU6IHRoaXMucHJvcE5hbWUsIGtpbmQ6IFwic2V0LW51bWJlclwiLCB2YWx1ZTogMSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTZXRGYWxzZUNvbW1hbmQoKTogU3RhdGVDb21tYW5kIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6IFwiU1RBVEVfTVVUQVRFX0NPTU1BTkRcIixcbiAgICAgICAgICAgIHRhcmdldDogXCJTVEFURVwiLFxuICAgICAgICAgICAgdGFyZ2V0SWQ6IFwiU1RBVEVcIixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogeyBwcm9wTmFtZTogdGhpcy5wcm9wTmFtZSwga2luZDogXCJzZXQtbnVtYmVyXCIsIHZhbHVlOiAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BOYW1lOiBQcm9wTmFtZSwgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsVmFsdWU6IGJvb2xlYW4sIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gaW5pdGlhbFZhbHVlID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IHByb3BEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8gZGVzY3JpcHRpb24gOiBcIk5vIGRlc2NyaXB0aW9uIGdpdmVuXCI7XG4gICAgICAgIHRoaXMucHJvcERlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBwcm9wRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wTmFtZTogcHJvcE5hbWUsXG4gICAgICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWwsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuRkFMU0UudmFsdWUsIHZhbHVlTGFiZWw6IEJvb2xlYW5TdGF0ZVByb3BlcnR5LkZBTFNFLmxhYmVsIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS52YWx1ZSwgdmFsdWVMYWJlbDogQm9vbGVhblN0YXRlUHJvcGVydHkuVFJVRS5sYWJlbCB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF90eXBlOiBcIm51bWJlclwiLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYW4gSURcbmNvbnN0IElEX0xFTkdUSCA9IDMyO1xuXG4vLyBUaGUgbWluaW11bSBsZW5ndGggb2YgYW4gSURcbmNvbnN0IE1JTl9MRU5HVEggPSAxMDtcblxuZXhwb3J0IHR5cGUgSUQ8QiBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgJiB7IF9fSURfXzogQiB9O1xuXG5jb25zdCBpc0lEID0gPGNvbnN0IEIgZXh0ZW5kcyBzdHJpbmc+KGlkTmFtZTogQiwgaWQ/OiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiB7XG4gIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlkLmxlbmd0aCA+PSBNSU5fTEVOR1RIO1xufTtcblxuY29uc3QgY3JlYXRlSURCeU5hbWUgPSA8Y29uc3QgQiBleHRlbmRzIHN0cmluZz4oaWROYW1lOiBCKTogSUQ8Qj4gPT4ge1xuICBjb25zdCBsZXR0ZXJzID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2eXpcIjtcbiAgY29uc3QgYWxsID0gbGV0dGVycyArIGxldHRlcnMudG9VcHBlckNhc2UoKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSURfTEVOR1RIOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gYWxsLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGwubGVuZ3RoKSk7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBJRDxCPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG9iamVjdCB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc3BlY2lmaWMgSUQgdHlwZVxuICogQHBhcmFtIGlkTmFtZVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVHlwZWRJZFNpbmdsZXRvbiA9IDxjb25zdCBCIGV4dGVuZHMgc3RyaW5nPihpZE5hbWU6IEIpID0+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSUQgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKi9cbiAgY29uc3QgY3JlYXRlID0gKCk6IElEPEI+ID0+IGNyZWF0ZUlEQnlOYW1lKGlkTmFtZSk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaWQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIGNvbnN0IGlzID0gKGlkOiBzdHJpbmcpOiBpZCBpcyBJRDxCPiA9PiBpc0lEKGlkTmFtZSwgaWQpO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIGlmIG5vdCBpdCB0aHJvd3MgYW4gZXJyb3JcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZU9yVGhyb3cgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICBpZiAoIWlzKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkOiAke2lkfWApO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBsb3dlcmNhc2UgbmFtZSBvZiB0aGUgaWQgKFNDSEVNQSwgUEFHRSwgZXRjKVxuICAgKi9cbiAgY29uc3QgbmFtZTogQiA9IGlkTmFtZTtcblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IHRoZSBpZCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLCBpZiBub3QgaXQgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBjb25zdCBlbnN1cmUgPSAoaWQ6IHN0cmluZyk6IElEPEI+ID0+IHtcbiAgICByZXR1cm4gaXMoaWQpID8gaWQgOiBjcmVhdGUoKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGNyZWF0ZSwgaXMsIGVuc3VyZSwgdmFsaWRhdGVPclRocm93LCBuYW1lIH0pO1xufTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hSUQgPSBJRDxcIlNDSEVNQVwiPjtcbmV4cG9ydCBjb25zdCBTY2hlbWFJRCA9IGNyZWF0ZVR5cGVkSWRTaW5nbGV0b24oXCJTQ0hFTUFcIik7XG5leHBvcnQgdHlwZSBQYWdlSUQgPSBJRDxcIlBBR0VcIj47XG5leHBvcnQgY29uc3QgUGFnZUlEID0gY3JlYXRlVHlwZWRJZFNpbmdsZXRvbihcIlBBR0VcIik7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDd0NPLElBQVU7QUFBQSxDQUFWLENBQVVBLGVBQVY7QUFDRSxFQUFNQSxXQUFBLGVBQWUsQ0FDMUIsV0FLRztBQUNILFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxZQUFZLE1BQU0sT0FBeUIsQ0FBQyxLQUFLLFNBQVM7QUFDOUQsVUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLEdBQUc7QUFDN0IsWUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUEsTUFDeEI7QUFDQSxhQUFPO0FBQUEsSUFDVCxHQUFHLENBQUMsQ0FBQztBQUNMLFVBQU0sWUFBOEIsTUFBTSxPQUF5QixDQUFDLEtBQUssU0FBUztBQUNoRixVQUFJLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFJLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN4QjtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBRUwsV0FBTyxFQUFFLFdBQVcsV0FBVyxXQUFXLENBQUMsRUFB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QSxvQkFBa0M7QUFDOUIsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxxQkFBbUM7QUFDL0IsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ0wsVUFBVSxFQUFFLFVBQVUsS0FBSyxVQUFVLE1BQU0sY0FBYyxPQUFPLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBaUJKOzs7QUNuRUEsSUFBTSxZQUFZO0FBR2xCLElBQU0sYUFBYTtBQUluQixJQUFNLE9BQU8sQ0FBeUIsUUFBVyxPQUE2QjtBQUM1RSxNQUFJLE9BQU8sT0FBTztBQUFVLFdBQU87QUFDbkMsU0FBTyxHQUFHLFVBQVU7QUFDdEI7QUFFQSxJQUFNLGlCQUFpQixDQUF5QixXQUFxQjtBQUNuRSxRQUFNLFVBQVU7QUFDaEIsUUFBTSxNQUFNLFVBQVUsUUFBUSxZQUFZO0FBQzFDLE1BQUksU0FBUztBQUNiLFdBQVMsSUFBSSxHQUFHLElBQUksV0FBVyxLQUFLO0FBQ2xDLFVBQU0sT0FBTyxJQUFJLE9BQU8sS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDO0FBQzlELGNBQVU7QUFBQSxFQUNaO0FBQ0EsU0FBTztBQUNUO0FBTU8sSUFBTSx5QkFBeUIsQ0FBeUIsV0FBYztBQUkzRSxRQUFNLFNBQVMsTUFBYSxlQUFlLE1BQU07QUFNakQsUUFBTSxLQUFLLENBQUMsT0FBNEIsS0FBSyxRQUFRLEVBQUU7QUFNdkQsUUFBTSxrQkFBa0IsQ0FBQyxPQUFzQjtBQUM3QyxRQUFJLENBQUMsR0FBRyxFQUFFLEdBQUc7QUFDWCxZQUFNLElBQUksTUFBTSxlQUFlLEVBQUUsRUFBRTtBQUFBLElBQ3JDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFLQSxRQUFNLE9BQVU7QUFNaEIsUUFBTSxTQUFTLENBQUMsT0FBc0I7QUFDcEMsV0FBTyxHQUFHLEVBQUUsSUFBSSxLQUFLLE9BQU87QUFBQSxFQUM5QjtBQUVBLFNBQU8sT0FBTyxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsaUJBQWlCLEtBQUssQ0FBQztBQUNwRTtBQUdPLElBQU0sV0FBVyx1QkFBdUIsUUFBUTtBQUVoRCxJQUFNLFNBQVMsdUJBQXVCLE1BQU07IiwKICAibmFtZXMiOiBbIlNjaGVtYUR0byIsICJEVGltZXN0YW1wIiwgIkRVdGlsIiwgImlzTnVtYmVyIiwgIkRDc3MiLCAiRFN0eWxlIiwgIkFuc3dlcmVkUXVlc3Rpb24iLCAiQ29uZGl0aW9uIiwgImNvbmRpdGlvbiIsICJSdWxlIiwgInRhZyIsICJERXZlbnRIYW5kbGVyIiwgImR0byIsICJkdG8iLCAiU2NhbGUiLCAiUmVzdWx0IiwgIkRTdGF0ZSJdCn0K