@genspectrum/dashboard-components 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,7 +26,7 @@ const $f = new Date(Ee);
26
26
  $f.setMonth(Ee.getMonth() - 6);
27
27
  const qf = new Date(Ee);
28
28
  qf.setFullYear(Ee.getFullYear() - 1);
29
- const PG = {
29
+ const P5 = {
30
30
  last2Weeks: {
31
31
  label: "Last 2 weeks",
32
32
  dateFrom: Se(Bf)
@@ -133,7 +133,7 @@ let Ng = class {
133
133
  * Copyright 2021 Google LLC
134
134
  * SPDX-License-Identifier: BSD-3-Clause
135
135
  */
136
- let zg = class extends Event {
136
+ let Tg = class extends Event {
137
137
  constructor(t) {
138
138
  super("context-provider", { bubbles: !0, composed: !0 }), this.context = t;
139
139
  }
@@ -155,7 +155,7 @@ let zg = class extends Event {
155
155
  this.host.addEventListener("context-request", this.onContextRequest), this.host.addEventListener("context-provider", this.onProviderRequest);
156
156
  }
157
157
  hostConnected() {
158
- this.host.dispatchEvent(new zg(this.context));
158
+ this.host.dispatchEvent(new Tg(this.context));
159
159
  }
160
160
  };
161
161
  /**
@@ -224,7 +224,7 @@ function np({ context: n, subscribe: t }) {
224
224
  * SPDX-License-Identifier: BSD-3-Clause
225
225
  */
226
226
  const Jo = globalThis, Qc = Jo.ShadowRoot && (Jo.ShadyCSS === void 0 || Jo.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, ip = Symbol(), du = /* @__PURE__ */ new WeakMap();
227
- let Tg = class {
227
+ let zg = class {
228
228
  constructor(t, e, i) {
229
229
  if (this._$cssResult$ = !0, i !== ip) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
230
230
  this.cssText = t, this.t = e;
@@ -242,7 +242,7 @@ let Tg = class {
242
242
  return this.cssText;
243
243
  }
244
244
  };
245
- const Ta = (n) => new Tg(typeof n == "string" ? n : n + "", void 0, ip), Fg = (n, t) => {
245
+ const za = (n) => new zg(typeof n == "string" ? n : n + "", void 0, ip), Fg = (n, t) => {
246
246
  if (Qc) n.adoptedStyleSheets = t.map((e) => e instanceof CSSStyleSheet ? e : e.styleSheet);
247
247
  else for (const e of t) {
248
248
  const i = document.createElement("style"), r = Jo.litNonce;
@@ -251,7 +251,7 @@ const Ta = (n) => new Tg(typeof n == "string" ? n : n + "", void 0, ip), Fg = (n
251
251
  }, uu = Qc ? (n) => n : (n) => n instanceof CSSStyleSheet ? ((t) => {
252
252
  let e = "";
253
253
  for (const i of t.cssRules) e += i.cssText;
254
- return Ta(e);
254
+ return za(e);
255
255
  })(n) : n;
256
256
  /**
257
257
  * @license
@@ -936,7 +936,7 @@ var rc;
936
936
  // second overwrites first
937
937
  });
938
938
  })(rc || (rc = {}));
939
- const T = at.arrayToEnum([
939
+ const z = at.arrayToEnum([
940
940
  "string",
941
941
  "nan",
942
942
  "number",
@@ -960,23 +960,23 @@ const T = at.arrayToEnum([
960
960
  ]), Dn = (n) => {
961
961
  switch (typeof n) {
962
962
  case "undefined":
963
- return T.undefined;
963
+ return z.undefined;
964
964
  case "string":
965
- return T.string;
965
+ return z.string;
966
966
  case "number":
967
- return isNaN(n) ? T.nan : T.number;
967
+ return isNaN(n) ? z.nan : z.number;
968
968
  case "boolean":
969
- return T.boolean;
969
+ return z.boolean;
970
970
  case "function":
971
- return T.function;
971
+ return z.function;
972
972
  case "bigint":
973
- return T.bigint;
973
+ return z.bigint;
974
974
  case "symbol":
975
- return T.symbol;
975
+ return z.symbol;
976
976
  case "object":
977
- return Array.isArray(n) ? T.array : n === null ? T.null : n.then && typeof n.then == "function" && n.catch && typeof n.catch == "function" ? T.promise : typeof Map < "u" && n instanceof Map ? T.map : typeof Set < "u" && n instanceof Set ? T.set : typeof Date < "u" && n instanceof Date ? T.date : T.object;
977
+ return Array.isArray(n) ? z.array : n === null ? z.null : n.then && typeof n.then == "function" && n.catch && typeof n.catch == "function" ? z.promise : typeof Map < "u" && n instanceof Map ? z.map : typeof Set < "u" && n instanceof Set ? z.set : typeof Date < "u" && n instanceof Date ? z.date : z.object;
978
978
  default:
979
- return T.unknown;
979
+ return z.unknown;
980
980
  }
981
981
  }, L = at.arrayToEnum([
982
982
  "invalid_type",
@@ -1060,7 +1060,7 @@ const Ir = (n, t) => {
1060
1060
  let e;
1061
1061
  switch (n.code) {
1062
1062
  case L.invalid_type:
1063
- n.received === T.undefined ? e = "Required" : e = `Expected ${n.expected}, received ${n.received}`;
1063
+ n.received === z.undefined ? e = "Required" : e = `Expected ${n.expected}, received ${n.received}`;
1064
1064
  break;
1065
1065
  case L.invalid_literal:
1066
1066
  e = `Invalid literal value, expected ${JSON.stringify(n.expected, at.jsonStringifyReplacer)}`;
@@ -1198,7 +1198,7 @@ class At {
1198
1198
  }
1199
1199
  const B = Object.freeze({
1200
1200
  status: "aborted"
1201
- }), br = (n) => ({ status: "dirty", value: n }), ne = (n) => ({ status: "valid", value: n }), sc = (n) => n.status === "aborted", oc = (n) => n.status === "dirty", Ls = (n) => n.status === "valid", Ys = (n) => typeof Promise < "u" && n instanceof Promise;
1201
+ }), br = (n) => ({ status: "dirty", value: n }), ie = (n) => ({ status: "valid", value: n }), sc = (n) => n.status === "aborted", oc = (n) => n.status === "dirty", Ls = (n) => n.status === "valid", Ys = (n) => typeof Promise < "u" && n instanceof Promise;
1202
1202
  function ca(n, t, e, i) {
1203
1203
  if (typeof t == "function" ? n !== t || !i : !t.has(n)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
1204
1204
  return t.get(n);
@@ -1450,11 +1450,11 @@ function X0(n, t) {
1450
1450
  }
1451
1451
  class Fe extends et {
1452
1452
  _parse(t) {
1453
- if (this._def.coerce && (t.data = String(t.data)), this._getType(t) !== T.string) {
1453
+ if (this._def.coerce && (t.data = String(t.data)), this._getType(t) !== z.string) {
1454
1454
  const s = this._getOrReturnCtx(t);
1455
1455
  return N(s, {
1456
1456
  code: L.invalid_type,
1457
- expected: T.string,
1457
+ expected: z.string,
1458
1458
  received: s.parsedType
1459
1459
  }), B;
1460
1460
  }
@@ -1815,11 +1815,11 @@ class ni extends et {
1815
1815
  super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;
1816
1816
  }
1817
1817
  _parse(t) {
1818
- if (this._def.coerce && (t.data = Number(t.data)), this._getType(t) !== T.number) {
1818
+ if (this._def.coerce && (t.data = Number(t.data)), this._getType(t) !== z.number) {
1819
1819
  const s = this._getOrReturnCtx(t);
1820
1820
  return N(s, {
1821
1821
  code: L.invalid_type,
1822
- expected: T.number,
1822
+ expected: z.number,
1823
1823
  received: s.parsedType
1824
1824
  }), B;
1825
1825
  }
@@ -1987,11 +1987,11 @@ class ii extends et {
1987
1987
  super(...arguments), this.min = this.gte, this.max = this.lte;
1988
1988
  }
1989
1989
  _parse(t) {
1990
- if (this._def.coerce && (t.data = BigInt(t.data)), this._getType(t) !== T.bigint) {
1990
+ if (this._def.coerce && (t.data = BigInt(t.data)), this._getType(t) !== z.bigint) {
1991
1991
  const s = this._getOrReturnCtx(t);
1992
1992
  return N(s, {
1993
1993
  code: L.invalid_type,
1994
- expected: T.bigint,
1994
+ expected: z.bigint,
1995
1995
  received: s.parsedType
1996
1996
  }), B;
1997
1997
  }
@@ -2112,15 +2112,15 @@ ii.create = (n) => {
2112
2112
  };
2113
2113
  class Vs extends et {
2114
2114
  _parse(t) {
2115
- if (this._def.coerce && (t.data = !!t.data), this._getType(t) !== T.boolean) {
2115
+ if (this._def.coerce && (t.data = !!t.data), this._getType(t) !== z.boolean) {
2116
2116
  const i = this._getOrReturnCtx(t);
2117
2117
  return N(i, {
2118
2118
  code: L.invalid_type,
2119
- expected: T.boolean,
2119
+ expected: z.boolean,
2120
2120
  received: i.parsedType
2121
2121
  }), B;
2122
2122
  }
2123
- return ne(t.data);
2123
+ return ie(t.data);
2124
2124
  }
2125
2125
  }
2126
2126
  Vs.create = (n) => new Vs({
@@ -2130,11 +2130,11 @@ Vs.create = (n) => new Vs({
2130
2130
  });
2131
2131
  class Oi extends et {
2132
2132
  _parse(t) {
2133
- if (this._def.coerce && (t.data = new Date(t.data)), this._getType(t) !== T.date) {
2133
+ if (this._def.coerce && (t.data = new Date(t.data)), this._getType(t) !== z.date) {
2134
2134
  const s = this._getOrReturnCtx(t);
2135
2135
  return N(s, {
2136
2136
  code: L.invalid_type,
2137
- expected: T.date,
2137
+ expected: z.date,
2138
2138
  received: s.parsedType
2139
2139
  }), B;
2140
2140
  }
@@ -2208,15 +2208,15 @@ Oi.create = (n) => new Oi({
2208
2208
  });
2209
2209
  class da extends et {
2210
2210
  _parse(t) {
2211
- if (this._getType(t) !== T.symbol) {
2211
+ if (this._getType(t) !== z.symbol) {
2212
2212
  const i = this._getOrReturnCtx(t);
2213
2213
  return N(i, {
2214
2214
  code: L.invalid_type,
2215
- expected: T.symbol,
2215
+ expected: z.symbol,
2216
2216
  received: i.parsedType
2217
2217
  }), B;
2218
2218
  }
2219
- return ne(t.data);
2219
+ return ie(t.data);
2220
2220
  }
2221
2221
  }
2222
2222
  da.create = (n) => new da({
@@ -2225,15 +2225,15 @@ da.create = (n) => new da({
2225
2225
  });
2226
2226
  class Is extends et {
2227
2227
  _parse(t) {
2228
- if (this._getType(t) !== T.undefined) {
2228
+ if (this._getType(t) !== z.undefined) {
2229
2229
  const i = this._getOrReturnCtx(t);
2230
2230
  return N(i, {
2231
2231
  code: L.invalid_type,
2232
- expected: T.undefined,
2232
+ expected: z.undefined,
2233
2233
  received: i.parsedType
2234
2234
  }), B;
2235
2235
  }
2236
- return ne(t.data);
2236
+ return ie(t.data);
2237
2237
  }
2238
2238
  }
2239
2239
  Is.create = (n) => new Is({
@@ -2242,15 +2242,15 @@ Is.create = (n) => new Is({
2242
2242
  });
2243
2243
  class Ms extends et {
2244
2244
  _parse(t) {
2245
- if (this._getType(t) !== T.null) {
2245
+ if (this._getType(t) !== z.null) {
2246
2246
  const i = this._getOrReturnCtx(t);
2247
2247
  return N(i, {
2248
2248
  code: L.invalid_type,
2249
- expected: T.null,
2249
+ expected: z.null,
2250
2250
  received: i.parsedType
2251
2251
  }), B;
2252
2252
  }
2253
- return ne(t.data);
2253
+ return ie(t.data);
2254
2254
  }
2255
2255
  }
2256
2256
  Ms.create = (n) => new Ms({
@@ -2262,7 +2262,7 @@ class Mr extends et {
2262
2262
  super(...arguments), this._any = !0;
2263
2263
  }
2264
2264
  _parse(t) {
2265
- return ne(t.data);
2265
+ return ie(t.data);
2266
2266
  }
2267
2267
  }
2268
2268
  Mr.create = (n) => new Mr({
@@ -2274,7 +2274,7 @@ class Ci extends et {
2274
2274
  super(...arguments), this._unknown = !0;
2275
2275
  }
2276
2276
  _parse(t) {
2277
- return ne(t.data);
2277
+ return ie(t.data);
2278
2278
  }
2279
2279
  }
2280
2280
  Ci.create = (n) => new Ci({
@@ -2286,7 +2286,7 @@ class Ln extends et {
2286
2286
  const e = this._getOrReturnCtx(t);
2287
2287
  return N(e, {
2288
2288
  code: L.invalid_type,
2289
- expected: T.never,
2289
+ expected: z.never,
2290
2290
  received: e.parsedType
2291
2291
  }), B;
2292
2292
  }
@@ -2297,15 +2297,15 @@ Ln.create = (n) => new Ln({
2297
2297
  });
2298
2298
  class ua extends et {
2299
2299
  _parse(t) {
2300
- if (this._getType(t) !== T.undefined) {
2300
+ if (this._getType(t) !== z.undefined) {
2301
2301
  const i = this._getOrReturnCtx(t);
2302
2302
  return N(i, {
2303
2303
  code: L.invalid_type,
2304
- expected: T.void,
2304
+ expected: z.void,
2305
2305
  received: i.parsedType
2306
2306
  }), B;
2307
2307
  }
2308
- return ne(t.data);
2308
+ return ie(t.data);
2309
2309
  }
2310
2310
  }
2311
2311
  ua.create = (n) => new ua({
@@ -2315,10 +2315,10 @@ ua.create = (n) => new ua({
2315
2315
  class Pe extends et {
2316
2316
  _parse(t) {
2317
2317
  const { ctx: e, status: i } = this._processInputParams(t), r = this._def;
2318
- if (e.parsedType !== T.array)
2318
+ if (e.parsedType !== z.array)
2319
2319
  return N(e, {
2320
2320
  code: L.invalid_type,
2321
- expected: T.array,
2321
+ expected: z.array,
2322
2322
  received: e.parsedType
2323
2323
  }), B;
2324
2324
  if (r.exactLength !== null) {
@@ -2412,11 +2412,11 @@ class Yt extends et {
2412
2412
  return this._cached = { shape: t, keys: e };
2413
2413
  }
2414
2414
  _parse(t) {
2415
- if (this._getType(t) !== T.object) {
2415
+ if (this._getType(t) !== z.object) {
2416
2416
  const c = this._getOrReturnCtx(t);
2417
2417
  return N(c, {
2418
2418
  code: L.invalid_type,
2419
- expected: T.object,
2419
+ expected: z.object,
2420
2420
  received: c.parsedType
2421
2421
  }), B;
2422
2422
  }
@@ -2761,14 +2761,14 @@ Cs.create = (n, t) => new Cs({
2761
2761
  typeName: E.ZodUnion,
2762
2762
  ...Q(t)
2763
2763
  });
2764
- const xn = (n) => n instanceof Ts ? xn(n.schema) : n instanceof De ? xn(n.innerType()) : n instanceof Fs ? [n.value] : n instanceof ri ? n.options : n instanceof Hs ? at.objectValues(n.enum) : n instanceof Ps ? xn(n._def.innerType) : n instanceof Is ? [void 0] : n instanceof Ms ? [null] : n instanceof en ? [void 0, ...xn(n.unwrap())] : n instanceof si ? [null, ...xn(n.unwrap())] : n instanceof td || n instanceof Os ? xn(n.unwrap()) : n instanceof Ds ? xn(n._def.innerType) : [];
2764
+ const xn = (n) => n instanceof zs ? xn(n.schema) : n instanceof De ? xn(n.innerType()) : n instanceof Fs ? [n.value] : n instanceof ri ? n.options : n instanceof Hs ? at.objectValues(n.enum) : n instanceof Ps ? xn(n._def.innerType) : n instanceof Is ? [void 0] : n instanceof Ms ? [null] : n instanceof en ? [void 0, ...xn(n.unwrap())] : n instanceof si ? [null, ...xn(n.unwrap())] : n instanceof td || n instanceof Os ? xn(n.unwrap()) : n instanceof Ds ? xn(n._def.innerType) : [];
2765
2765
  class Pa extends et {
2766
2766
  _parse(t) {
2767
2767
  const { ctx: e } = this._processInputParams(t);
2768
- if (e.parsedType !== T.object)
2768
+ if (e.parsedType !== z.object)
2769
2769
  return N(e, {
2770
2770
  code: L.invalid_type,
2771
- expected: T.object,
2771
+ expected: z.object,
2772
2772
  received: e.parsedType
2773
2773
  }), B;
2774
2774
  const i = this.discriminator, r = e.data[i], s = this.optionsMap.get(r);
@@ -2828,7 +2828,7 @@ function ac(n, t) {
2828
2828
  const e = Dn(n), i = Dn(t);
2829
2829
  if (n === t)
2830
2830
  return { valid: !0, data: n };
2831
- if (e === T.object && i === T.object) {
2831
+ if (e === z.object && i === z.object) {
2832
2832
  const r = at.objectKeys(t), s = at.objectKeys(n).filter((a) => r.indexOf(a) !== -1), o = { ...n, ...t };
2833
2833
  for (const a of s) {
2834
2834
  const l = ac(n[a], t[a]);
@@ -2837,7 +2837,7 @@ function ac(n, t) {
2837
2837
  o[a] = l.data;
2838
2838
  }
2839
2839
  return { valid: !0, data: o };
2840
- } else if (e === T.array && i === T.array) {
2840
+ } else if (e === z.array && i === z.array) {
2841
2841
  if (n.length !== t.length)
2842
2842
  return { valid: !1 };
2843
2843
  const r = [];
@@ -2848,7 +2848,7 @@ function ac(n, t) {
2848
2848
  r.push(l.data);
2849
2849
  }
2850
2850
  return { valid: !0, data: r };
2851
- } else return e === T.date && i === T.date && +n == +t ? { valid: !0, data: n } : { valid: !1 };
2851
+ } else return e === z.date && i === z.date && +n == +t ? { valid: !0, data: n } : { valid: !1 };
2852
2852
  }
2853
2853
  class Ns extends et {
2854
2854
  _parse(t) {
@@ -2891,10 +2891,10 @@ Ns.create = (n, t, e) => new Ns({
2891
2891
  class ln extends et {
2892
2892
  _parse(t) {
2893
2893
  const { status: e, ctx: i } = this._processInputParams(t);
2894
- if (i.parsedType !== T.array)
2894
+ if (i.parsedType !== z.array)
2895
2895
  return N(i, {
2896
2896
  code: L.invalid_type,
2897
- expected: T.array,
2897
+ expected: z.array,
2898
2898
  received: i.parsedType
2899
2899
  }), B;
2900
2900
  if (i.data.length < this._def.items.length)
@@ -2938,7 +2938,7 @@ ln.create = (n, t) => {
2938
2938
  ...Q(t)
2939
2939
  });
2940
2940
  };
2941
- class zs extends et {
2941
+ class Ts extends et {
2942
2942
  get keySchema() {
2943
2943
  return this._def.keyType;
2944
2944
  }
@@ -2947,10 +2947,10 @@ class zs extends et {
2947
2947
  }
2948
2948
  _parse(t) {
2949
2949
  const { status: e, ctx: i } = this._processInputParams(t);
2950
- if (i.parsedType !== T.object)
2950
+ if (i.parsedType !== z.object)
2951
2951
  return N(i, {
2952
2952
  code: L.invalid_type,
2953
- expected: T.object,
2953
+ expected: z.object,
2954
2954
  received: i.parsedType
2955
2955
  }), B;
2956
2956
  const r = [], s = this._def.keyType, o = this._def.valueType;
@@ -2966,12 +2966,12 @@ class zs extends et {
2966
2966
  return this._def.valueType;
2967
2967
  }
2968
2968
  static create(t, e, i) {
2969
- return e instanceof et ? new zs({
2969
+ return e instanceof et ? new Ts({
2970
2970
  keyType: t,
2971
2971
  valueType: e,
2972
2972
  typeName: E.ZodRecord,
2973
2973
  ...Q(i)
2974
- }) : new zs({
2974
+ }) : new Ts({
2975
2975
  keyType: Fe.create(),
2976
2976
  valueType: t,
2977
2977
  typeName: E.ZodRecord,
@@ -2988,10 +2988,10 @@ class ha extends et {
2988
2988
  }
2989
2989
  _parse(t) {
2990
2990
  const { status: e, ctx: i } = this._processInputParams(t);
2991
- if (i.parsedType !== T.map)
2991
+ if (i.parsedType !== z.map)
2992
2992
  return N(i, {
2993
2993
  code: L.invalid_type,
2994
- expected: T.map,
2994
+ expected: z.map,
2995
2995
  received: i.parsedType
2996
2996
  }), B;
2997
2997
  const r = this._def.keyType, s = this._def.valueType, o = [...i.data.entries()].map(([a, l], c) => ({
@@ -3030,10 +3030,10 @@ ha.create = (n, t, e) => new ha({
3030
3030
  class Ki extends et {
3031
3031
  _parse(t) {
3032
3032
  const { status: e, ctx: i } = this._processInputParams(t);
3033
- if (i.parsedType !== T.set)
3033
+ if (i.parsedType !== z.set)
3034
3034
  return N(i, {
3035
3035
  code: L.invalid_type,
3036
- expected: T.set,
3036
+ expected: z.set,
3037
3037
  received: i.parsedType
3038
3038
  }), B;
3039
3039
  const r = this._def;
@@ -3097,10 +3097,10 @@ class kr extends et {
3097
3097
  }
3098
3098
  _parse(t) {
3099
3099
  const { ctx: e } = this._processInputParams(t);
3100
- if (e.parsedType !== T.function)
3100
+ if (e.parsedType !== z.function)
3101
3101
  return N(e, {
3102
3102
  code: L.invalid_type,
3103
- expected: T.function,
3103
+ expected: z.function,
3104
3104
  received: e.parsedType
3105
3105
  }), B;
3106
3106
  function i(a, l) {
@@ -3138,7 +3138,7 @@ class kr extends et {
3138
3138
  const s = { errorMap: e.common.contextualErrorMap }, o = e.data;
3139
3139
  if (this._def.returns instanceof Cr) {
3140
3140
  const a = this;
3141
- return ne(async function(...l) {
3141
+ return ie(async function(...l) {
3142
3142
  const c = new ve([]), d = await a._def.args.parseAsync(l, s).catch((f) => {
3143
3143
  throw c.addIssue(i(l, f)), c;
3144
3144
  }), u = await Reflect.apply(o, this, d);
@@ -3148,7 +3148,7 @@ class kr extends et {
3148
3148
  });
3149
3149
  } else {
3150
3150
  const a = this;
3151
- return ne(function(...l) {
3151
+ return ie(function(...l) {
3152
3152
  const c = a._def.args.safeParse(l, s);
3153
3153
  if (!c.success)
3154
3154
  throw new ve([i(l, c.error)]);
@@ -3192,7 +3192,7 @@ class kr extends et {
3192
3192
  });
3193
3193
  }
3194
3194
  }
3195
- class Ts extends et {
3195
+ class zs extends et {
3196
3196
  get schema() {
3197
3197
  return this._def.getter();
3198
3198
  }
@@ -3201,7 +3201,7 @@ class Ts extends et {
3201
3201
  return this._def.getter()._parse({ data: e.data, path: e.path, parent: e });
3202
3202
  }
3203
3203
  }
3204
- Ts.create = (n, t) => new Ts({
3204
+ zs.create = (n, t) => new zs({
3205
3205
  getter: n,
3206
3206
  typeName: E.ZodLazy,
3207
3207
  ...Q(t)
@@ -3255,7 +3255,7 @@ class ri extends et {
3255
3255
  options: i
3256
3256
  }), B;
3257
3257
  }
3258
- return ne(t.data);
3258
+ return ie(t.data);
3259
3259
  }
3260
3260
  get options() {
3261
3261
  return this._def.values;
@@ -3299,7 +3299,7 @@ class Hs extends et {
3299
3299
  }
3300
3300
  _parse(t) {
3301
3301
  const e = at.getValidEnumValues(this._def.values), i = this._getOrReturnCtx(t);
3302
- if (i.parsedType !== T.string && i.parsedType !== T.number) {
3302
+ if (i.parsedType !== z.string && i.parsedType !== z.number) {
3303
3303
  const r = at.objectValues(e);
3304
3304
  return N(i, {
3305
3305
  expected: at.joinValues(r),
@@ -3315,7 +3315,7 @@ class Hs extends et {
3315
3315
  options: r
3316
3316
  }), B;
3317
3317
  }
3318
- return ne(t.data);
3318
+ return ie(t.data);
3319
3319
  }
3320
3320
  get enum() {
3321
3321
  return this._def.values;
@@ -3333,14 +3333,14 @@ class Cr extends et {
3333
3333
  }
3334
3334
  _parse(t) {
3335
3335
  const { ctx: e } = this._processInputParams(t);
3336
- if (e.parsedType !== T.promise && e.common.async === !1)
3336
+ if (e.parsedType !== z.promise && e.common.async === !1)
3337
3337
  return N(e, {
3338
3338
  code: L.invalid_type,
3339
- expected: T.promise,
3339
+ expected: z.promise,
3340
3340
  received: e.parsedType
3341
3341
  }), B;
3342
- const i = e.parsedType === T.promise ? e.data : Promise.resolve(e.data);
3343
- return ne(i.then((r) => this._def.type.parseAsync(r, {
3342
+ const i = e.parsedType === z.promise ? e.data : Promise.resolve(e.data);
3343
+ return ie(i.then((r) => this._def.type.parseAsync(r, {
3344
3344
  path: e.path,
3345
3345
  errorMap: e.common.contextualErrorMap
3346
3346
  })));
@@ -3442,7 +3442,7 @@ De.createWithPreprocess = (n, t, e) => new De({
3442
3442
  });
3443
3443
  class en extends et {
3444
3444
  _parse(t) {
3445
- return this._getType(t) === T.undefined ? ne(void 0) : this._def.innerType._parse(t);
3445
+ return this._getType(t) === z.undefined ? ie(void 0) : this._def.innerType._parse(t);
3446
3446
  }
3447
3447
  unwrap() {
3448
3448
  return this._def.innerType;
@@ -3455,7 +3455,7 @@ en.create = (n, t) => new en({
3455
3455
  });
3456
3456
  class si extends et {
3457
3457
  _parse(t) {
3458
- return this._getType(t) === T.null ? ne(null) : this._def.innerType._parse(t);
3458
+ return this._getType(t) === z.null ? ie(null) : this._def.innerType._parse(t);
3459
3459
  }
3460
3460
  unwrap() {
3461
3461
  return this._def.innerType;
@@ -3470,7 +3470,7 @@ class Ps extends et {
3470
3470
  _parse(t) {
3471
3471
  const { ctx: e } = this._processInputParams(t);
3472
3472
  let i = e.data;
3473
- return e.parsedType === T.undefined && (i = this._def.defaultValue()), this._def.innerType._parse({
3473
+ return e.parsedType === z.undefined && (i = this._def.defaultValue()), this._def.innerType._parse({
3474
3474
  data: i,
3475
3475
  path: e.path,
3476
3476
  parent: e
@@ -3531,11 +3531,11 @@ Ds.create = (n, t) => new Ds({
3531
3531
  });
3532
3532
  class fa extends et {
3533
3533
  _parse(t) {
3534
- if (this._getType(t) !== T.nan) {
3534
+ if (this._getType(t) !== z.nan) {
3535
3535
  const i = this._getOrReturnCtx(t);
3536
3536
  return N(i, {
3537
3537
  code: L.invalid_type,
3538
- expected: T.nan,
3538
+ expected: z.nan,
3539
3539
  received: i.parsedType
3540
3540
  }), B;
3541
3541
  }
@@ -3632,7 +3632,7 @@ var E;
3632
3632
  })(E || (E = {}));
3633
3633
  const G0 = (n, t = {
3634
3634
  message: `Input not instance of ${n.name}`
3635
- }) => yp((e) => e instanceof n, t), vp = Fe.create, xp = ni.create, R0 = fa.create, L0 = ii.create, Zp = Vs.create, Y0 = Oi.create, V0 = da.create, I0 = Is.create, M0 = Ms.create, C0 = Mr.create, N0 = Ci.create, z0 = Ln.create, T0 = ua.create, F0 = Pe.create, H0 = Yt.create, P0 = Yt.strictCreate, D0 = Cs.create, O0 = Pa.create, K0 = Ns.create, j0 = ln.create, J0 = zs.create, E0 = ha.create, B0 = Ki.create, U0 = kr.create, A0 = Ts.create, Q0 = Fs.create, $0 = ri.create, q0 = Hs.create, ty = Cr.create, wu = De.create, ey = en.create, ny = si.create, iy = De.createWithPreprocess, ry = oo.create, sy = () => vp().optional(), oy = () => xp().optional(), ay = () => Zp().optional(), ly = {
3635
+ }) => yp((e) => e instanceof n, t), vp = Fe.create, xp = ni.create, R0 = fa.create, L0 = ii.create, Zp = Vs.create, Y0 = Oi.create, V0 = da.create, I0 = Is.create, M0 = Ms.create, C0 = Mr.create, N0 = Ci.create, T0 = Ln.create, z0 = ua.create, F0 = Pe.create, H0 = Yt.create, P0 = Yt.strictCreate, D0 = Cs.create, O0 = Pa.create, K0 = Ns.create, j0 = ln.create, J0 = Ts.create, E0 = ha.create, B0 = Ki.create, U0 = kr.create, A0 = zs.create, Q0 = Fs.create, $0 = ri.create, q0 = Hs.create, ty = Cr.create, wu = De.create, ey = en.create, ny = si.create, iy = De.createWithPreprocess, ry = oo.create, sy = () => vp().optional(), oy = () => xp().optional(), ay = () => Zp().optional(), ly = {
3636
3636
  string: (n) => Fe.create({ ...n, coerce: !0 }),
3637
3637
  number: (n) => ni.create({ ...n, coerce: !0 }),
3638
3638
  boolean: (n) => Vs.create({
@@ -3653,7 +3653,7 @@ var D = /* @__PURE__ */ Object.freeze({
3653
3653
  ParseStatus: At,
3654
3654
  INVALID: B,
3655
3655
  DIRTY: br,
3656
- OK: ne,
3656
+ OK: ie,
3657
3657
  isAborted: sc,
3658
3658
  isDirty: oc,
3659
3659
  isValid: Ls,
@@ -3664,7 +3664,7 @@ var D = /* @__PURE__ */ Object.freeze({
3664
3664
  get objectUtil() {
3665
3665
  return rc;
3666
3666
  },
3667
- ZodParsedType: T,
3667
+ ZodParsedType: z,
3668
3668
  getParsedType: Dn,
3669
3669
  ZodType: et,
3670
3670
  datetimeRegex: bp,
@@ -3686,11 +3686,11 @@ var D = /* @__PURE__ */ Object.freeze({
3686
3686
  ZodDiscriminatedUnion: Pa,
3687
3687
  ZodIntersection: Ns,
3688
3688
  ZodTuple: ln,
3689
- ZodRecord: zs,
3689
+ ZodRecord: Ts,
3690
3690
  ZodMap: ha,
3691
3691
  ZodSet: Ki,
3692
3692
  ZodFunction: kr,
3693
- ZodLazy: Ts,
3693
+ ZodLazy: zs,
3694
3694
  ZodLiteral: Fs,
3695
3695
  ZodEnum: ri,
3696
3696
  ZodNativeEnum: Hs,
@@ -3730,7 +3730,7 @@ var D = /* @__PURE__ */ Object.freeze({
3730
3730
  map: E0,
3731
3731
  nan: R0,
3732
3732
  nativeEnum: q0,
3733
- never: z0,
3733
+ never: T0,
3734
3734
  null: M0,
3735
3735
  nullable: ny,
3736
3736
  number: xp,
@@ -3752,7 +3752,7 @@ var D = /* @__PURE__ */ Object.freeze({
3752
3752
  undefined: I0,
3753
3753
  union: D0,
3754
3754
  unknown: N0,
3755
- void: T0,
3755
+ void: z0,
3756
3756
  NEVER: cy,
3757
3757
  ZodIssueCode: L,
3758
3758
  quotelessJson: l0,
@@ -4081,7 +4081,7 @@ function sd(n, t, e, i, r, s, o, a, l, c) {
4081
4081
  if (t.constructor !== void 0) return null;
4082
4082
  128 & e.__u && (l = !!(32 & e.__u), s = [a = t.__e = e.__e]), (d = vt.__b) && d(t);
4083
4083
  t: if (typeof Y == "function") try {
4084
- if (y = t.props, x = "prototype" in Y && Y.prototype.render, w = (d = Y.contextType) && i[d.__c], k = d ? w ? w.props.value : d.__ : i, e.__c ? g = (u = t.__c = e.__c).__ = u.__E : (x ? t.__c = u = new Y(y, k) : (t.__c = u = new Bo(y, k), u.constructor = Y, u.render = Ty), w && w.sub(u), u.props = y, u.state || (u.state = {}), u.context = k, u.__n = i, h = u.__d = !0, u.__h = [], u._sb = []), x && u.__s == null && (u.__s = u.state), x && Y.getDerivedStateFromProps != null && (u.__s == u.state && (u.__s = On({}, u.__s)), On(u.__s, Y.getDerivedStateFromProps(y, u.__s))), f = u.props, p = u.state, u.__v = t, h) x && Y.getDerivedStateFromProps == null && u.componentWillMount != null && u.componentWillMount(), x && u.componentDidMount != null && u.__h.push(u.componentDidMount);
4084
+ if (y = t.props, x = "prototype" in Y && Y.prototype.render, w = (d = Y.contextType) && i[d.__c], k = d ? w ? w.props.value : d.__ : i, e.__c ? g = (u = t.__c = e.__c).__ = u.__E : (x ? t.__c = u = new Y(y, k) : (t.__c = u = new Bo(y, k), u.constructor = Y, u.render = zy), w && w.sub(u), u.props = y, u.state || (u.state = {}), u.context = k, u.__n = i, h = u.__d = !0, u.__h = [], u._sb = []), x && u.__s == null && (u.__s = u.state), x && Y.getDerivedStateFromProps != null && (u.__s == u.state && (u.__s = On({}, u.__s)), On(u.__s, Y.getDerivedStateFromProps(y, u.__s))), f = u.props, p = u.state, u.__v = t, h) x && Y.getDerivedStateFromProps == null && u.componentWillMount != null && u.componentWillMount(), x && u.componentDidMount != null && u.__h.push(u.componentDidMount);
4085
4085
  else {
4086
4086
  if (x && Y.getDerivedStateFromProps == null && y !== f && u.componentWillReceiveProps != null && u.componentWillReceiveProps(y, k), !u.__e && (u.shouldComponentUpdate != null && u.shouldComponentUpdate(y, u.__s, k) === !1 || t.__v === e.__v)) {
4087
4087
  for (t.__v !== e.__v && (u.props = y, u.state = u.__s, u.__d = !1), t.__e = e.__e, t.__k = e.__k, t.__k.some(function(K) {
@@ -4108,7 +4108,7 @@ function sd(n, t, e, i, r, s, o, a, l, c) {
4108
4108
  } else t.__e = e.__e, t.__k = e.__k;
4109
4109
  vt.__e(K, t, e);
4110
4110
  }
4111
- else s == null && t.__v === e.__v ? (t.__k = e.__k, t.__e = e.__e) : t.__e = zy(e.__e, t, e, i, r, s, o, l, c);
4111
+ else s == null && t.__v === e.__v ? (t.__k = e.__k, t.__e = e.__e) : t.__e = Ty(e.__e, t, e, i, r, s, o, l, c);
4112
4112
  (d = vt.diffed) && d(t);
4113
4113
  }
4114
4114
  function Vp(n, t, e) {
@@ -4124,7 +4124,7 @@ function Vp(n, t, e) {
4124
4124
  }
4125
4125
  });
4126
4126
  }
4127
- function zy(n, t, e, i, r, s, o, a, l) {
4127
+ function Ty(n, t, e, i, r, s, o, a, l) {
4128
4128
  var c, d, u, h, f, p, b, g = e.props, y = t.props, x = t.type;
4129
4129
  if (x === "svg" ? r = "http://www.w3.org/2000/svg" : x === "math" ? r = "http://www.w3.org/1998/Math/MathML" : r || (r = "http://www.w3.org/1999/xhtml"), s != null) {
4130
4130
  for (c = 0; c < s.length; c++) if ((f = s[c]) && "setAttribute" in f == !!x && (x ? f.localName === x : f.nodeType === 3)) {
@@ -4176,7 +4176,7 @@ function Ip(n, t, e) {
4176
4176
  if (i = n.__k) for (r = 0; r < i.length; r++) i[r] && Ip(i[r], t, e || typeof n.type != "function");
4177
4177
  e || Gp(n.__e), n.__c = n.__ = n.__e = n.__d = void 0;
4178
4178
  }
4179
- function Ty(n, t, e) {
4179
+ function zy(n, t, e) {
4180
4180
  return this.constructor(n, e);
4181
4181
  }
4182
4182
  function Fy(n, t, e) {
@@ -4237,11 +4237,11 @@ function ao(n, t) {
4237
4237
  return n >= e.__.length && e.__.push({}), e.__[n];
4238
4238
  }
4239
4239
  function it(n) {
4240
- return ga = 1, Py(zp, n);
4240
+ return ga = 1, Py(Tp, n);
4241
4241
  }
4242
4242
  function Py(n, t, e) {
4243
4243
  var i = ao(ji++, 2);
4244
- if (i.t = n, !i.__c && (i.__ = [zp(void 0, t), function(a) {
4244
+ if (i.t = n, !i.__c && (i.__ = [Tp(void 0, t), function(a) {
4245
4245
  var l = i.__N ? i.__N[0] : i.__[0], c = i.t(l, a);
4246
4246
  l !== c && (i.__N = [c, i.__[1]], i.__c.setState({}));
4247
4247
  }], i.__c = wt, !wt.u)) {
@@ -4273,7 +4273,7 @@ function Py(n, t, e) {
4273
4273
  }
4274
4274
  return i.__N || i.__;
4275
4275
  }
4276
- function ie(n, t) {
4276
+ function Qt(n, t) {
4277
4277
  var e = ao(ji++, 3);
4278
4278
  !Ft.__s && Np(e.__H, t) && (e.__ = n, e.i = t, wt.__H.__h.push(e));
4279
4279
  }
@@ -4364,10 +4364,10 @@ function Np(n, t) {
4364
4364
  return e !== n[i];
4365
4365
  });
4366
4366
  }
4367
- function zp(n, t) {
4367
+ function Tp(n, t) {
4368
4368
  return typeof t == "function" ? t(n) : t;
4369
4369
  }
4370
- function Tp(n, t) {
4370
+ function zp(n, t) {
4371
4371
  const e = /* @__PURE__ */ new Map();
4372
4372
  for (const i of n.content)
4373
4373
  for (const r of i.data) {
@@ -4419,7 +4419,7 @@ function Ey(n, t) {
4419
4419
  }
4420
4420
  var r;
4421
4421
  }
4422
- function $t(n, t, e) {
4422
+ function qt(n, t, e) {
4423
4423
  return t && Ey(n.prototype, t), Object.defineProperty(n, "prototype", { writable: !1 }), n;
4424
4424
  }
4425
4425
  function ct() {
@@ -4448,7 +4448,7 @@ function Cu(n, t) {
4448
4448
  for (var e = 0, i = new Array(t); e < t; e++) i[e] = n[e];
4449
4449
  return i;
4450
4450
  }
4451
- function te(n, t) {
4451
+ function ee(n, t) {
4452
4452
  var e = typeof Symbol < "u" && n[Symbol.iterator] || n["@@iterator"];
4453
4453
  if (e) return (e = e.call(n)).next.bind(e);
4454
4454
  if (Array.isArray(n) || (e = function(r, s) {
@@ -4552,17 +4552,17 @@ function Ep(n, t, e, i, r, s) {
4552
4552
  }
4553
4553
  return o !== void 0 ? o : r.nextSibling;
4554
4554
  }
4555
- function zu(n, t, e) {
4555
+ function Tu(n, t, e) {
4556
4556
  t[0] === "-" ? n.setProperty(t, e) : n[t] = e == null ? "" : typeof e != "number" || By.test(t) ? e : e + "px";
4557
4557
  }
4558
4558
  function _o(n, t, e, i, r) {
4559
4559
  var s;
4560
4560
  t: if (t === "style") if (typeof e == "string") n.style.cssText = e;
4561
4561
  else {
4562
- if (typeof i == "string" && (n.style.cssText = i = ""), i) for (t in i) e && t in e || zu(n.style, t, "");
4563
- if (e) for (t in e) i && e[t] === i[t] || zu(n.style, t, e[t]);
4562
+ if (typeof i == "string" && (n.style.cssText = i = ""), i) for (t in i) e && t in e || Tu(n.style, t, "");
4563
+ if (e) for (t in e) i && e[t] === i[t] || Tu(n.style, t, e[t]);
4564
4564
  }
4565
- else if (t[0] === "o" && t[1] === "n") s = t !== (t = t.replace(/Capture$/, "")), t = t.toLowerCase() in n ? t.toLowerCase().slice(2) : t.slice(2), n.l || (n.l = {}), n.l[t + s] = e, e ? i || n.addEventListener(t, s ? Fu : Tu, s) : n.removeEventListener(t, s ? Fu : Tu, s);
4565
+ else if (t[0] === "o" && t[1] === "n") s = t !== (t = t.replace(/Capture$/, "")), t = t.toLowerCase() in n ? t.toLowerCase().slice(2) : t.slice(2), n.l || (n.l = {}), n.l[t + s] = e, e ? i || n.addEventListener(t, s ? Fu : zu, s) : n.removeEventListener(t, s ? Fu : zu, s);
4566
4566
  else if (t !== "dangerouslySetInnerHTML") {
4567
4567
  if (r) t = t.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
4568
4568
  else if (t !== "href" && t !== "list" && t !== "form" && t !== "tabIndex" && t !== "download" && t in n) try {
@@ -4573,7 +4573,7 @@ function _o(n, t, e, i, r) {
4573
4573
  typeof e == "function" || (e == null || e === !1 && t.indexOf("-") == -1 ? n.removeAttribute(t) : n.setAttribute(t, e));
4574
4574
  }
4575
4575
  }
4576
- function Tu(n) {
4576
+ function zu(n) {
4577
4577
  this.l[n.type + !1](tt.event ? tt.event(n) : n);
4578
4578
  }
4579
4579
  function Fu(n) {
@@ -4702,7 +4702,7 @@ var ja = /* @__PURE__ */ function() {
4702
4702
  function n(t) {
4703
4703
  this._id = void 0, this._id = t || Qp();
4704
4704
  }
4705
- return $t(n, [{ key: "id", get: function() {
4705
+ return qt(n, [{ key: "id", get: function() {
4706
4706
  return this._id;
4707
4707
  } }]), n;
4708
4708
  }();
@@ -4741,7 +4741,7 @@ var Ut, ld = /* @__PURE__ */ function(n) {
4741
4741
  return new t(i.map(function(r) {
4742
4742
  return new ld(r.data);
4743
4743
  }));
4744
- }, $t(t, [{ key: "cells", get: function() {
4744
+ }, qt(t, [{ key: "cells", get: function() {
4745
4745
  return this._cells;
4746
4746
  }, set: function(i) {
4747
4747
  this._cells = i;
@@ -4769,7 +4769,7 @@ var Ut, ld = /* @__PURE__ */ function(n) {
4769
4769
  return new ld(r);
4770
4770
  }));
4771
4771
  }));
4772
- }, $t(t, [{ key: "rows", get: function() {
4772
+ }, qt(t, [{ key: "rows", get: function() {
4773
4773
  return this._rows;
4774
4774
  }, set: function(e) {
4775
4775
  this._rows = e;
@@ -4837,7 +4837,7 @@ var fn = /* @__PURE__ */ function(n) {
4837
4837
  }, e.setProps = function(i) {
4838
4838
  var r = ct({}, this._props, i);
4839
4839
  return $o(r, this._props) || (this._props = r, this.emit("propsUpdated", this)), this;
4840
- }, $t(t, [{ key: "props", get: function() {
4840
+ }, qt(t, [{ key: "props", get: function() {
4841
4841
  return this._props;
4842
4842
  } }]), t;
4843
4843
  }(cd), $y = /* @__PURE__ */ function(n) {
@@ -4858,7 +4858,7 @@ var fn = /* @__PURE__ */ function(n) {
4858
4858
  });
4859
4859
  }))) : e;
4860
4860
  var i, r, s, o, a;
4861
- }, $t(t, [{ key: "type", get: function() {
4861
+ }, qt(t, [{ key: "type", get: function() {
4862
4862
  return Ut.Filter;
4863
4863
  } }]), t;
4864
4864
  }(fn);
@@ -4877,7 +4877,7 @@ function Zt() {
4877
4877
  return (n || "") + " " + t;
4878
4878
  }, "").trim();
4879
4879
  }
4880
- var lo, zt, Ll, Hu, Pu = /* @__PURE__ */ function(n) {
4880
+ var lo, Tt, Ll, Hu, Pu = /* @__PURE__ */ function(n) {
4881
4881
  function t() {
4882
4882
  return n.apply(this, arguments) || this;
4883
4883
  }
@@ -4885,13 +4885,13 @@ var lo, zt, Ll, Hu, Pu = /* @__PURE__ */ function(n) {
4885
4885
  if (!this.props.keyword) return e;
4886
4886
  var i = {};
4887
4887
  return this.props.url && (i.url = this.props.url(e.url, this.props.keyword)), this.props.body && (i.body = this.props.body(e.body, this.props.keyword)), ct({}, e, i);
4888
- }, $t(t, [{ key: "type", get: function() {
4888
+ }, qt(t, [{ key: "type", get: function() {
4889
4889
  return Ut.ServerFilter;
4890
4890
  } }]), t;
4891
4891
  }(fn), Js = 0, qp = [], qo = [], Du = tt.__b, Ou = tt.__r, Ku = tt.diffed, ju = tt.__c, Ju = tt.unmount;
4892
4892
  function Ea(n, t) {
4893
- tt.__h && tt.__h(zt, n, Js || t), Js = 0;
4894
- var e = zt.__H || (zt.__H = { __: [], __h: [] });
4893
+ tt.__h && tt.__h(Tt, n, Js || t), Js = 0;
4894
+ var e = Tt.__H || (Tt.__H = { __: [], __h: [] });
4895
4895
  return n >= e.__.length && e.__.push({ __V: qo }), e.__[n];
4896
4896
  }
4897
4897
  function oi(n) {
@@ -4900,10 +4900,10 @@ function oi(n) {
4900
4900
  if (r.t = t, !r.__c && (r.__ = [Bu(void 0, e), function(o) {
4901
4901
  var a = r.__N ? r.__N[0] : r.__[0], l = r.t(a, o);
4902
4902
  a !== l && (r.__N = [l, r.__[1]], r.__c.setState({}));
4903
- }], r.__c = zt, !zt.u)) {
4904
- zt.u = !0;
4905
- var s = zt.shouldComponentUpdate;
4906
- zt.shouldComponentUpdate = function(o, a, l) {
4903
+ }], r.__c = Tt, !Tt.u)) {
4904
+ Tt.u = !0;
4905
+ var s = Tt.shouldComponentUpdate;
4906
+ Tt.shouldComponentUpdate = function(o, a, l) {
4907
4907
  if (!r.__c.__H) return !0;
4908
4908
  var c = r.__c.__H.__.filter(function(u) {
4909
4909
  return u.__c;
@@ -4925,7 +4925,7 @@ function oi(n) {
4925
4925
  }
4926
4926
  function de(n, t) {
4927
4927
  var e = Ea(lo++, 3);
4928
- !tt.__s && em(e.__H, t) && (e.__ = n, e.i = t, zt.__H.__h.push(e));
4928
+ !tt.__s && em(e.__H, t) && (e.__ = n, e.i = t, Tt.__H.__h.push(e));
4929
4929
  }
4930
4930
  function co(n) {
4931
4931
  return Js = 5, tm(function() {
@@ -4944,19 +4944,19 @@ function qy() {
4944
4944
  }
4945
4945
  }
4946
4946
  tt.__b = function(n) {
4947
- zt = null, Du && Du(n);
4947
+ Tt = null, Du && Du(n);
4948
4948
  }, tt.__r = function(n) {
4949
4949
  Ou && Ou(n), lo = 0;
4950
- var t = (zt = n.__c).__H;
4951
- t && (Ll === zt ? (t.__h = [], zt.__h = [], t.__.forEach(function(e) {
4950
+ var t = (Tt = n.__c).__H;
4951
+ t && (Ll === Tt ? (t.__h = [], Tt.__h = [], t.__.forEach(function(e) {
4952
4952
  e.__N && (e.__ = e.__N), e.__V = qo, e.__N = e.i = void 0;
4953
- })) : (t.__h.forEach(ta), t.__h.forEach(bc), t.__h = [])), Ll = zt;
4953
+ })) : (t.__h.forEach(ta), t.__h.forEach(bc), t.__h = [])), Ll = Tt;
4954
4954
  }, tt.diffed = function(n) {
4955
4955
  Ku && Ku(n);
4956
4956
  var t = n.__c;
4957
4957
  t && t.__H && (t.__H.__h.length && (qp.push(t) !== 1 && Hu === tt.requestAnimationFrame || ((Hu = tt.requestAnimationFrame) || tv)(qy)), t.__H.__.forEach(function(e) {
4958
4958
  e.i && (e.__H = e.i), e.__V !== qo && (e.__ = e.__V), e.i = void 0, e.__V = qo;
4959
- })), Ll = zt = null;
4959
+ })), Ll = Tt = null;
4960
4960
  }, tt.__c = function(n, t) {
4961
4961
  t.some(function(e) {
4962
4962
  try {
@@ -4988,12 +4988,12 @@ function tv(n) {
4988
4988
  Eu && (t = requestAnimationFrame(e));
4989
4989
  }
4990
4990
  function ta(n) {
4991
- var t = zt, e = n.__c;
4992
- typeof e == "function" && (n.__c = void 0, e()), zt = t;
4991
+ var t = Tt, e = n.__c;
4992
+ typeof e == "function" && (n.__c = void 0, e()), Tt = t;
4993
4993
  }
4994
4994
  function bc(n) {
4995
- var t = zt;
4996
- n.__c = n.__(), zt = t;
4995
+ var t = Tt;
4996
+ n.__c = n.__(), Tt = t;
4997
4997
  }
4998
4998
  function em(n, t) {
4999
4999
  return !n || n.length !== t.length || t.some(function(e, i) {
@@ -5005,8 +5005,8 @@ function Bu(n, t) {
5005
5005
  }
5006
5006
  function re() {
5007
5007
  return function(n) {
5008
- var t = zt.context[n.__c], e = Ea(lo++, 9);
5009
- return e.c = n, t ? (e.__ == null && (e.__ = !0, t.sub(zt)), t.props.value) : n.__;
5008
+ var t = Tt.context[n.__c], e = Ea(lo++, 9);
5009
+ return e.c = n, t ? (e.__ == null && (e.__ = !0, t.sub(Tt)), t.props.value) : n.__;
5010
5010
  }(rm);
5011
5011
  }
5012
5012
  var ev = { search: { placeholder: "Type a keyword..." }, sort: { sortAsc: "Sort column ascending", sortDesc: "Sort column descending" }, pagination: { previous: "Previous", next: "Next", navigate: function(n, t) {
@@ -5097,7 +5097,7 @@ var Au = /* @__PURE__ */ function(n) {
5097
5097
  }, e._process = function(i) {
5098
5098
  var r = this.props.page;
5099
5099
  return new Ja(i.rows.slice(r * this.props.limit, (r + 1) * this.props.limit));
5100
- }, $t(t, [{ key: "type", get: function() {
5100
+ }, qt(t, [{ key: "type", get: function() {
5101
5101
  return Ut.Limit;
5102
5102
  } }]), t;
5103
5103
  }(fn), Qu = /* @__PURE__ */ function(n) {
@@ -5107,7 +5107,7 @@ var Au = /* @__PURE__ */ function(n) {
5107
5107
  return Dt(t, n), t.prototype._process = function(e) {
5108
5108
  var i = {};
5109
5109
  return this.props.url && (i.url = this.props.url(e.url, this.props.page, this.props.limit)), this.props.body && (i.body = this.props.body(e.body, this.props.page, this.props.limit)), ct({}, e, i);
5110
- }, $t(t, [{ key: "type", get: function() {
5110
+ }, qt(t, [{ key: "type", get: function() {
5111
5111
  return Ut.ServerLimit;
5112
5112
  } }]), t;
5113
5113
  }(fn);
@@ -5248,7 +5248,7 @@ var Xr = /* @__PURE__ */ function(n) {
5248
5248
  return x[w.getAttribute("data-column-id")].width = w.clientWidth, x;
5249
5249
  }, y);
5250
5250
  }(s.current));
5251
- for (var d, u = te(t.tabularFormat(this.columns).reduce(function(f, p) {
5251
+ for (var d, u = ee(t.tabularFormat(this.columns).reduce(function(f, p) {
5252
5252
  return f.concat(p);
5253
5253
  }, [])); !(d = u()).done; ) {
5254
5254
  var h = d.value;
@@ -5256,27 +5256,27 @@ var Xr = /* @__PURE__ */ function(n) {
5256
5256
  }
5257
5257
  return r.current && a && vs(null, s.current), this;
5258
5258
  }, e.setSort = function(i, r) {
5259
- for (var s, o = te(r || this.columns || []); !(s = o()).done; ) {
5259
+ for (var s, o = ee(r || this.columns || []); !(s = o()).done; ) {
5260
5260
  var a = s.value;
5261
5261
  a.columns && a.columns.length > 0 ? a.sort = void 0 : a.sort === void 0 && i ? a.sort = {} : a.sort ? typeof a.sort == "object" && (a.sort = ct({}, a.sort)) : a.sort = void 0, a.columns && this.setSort(i, a.columns);
5262
5262
  }
5263
5263
  }, e.setResizable = function(i, r) {
5264
- for (var s, o = te(r || this.columns || []); !(s = o()).done; ) {
5264
+ for (var s, o = ee(r || this.columns || []); !(s = o()).done; ) {
5265
5265
  var a = s.value;
5266
5266
  a.resizable === void 0 && (a.resizable = i), a.columns && this.setResizable(i, a.columns);
5267
5267
  }
5268
5268
  }, e.setID = function(i) {
5269
- for (var r, s = te(i || this.columns || []); !(r = s()).done; ) {
5269
+ for (var r, s = ee(i || this.columns || []); !(r = s()).done; ) {
5270
5270
  var o = r.value;
5271
5271
  o.id || typeof o.name != "string" || (o.id = av(o.name)), o.id || Ge.error('Could not find a valid ID for one of the columns. Make sure a valid "id" is set for all columns.'), o.columns && this.setID(o.columns);
5272
5272
  }
5273
5273
  }, e.populatePlugins = function(i, r) {
5274
- for (var s, o = te(r); !(s = o()).done; ) {
5274
+ for (var s, o = ee(r); !(s = o()).done; ) {
5275
5275
  var a = s.value;
5276
5276
  a.plugin !== void 0 && i.add(ct({ id: a.id }, a.plugin, { position: Ji.Cell }));
5277
5277
  }
5278
5278
  }, t.fromColumns = function(i) {
5279
- for (var r, s = new t(), o = te(i); !(r = o()).done; ) {
5279
+ for (var r, s = new t(), o = ee(i); !(r = o()).done; ) {
5280
5280
  var a = r.value;
5281
5281
  if (typeof a == "string" || Hp(a)) s.columns.push({ name: a });
5282
5282
  else if (typeof a == "object") {
@@ -5291,7 +5291,7 @@ var Xr = /* @__PURE__ */ function(n) {
5291
5291
  return { name: s };
5292
5292
  })), r.columns.length ? (r.setID(), r.setSort(i.sort), r.setResizable(i.resizable), r.populatePlugins(i.plugin, r.columns), r) : null;
5293
5293
  }, t.fromHTMLTable = function(i) {
5294
- for (var r, s = new t(), o = te(i.querySelector("thead").querySelectorAll("th")); !(r = o()).done; ) {
5294
+ for (var r, s = new t(), o = ee(i.querySelector("thead").querySelectorAll("th")); !(r = o()).done; ) {
5295
5295
  var a = r.value;
5296
5296
  s.columns.push({ name: a.innerHTML, width: a.width });
5297
5297
  }
@@ -5300,7 +5300,7 @@ var Xr = /* @__PURE__ */ function(n) {
5300
5300
  var r = [], s = i || [], o = [];
5301
5301
  if (s && s.length) {
5302
5302
  r.push(s);
5303
- for (var a, l = te(s); !(a = l()).done; ) {
5303
+ for (var a, l = ee(s); !(a = l()).done; ) {
5304
5304
  var c = a.value;
5305
5305
  c.columns && c.columns.length && (o = o.concat(c.columns));
5306
5306
  }
@@ -5309,14 +5309,14 @@ var Xr = /* @__PURE__ */ function(n) {
5309
5309
  return r;
5310
5310
  }, t.leafColumns = function(i) {
5311
5311
  var r = [], s = i || [];
5312
- if (s && s.length) for (var o, a = te(s); !(o = a()).done; ) {
5312
+ if (s && s.length) for (var o, a = ee(s); !(o = a()).done; ) {
5313
5313
  var l = o.value;
5314
5314
  l.columns && l.columns.length !== 0 || r.push(l), l.columns && (r = r.concat(this.leafColumns(l.columns)));
5315
5315
  }
5316
5316
  return r;
5317
5317
  }, t.maximumDepth = function(i) {
5318
5318
  return this.tabularFormat([i]).length - 1;
5319
- }, $t(t, [{ key: "columns", get: function() {
5319
+ }, qt(t, [{ key: "columns", get: function() {
5320
5320
  return this._columns;
5321
5321
  }, set: function(i) {
5322
5322
  this._columns = i;
@@ -5368,8 +5368,8 @@ var Xr = /* @__PURE__ */ function(n) {
5368
5368
  var e = null;
5369
5369
  return t.data && (e = new qu(t.data)), t.from && (e = new qu(this.tableElementToArray(t.from)), t.from.style.display = "none"), t.server && (e = new im(t.server)), e || Ge.error("Could not determine the storage type", !0), e;
5370
5370
  }, n.tableElementToArray = function(t) {
5371
- for (var e, i, r = [], s = te(t.querySelector("tbody").querySelectorAll("tr")); !(e = s()).done; ) {
5372
- for (var o, a = [], l = te(e.value.querySelectorAll("td")); !(o = l()).done; ) {
5371
+ for (var e, i, r = [], s = ee(t.querySelector("tbody").querySelectorAll("tr")); !(e = s()).done; ) {
5372
+ for (var o, a = [], l = ee(e.value.querySelectorAll("td")); !(o = l()).done; ) {
5373
5373
  var c = o.value;
5374
5374
  c.childNodes.length === 1 && c.childNodes[0].nodeType === Node.TEXT_NODE ? a.push((i = c.innerHTML, new DOMParser().parseFromString(i, "text/html").documentElement.textContent)) : a.push($p(c.innerHTML));
5375
5375
  }
@@ -5378,13 +5378,13 @@ var Xr = /* @__PURE__ */ function(n) {
5378
5378
  return r;
5379
5379
  }, n;
5380
5380
  }(), th = typeof Symbol < "u" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
5381
- function ee(n, t, e) {
5381
+ function ne(n, t, e) {
5382
5382
  if (!n.s) {
5383
5383
  if (e instanceof gr) {
5384
- if (!e.s) return void (e.o = ee.bind(null, n, t));
5384
+ if (!e.s) return void (e.o = ne.bind(null, n, t));
5385
5385
  1 & t && (t = e.s), e = e.v;
5386
5386
  }
5387
- if (e && e.then) return void e.then(ee.bind(null, n, t), ee.bind(null, n, 2));
5387
+ if (e && e.then) return void e.then(ne.bind(null, n, t), ne.bind(null, n, 2));
5388
5388
  n.s = t, n.v = e;
5389
5389
  var i = n.o;
5390
5390
  i && i(n);
@@ -5399,9 +5399,9 @@ var gr = /* @__PURE__ */ function() {
5399
5399
  var s = 1 & r ? t : e;
5400
5400
  if (s) {
5401
5401
  try {
5402
- ee(i, 1, s(this.v));
5402
+ ne(i, 1, s(this.v));
5403
5403
  } catch (o) {
5404
- ee(i, 2, o);
5404
+ ne(i, 2, o);
5405
5405
  }
5406
5406
  return i;
5407
5407
  }
@@ -5410,9 +5410,9 @@ var gr = /* @__PURE__ */ function() {
5410
5410
  return this.o = function(o) {
5411
5411
  try {
5412
5412
  var a = o.v;
5413
- 1 & o.s ? ee(i, 1, t ? t(a) : a) : e ? ee(i, 1, e(a)) : ee(i, 2, a);
5413
+ 1 & o.s ? ne(i, 1, t ? t(a) : a) : e ? ne(i, 1, e(a)) : ne(i, 2, a);
5414
5414
  } catch (l) {
5415
- ee(i, 2, l);
5415
+ ne(i, 2, l);
5416
5416
  }
5417
5417
  }, i;
5418
5418
  }, n;
@@ -5482,12 +5482,12 @@ var cv = /* @__PURE__ */ function(n) {
5482
5482
  if (function G(_) {
5483
5483
  try {
5484
5484
  for (; !(g = w.next()).done; ) if ((_ = p(g.value)) && _.then) {
5485
- if (!eh(_)) return void _.then(G, x || (x = ee.bind(null, y = new gr(), 2)));
5485
+ if (!eh(_)) return void _.then(G, x || (x = ne.bind(null, y = new gr(), 2)));
5486
5486
  _ = _.v;
5487
5487
  }
5488
- y ? ee(y, 1, _) : y = _;
5488
+ y ? ne(y, 1, _) : y = _;
5489
5489
  } catch (V) {
5490
- ee(y || (y = new gr()), 2, V);
5490
+ ne(y || (y = new gr()), 2, V);
5491
5491
  }
5492
5492
  }(), w.return) {
5493
5493
  var k = function(G) {
@@ -5511,12 +5511,12 @@ var cv = /* @__PURE__ */ function(n) {
5511
5511
  return function ot(q) {
5512
5512
  try {
5513
5513
  for (; ++H < G.length; ) if ((q = _(H)) && q.then) {
5514
- if (!eh(q)) return void q.then(ot, K || (K = ee.bind(null, Y = new gr(), 2)));
5514
+ if (!eh(q)) return void q.then(ot, K || (K = ne.bind(null, Y = new gr(), 2)));
5515
5515
  q = q.v;
5516
5516
  }
5517
- Y ? ee(Y, 1, q) : Y = q;
5517
+ Y ? ne(Y, 1, q) : Y = q;
5518
5518
  } catch (rt) {
5519
- ee(Y || (Y = new gr()), 2, rt);
5519
+ ne(Y || (Y = new gr()), 2, rt);
5520
5520
  }
5521
5521
  }(), Y;
5522
5522
  }(X, function(G) {
@@ -5554,8 +5554,8 @@ var cv = /* @__PURE__ */ function(n) {
5554
5554
  this.setLastProcessorIndex(i), this.emit("propsUpdated"), this.emit("updated", i);
5555
5555
  }, e.afterRegistered = function(i) {
5556
5556
  this.setLastProcessorIndex(i), this.emit("afterRegister"), this.emit("updated", i);
5557
- }, $t(t, [{ key: "steps", get: function() {
5558
- for (var i, r = [], s = te(this.getSortedProcessorTypes()); !(i = s()).done; ) {
5557
+ }, qt(t, [{ key: "steps", get: function() {
5558
+ for (var i, r = [], s = ee(this.getSortedProcessorTypes()); !(i = s()).done; ) {
5559
5559
  var o = this._steps.get(i.value);
5560
5560
  o && o.length && (r = r.concat(o));
5561
5561
  }
@@ -5573,7 +5573,7 @@ var cv = /* @__PURE__ */ function(n) {
5573
5573
  } catch (i) {
5574
5574
  return Promise.reject(i);
5575
5575
  }
5576
- }, $t(t, [{ key: "type", get: function() {
5576
+ }, qt(t, [{ key: "type", get: function() {
5577
5577
  return Ut.Extractor;
5578
5578
  } }]), t;
5579
5579
  }(fn), uv = /* @__PURE__ */ function(n) {
@@ -5583,7 +5583,7 @@ var cv = /* @__PURE__ */ function(n) {
5583
5583
  return Dt(t, n), t.prototype._process = function(e) {
5584
5584
  var i = Ja.fromArray(e.data);
5585
5585
  return i.length = e.total, i;
5586
- }, $t(t, [{ key: "type", get: function() {
5586
+ }, qt(t, [{ key: "type", get: function() {
5587
5587
  return Ut.Transformer;
5588
5588
  } }]), t;
5589
5589
  }(fn), hv = /* @__PURE__ */ function(n) {
@@ -5597,7 +5597,7 @@ var cv = /* @__PURE__ */ function(n) {
5597
5597
  var r;
5598
5598
  return ct({}, e, ((r = {})[i[0]] = i[1], r));
5599
5599
  }, {});
5600
- }, $t(t, [{ key: "type", get: function() {
5600
+ }, qt(t, [{ key: "type", get: function() {
5601
5601
  return Ut.Initiator;
5602
5602
  } }]), t;
5603
5603
  }(fn), fv = /* @__PURE__ */ function(n) {
@@ -5623,7 +5623,7 @@ var cv = /* @__PURE__ */ function(n) {
5623
5623
  });
5624
5624
  }, e._process = function(i) {
5625
5625
  return { data: this.castData(i.data), total: i.total };
5626
- }, $t(t, [{ key: "type", get: function() {
5626
+ }, qt(t, [{ key: "type", get: function() {
5627
5627
  return Ut.Transformer;
5628
5628
  } }]), t;
5629
5629
  }(fn), pv = /* @__PURE__ */ function() {
@@ -5649,7 +5649,7 @@ var cv = /* @__PURE__ */ function(n) {
5649
5649
  } finally {
5650
5650
  t.isDispatching = !1;
5651
5651
  }
5652
- for (var r, s = te(t.listeners); !(r = s()).done; ) (0, r.value)(t.state, i);
5652
+ for (var r, s = ee(t.listeners); !(r = s()).done; ) (0, r.value)(t.state, i);
5653
5653
  return t.state;
5654
5654
  }, this.subscribe = function(e) {
5655
5655
  if (typeof e != "function") throw new Error("Listener is not a function");
@@ -5742,14 +5742,14 @@ var yv = /* @__PURE__ */ function(n) {
5742
5742
  Dt(t, n);
5743
5743
  var e = t.prototype;
5744
5744
  return e.validateProps = function() {
5745
- for (var i, r = te(this.props.columns); !(i = r()).done; ) {
5745
+ for (var i, r = ee(this.props.columns); !(i = r()).done; ) {
5746
5746
  var s = i.value;
5747
5747
  s.direction === void 0 && (s.direction = 1), s.direction !== 1 && s.direction !== -1 && Ge.error("Invalid sort direction " + s.direction);
5748
5748
  }
5749
5749
  }, e.compare = function(i, r) {
5750
5750
  return i > r ? 1 : i < r ? -1 : 0;
5751
5751
  }, e.compareWrapper = function(i, r) {
5752
- for (var s, o = 0, a = te(this.props.columns); !(s = a()).done; ) {
5752
+ for (var s, o = 0, a = ee(this.props.columns); !(s = a()).done; ) {
5753
5753
  var l = s.value;
5754
5754
  if (o !== 0) break;
5755
5755
  var c = i.cells[l.index].data, d = r.cells[l.index].data;
@@ -5761,7 +5761,7 @@ var yv = /* @__PURE__ */ function(n) {
5761
5761
  r.sort(this.compareWrapper.bind(this));
5762
5762
  var s = new Ja(r);
5763
5763
  return s.length = i.length, s;
5764
- }, $t(t, [{ key: "type", get: function() {
5764
+ }, qt(t, [{ key: "type", get: function() {
5765
5765
  return Ut.Sort;
5766
5766
  } }]), t;
5767
5767
  }(fn), nh = function(n, t, e, i) {
@@ -5795,7 +5795,7 @@ var yv = /* @__PURE__ */ function(n) {
5795
5795
  return Dt(t, n), t.prototype._process = function(e) {
5796
5796
  var i = {};
5797
5797
  return this.props.url && (i.url = this.props.url(e.url, this.props.columns)), this.props.body && (i.body = this.props.body(e.body, this.props.columns)), ct({}, e, i);
5798
- }, $t(t, [{ key: "type", get: function() {
5798
+ }, qt(t, [{ key: "type", get: function() {
5799
5799
  return Ut.ServerSort;
5800
5800
  } }]), t;
5801
5801
  }(fn);
@@ -6007,7 +6007,7 @@ const lm = {
6007
6007
  }
6008
6008
  }, nr = ({ data: n, columns: t, pageSize: e }) => {
6009
6009
  const i = typeof e == "number" ? { limit: e } : e, r = Mt(null);
6010
- return ie(() => {
6010
+ return Qt(() => {
6011
6011
  if (r.current === null)
6012
6012
  return;
6013
6013
  const s = new Gv({
@@ -6020,7 +6020,7 @@ const lm = {
6020
6020
  s.destroy();
6021
6021
  };
6022
6022
  }), /* @__PURE__ */ m("div", { ref: r });
6023
- }, Rv = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\d+)(?<substitutionValue>[A-Za-z.])?$/;
6023
+ }, Rv = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\d+)(?<substitutionValue>[A-Z.])?$/i;
6024
6024
  class Es {
6025
6025
  constructor(t, e, i, r) {
6026
6026
  this.segment = t, this.valueAtReference = e, this.substitutionValue = i, this.position = r, this.type = "substitution";
@@ -6043,7 +6043,7 @@ class Es {
6043
6043
  );
6044
6044
  }
6045
6045
  }
6046
- const Lv = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\d+)(-)$/;
6046
+ const Lv = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\d+)(-)$/i;
6047
6047
  class Ei {
6048
6048
  constructor(t, e, i) {
6049
6049
  this.segment = t, this.valueAtReference = e, this.position = i, this.type = "deletion";
@@ -6065,7 +6065,7 @@ class Ei {
6065
6065
  );
6066
6066
  }
6067
6067
  }
6068
- const Yv = /^ins_((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<position>\d+):(?<insertedSymbols>(([A-Za-z?]|(\.\*))+))$/i;
6068
+ const Yv = /^ins_((?<segment>[A-Z0-9_-]+)(?=:):)?(?<position>\d+):(?<insertedSymbols>(([A-Z?]|(\.\*))+))$/i;
6069
6069
  class Bs {
6070
6070
  constructor(t, e, i) {
6071
6071
  this.segment = t, this.position = e, this.insertedSymbols = i, this.type = "insertion", this.code = `ins_${this.segment ? `${this.segment}:` : ""}${this.position}:${this.insertedSymbols}`;
@@ -6138,7 +6138,7 @@ const gc = {
6138
6138
  formatter: (o) => Re(o)
6139
6139
  }))
6140
6140
  }
6141
- ], r = Tp(n, t).map((s) => Object.values(s));
6141
+ ], r = zp(n, t).map((s) => Object.values(s));
6142
6142
  return /* @__PURE__ */ m(nr, { data: r, columns: i, pageSize: e });
6143
6143
  };
6144
6144
  /*!
@@ -6164,7 +6164,7 @@ function rh(n) {
6164
6164
  return jn(uo(n * 100), 0, 100);
6165
6165
  }
6166
6166
  const _e = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 }, yc = [..."0123456789ABCDEF"], Mv = (n) => yc[n & 15], Cv = (n) => yc[(n & 240) >> 4] + yc[n & 15], Wo = (n) => (n & 240) >> 4 === (n & 15), Nv = (n) => Wo(n.r) && Wo(n.g) && Wo(n.b) && Wo(n.a);
6167
- function zv(n) {
6167
+ function Tv(n) {
6168
6168
  var t = n.length, e;
6169
6169
  return n[0] === "#" && (t === 4 || t === 5 ? e = {
6170
6170
  r: 255 & _e[n[1]] * 17,
@@ -6178,10 +6178,10 @@ function zv(n) {
6178
6178
  a: t === 9 ? _e[n[7]] << 4 | _e[n[8]] : 255
6179
6179
  })), e;
6180
6180
  }
6181
- const Tv = (n, t) => n < 255 ? t(n) : "";
6181
+ const zv = (n, t) => n < 255 ? t(n) : "";
6182
6182
  function Fv(n) {
6183
6183
  var t = Nv(n) ? Mv : Cv;
6184
- return n ? "#" + t(n.r) + t(n.g) + t(n.b) + Tv(n.a, t) : void 0;
6184
+ return n ? "#" + t(n.r) + t(n.g) + t(n.b) + zv(n.a, t) : void 0;
6185
6185
  }
6186
6186
  const Hv = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;
6187
6187
  function hm(n, t, e) {
@@ -6497,7 +6497,7 @@ class Us {
6497
6497
  return t;
6498
6498
  const e = typeof t;
6499
6499
  let i;
6500
- e === "object" ? i = ah(t) : e === "string" && (i = zv(t) || Av(t) || ex(t)), this._rgb = i, this._valid = !!i;
6500
+ e === "object" ? i = ah(t) : e === "string" && (i = Tv(t) || Av(t) || ex(t)), this._rgb = i, this._valid = !!i;
6501
6501
  }
6502
6502
  get valid() {
6503
6503
  return this._valid;
@@ -6720,7 +6720,7 @@ const As = (n) => typeof n < "u", li = (n) => typeof n == "function", ch = (n, t
6720
6720
  function lx(n) {
6721
6721
  return n.type === "mouseup" || n.type === "click" || n.type === "contextmenu";
6722
6722
  }
6723
- const _t = Math.PI, Xt = 2 * _t, cx = Xt + _t, wa = Number.POSITIVE_INFINITY, dx = _t / 180, Tt = _t / 2, Xi = _t / 4, dh = _t * 2 / 3, Jn = Math.log10, rn = Math.sign;
6723
+ const _t = Math.PI, Xt = 2 * _t, cx = Xt + _t, wa = Number.POSITIVE_INFINITY, dx = _t / 180, zt = _t / 2, Xi = _t / 4, dh = _t * 2 / 3, Jn = Math.log10, rn = Math.sign;
6724
6724
  function Zs(n, t, e) {
6725
6725
  return Math.abs(n - t) < e;
6726
6726
  }
@@ -6737,7 +6737,7 @@ function ux(n) {
6737
6737
  n % i === 0 && (t.push(i), t.push(n / i));
6738
6738
  return e === (e | 0) && t.push(e), t.sort((r, s) => r - s).pop(), t;
6739
6739
  }
6740
- function zr(n) {
6740
+ function Tr(n) {
6741
6741
  return !isNaN(parseFloat(n)) && isFinite(n);
6742
6742
  }
6743
6743
  function hx(n, t) {
@@ -6930,8 +6930,8 @@ const Ro = (n) => n === 0 || n === 1, ph = (n, t, e) => -(Math.pow(2, 10 * (n -=
6930
6930
  easeInQuint: (n) => n * n * n * n * n,
6931
6931
  easeOutQuint: (n) => (n -= 1) * n * n * n * n + 1,
6932
6932
  easeInOutQuint: (n) => (n /= 0.5) < 1 ? 0.5 * n * n * n * n * n : 0.5 * ((n -= 2) * n * n * n * n + 2),
6933
- easeInSine: (n) => -Math.cos(n * Tt) + 1,
6934
- easeOutSine: (n) => Math.sin(n * Tt),
6933
+ easeInSine: (n) => -Math.cos(n * zt) + 1,
6934
+ easeOutSine: (n) => Math.sin(n * zt),
6935
6935
  easeInOutSine: (n) => -0.5 * (Math.cos(_t * n) - 1),
6936
6936
  easeInExpo: (n) => n === 0 ? 0 : Math.pow(2, 10 * (n - 1)),
6937
6937
  easeOutExpo: (n) => n === 1 ? 1 : -Math.pow(2, -10 * n) + 1,
@@ -7311,7 +7311,7 @@ function Wm(n, t, e, i, r) {
7311
7311
  d = r ? r / 2 : b, n.moveTo(e + Math.sin(g) * d, i - Math.cos(g) * b), g += dh, n.lineTo(e + Math.sin(g) * d, i - Math.cos(g) * b), g += dh, n.lineTo(e + Math.sin(g) * d, i - Math.cos(g) * b), n.closePath();
7312
7312
  break;
7313
7313
  case "rectRounded":
7314
- c = b * 0.516, l = b - c, o = Math.cos(g + Xi) * l, u = Math.cos(g + Xi) * (r ? r / 2 - c : l), a = Math.sin(g + Xi) * l, h = Math.sin(g + Xi) * (r ? r / 2 - c : l), n.arc(e - u, i - a, c, g - _t, g - Tt), n.arc(e + h, i - o, c, g - Tt, g), n.arc(e + u, i + a, c, g, g + Tt), n.arc(e - h, i + o, c, g + Tt, g + _t), n.closePath();
7314
+ c = b * 0.516, l = b - c, o = Math.cos(g + Xi) * l, u = Math.cos(g + Xi) * (r ? r / 2 - c : l), a = Math.sin(g + Xi) * l, h = Math.sin(g + Xi) * (r ? r / 2 - c : l), n.arc(e - u, i - a, c, g - _t, g - zt), n.arc(e + h, i - o, c, g - zt, g), n.arc(e + u, i + a, c, g, g + zt), n.arc(e - h, i + o, c, g + zt, g + _t), n.closePath();
7315
7315
  break;
7316
7316
  case "rect":
7317
7317
  if (!p) {
@@ -7390,10 +7390,10 @@ function Ui(n, t, e, i, r, s = {}) {
7390
7390
  }
7391
7391
  function $s(n, t) {
7392
7392
  const { x: e, y: i, w: r, h: s, radius: o } = t;
7393
- n.arc(e + o.topLeft, i + o.topLeft, o.topLeft, 1.5 * _t, _t, !0), n.lineTo(e, i + s - o.bottomLeft), n.arc(e + o.bottomLeft, i + s - o.bottomLeft, o.bottomLeft, _t, Tt, !0), n.lineTo(e + r - o.bottomRight, i + s), n.arc(e + r - o.bottomRight, i + s - o.bottomRight, o.bottomRight, Tt, 0, !0), n.lineTo(e + r, i + o.topRight), n.arc(e + r - o.topRight, i + o.topRight, o.topRight, 0, -Tt, !0), n.lineTo(e + o.topLeft, i);
7393
+ n.arc(e + o.topLeft, i + o.topLeft, o.topLeft, 1.5 * _t, _t, !0), n.lineTo(e, i + s - o.bottomLeft), n.arc(e + o.bottomLeft, i + s - o.bottomLeft, o.bottomLeft, _t, zt, !0), n.lineTo(e + r - o.bottomRight, i + s), n.arc(e + r - o.bottomRight, i + s - o.bottomRight, o.bottomRight, zt, 0, !0), n.lineTo(e + r, i + o.topRight), n.arc(e + r - o.topRight, i + o.topRight, o.topRight, 0, -zt, !0), n.lineTo(e + o.topLeft, i);
7394
7394
  }
7395
7395
  const Cx = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/, Nx = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;
7396
- function zx(n, t) {
7396
+ function Tx(n, t) {
7397
7397
  const e = ("" + n).match(Cx);
7398
7398
  if (!e || e[1] === "normal")
7399
7399
  return t * 1.2;
@@ -7406,11 +7406,11 @@ function zx(n, t) {
7406
7406
  }
7407
7407
  return t * n;
7408
7408
  }
7409
- const Tx = (n) => +n || 0;
7409
+ const zx = (n) => +n || 0;
7410
7410
  function vd(n, t) {
7411
7411
  const e = {}, i = st(t), r = i ? Object.keys(t) : t, s = st(n) ? i ? (o) => A(n[o], n[t[o]]) : (o) => n[o] : () => n;
7412
7412
  for (const o of r)
7413
- e[o] = Tx(s(o));
7413
+ e[o] = zx(s(o));
7414
7414
  return e;
7415
7415
  }
7416
7416
  function Sm(n) {
@@ -7429,7 +7429,7 @@ function Ni(n) {
7429
7429
  "bottomRight"
7430
7430
  ]);
7431
7431
  }
7432
- function Qt(n) {
7432
+ function $t(n) {
7433
7433
  const t = Sm(n);
7434
7434
  return t.width = t.left + t.right, t.height = t.top + t.bottom, t;
7435
7435
  }
@@ -7441,7 +7441,7 @@ function Pt(n, t) {
7441
7441
  i && !("" + i).match(Nx) && (console.warn('Invalid font style specified: "' + i + '"'), i = void 0);
7442
7442
  const r = {
7443
7443
  family: A(n.family, t.family),
7444
- lineHeight: zx(A(n.lineHeight, t.lineHeight), e),
7444
+ lineHeight: Tx(A(n.lineHeight, t.lineHeight), e),
7445
7445
  size: e,
7446
7446
  style: i,
7447
7447
  weight: A(n.weight, t.weight),
@@ -7529,7 +7529,7 @@ function xd(n, t = [
7529
7529
  }
7530
7530
  });
7531
7531
  }
7532
- function Tr(n, t, e, i) {
7532
+ function zr(n, t, e, i) {
7533
7533
  const r = {
7534
7534
  _cacheable: !1,
7535
7535
  _proxy: n,
@@ -7537,8 +7537,8 @@ function Tr(n, t, e, i) {
7537
7537
  _subProxy: e,
7538
7538
  _stack: /* @__PURE__ */ new Set(),
7539
7539
  _descriptors: Gm(n, i),
7540
- setContext: (s) => Tr(n, s, e, i),
7541
- override: (s) => Tr(n.override(s), t, e, i)
7540
+ setContext: (s) => zr(n, s, e, i),
7541
+ override: (s) => zr(n.override(s), t, e, i)
7542
7542
  };
7543
7543
  return new Proxy(r, {
7544
7544
  /**
@@ -7612,7 +7612,7 @@ function Rm(n, t, e) {
7612
7612
  function Px(n, t, e) {
7613
7613
  const { _proxy: i, _context: r, _subProxy: s, _descriptors: o } = n;
7614
7614
  let a = i[t];
7615
- return li(a) && o.isScriptable(t) && (a = Dx(t, a, n, e)), Wt(a) && a.length && (a = Ox(t, a, n, o.isIndexable)), Zd(t, a) && (a = Tr(a, r, s && s[t], o)), a;
7615
+ return li(a) && o.isScriptable(t) && (a = Dx(t, a, n, e)), Wt(a) && a.length && (a = Ox(t, a, n, o.isIndexable)), Zd(t, a) && (a = zr(a, r, s && s[t], o)), a;
7616
7616
  }
7617
7617
  function Dx(n, t, e, i) {
7618
7618
  const { _proxy: r, _context: s, _subProxy: o, _stack: a } = e;
@@ -7631,7 +7631,7 @@ function Ox(n, t, e, i) {
7631
7631
  t = [];
7632
7632
  for (const d of l) {
7633
7633
  const u = wd(c, r, n, d);
7634
- t.push(Tr(u, s, o && o[n], a));
7634
+ t.push(zr(u, s, o && o[n], a));
7635
7635
  }
7636
7636
  }
7637
7637
  return t;
@@ -7802,7 +7802,7 @@ const i1 = [
7802
7802
  "bottom",
7803
7803
  "left"
7804
7804
  ];
7805
- function zi(n, t, e) {
7805
+ function Ti(n, t, e) {
7806
7806
  const i = {};
7807
7807
  e = e ? "-" + e : "";
7808
7808
  for (let r = 0; r < 4; r++) {
@@ -7830,7 +7830,7 @@ function s1(n, t) {
7830
7830
  function Gi(n, t) {
7831
7831
  if ("native" in n)
7832
7832
  return n;
7833
- const { canvas: e, currentDevicePixelRatio: i } = t, r = qa(e), s = r.boxSizing === "border-box", o = zi(r, "padding"), a = zi(r, "border", "width"), { x: l, y: c, box: d } = s1(n, e), u = o.left + (d && a.left), h = o.top + (d && a.top);
7833
+ const { canvas: e, currentDevicePixelRatio: i } = t, r = qa(e), s = r.boxSizing === "border-box", o = Ti(r, "padding"), a = Ti(r, "border", "width"), { x: l, y: c, box: d } = s1(n, e), u = o.left + (d && a.left), h = o.top + (d && a.top);
7834
7834
  let { width: f, height: p } = t;
7835
7835
  return s && (f -= o.width + a.width, p -= o.height + a.height), {
7836
7836
  x: Math.round((l - u) / f * e.width / i),
@@ -7844,7 +7844,7 @@ function o1(n, t, e) {
7844
7844
  if (!s)
7845
7845
  t = n.clientWidth, e = n.clientHeight;
7846
7846
  else {
7847
- const o = s.getBoundingClientRect(), a = qa(s), l = zi(a, "border", "width"), c = zi(a, "padding");
7847
+ const o = s.getBoundingClientRect(), a = qa(s), l = Ti(a, "border", "width"), c = Ti(a, "padding");
7848
7848
  t = o.width - c.width - l.width, e = o.height - c.height - l.height, i = _a(a.maxWidth, s, "clientWidth"), r = _a(a.maxHeight, s, "clientHeight");
7849
7849
  }
7850
7850
  }
@@ -7857,10 +7857,10 @@ function o1(n, t, e) {
7857
7857
  }
7858
7858
  const Yo = (n) => Math.round(n * 10) / 10;
7859
7859
  function a1(n, t, e, i) {
7860
- const r = qa(n), s = zi(r, "margin"), o = _a(r.maxWidth, n, "clientWidth") || wa, a = _a(r.maxHeight, n, "clientHeight") || wa, l = o1(n, t, e);
7860
+ const r = qa(n), s = Ti(r, "margin"), o = _a(r.maxWidth, n, "clientWidth") || wa, a = _a(r.maxHeight, n, "clientHeight") || wa, l = o1(n, t, e);
7861
7861
  let { width: c, height: d } = l;
7862
7862
  if (r.boxSizing === "content-box") {
7863
- const h = zi(r, "border", "width"), f = zi(r, "padding");
7863
+ const h = Ti(r, "border", "width"), f = Ti(r, "padding");
7864
7864
  c -= f.width + h.width, d -= f.height + h.height;
7865
7865
  }
7866
7866
  return c = Math.max(0, c - s.width), d = Math.max(0, i ? c / i : d - s.height), c = Yo(Math.min(c, o, l.maxWidth)), d = Yo(Math.min(d, a, l.maxHeight)), c && !d && (d = Yo(c / 2)), (t !== void 0 || e !== void 0) && i && l.height && d > l.height && (d = l.height, c = Yo(Math.floor(d * i))), {
@@ -7996,7 +7996,7 @@ function f1(n, t, e) {
7996
7996
  style: n.style
7997
7997
  };
7998
7998
  }
7999
- function zm(n, t, e) {
7999
+ function Tm(n, t, e) {
8000
8000
  if (!e)
8001
8001
  return [
8002
8002
  n
@@ -8020,10 +8020,10 @@ function zm(n, t, e) {
8020
8020
  style: f
8021
8021
  })), p;
8022
8022
  }
8023
- function Tm(n, t) {
8023
+ function zm(n, t) {
8024
8024
  const e = [], i = n.segments;
8025
8025
  for (let r = 0; r < i.length; r++) {
8026
- const s = zm(i[r], n.points, t);
8026
+ const s = Tm(i[r], n.points, t);
8027
8027
  s.length && e.push(...s);
8028
8028
  }
8029
8029
  return e;
@@ -8482,7 +8482,7 @@ function Rh(n, t) {
8482
8482
  x[a] = g;
8483
8483
  }
8484
8484
  }
8485
- function zl(n, t) {
8485
+ function Tl(n, t) {
8486
8486
  const e = n.scales;
8487
8487
  return Object.keys(e).filter((i) => e[i].axis === t).shift();
8488
8488
  }
@@ -8520,7 +8520,7 @@ function is(n, t) {
8520
8520
  }
8521
8521
  }
8522
8522
  }
8523
- const Tl = (n) => n === "reset" || n === "none", Lh = (n, t) => t ? n : Object.assign({}, n), V1 = (n, t, e) => n && !t.hidden && t._stacked && {
8523
+ const zl = (n) => n === "reset" || n === "none", Lh = (n, t) => t ? n : Object.assign({}, n), V1 = (n, t, e) => n && !t.hidden && t._stacked && {
8524
8524
  keys: Hm(e, !0),
8525
8525
  values: null
8526
8526
  };
@@ -8536,7 +8536,7 @@ class Le {
8536
8536
  this.index !== t && is(this._cachedMeta), this.index = t;
8537
8537
  }
8538
8538
  linkScales() {
8539
- const t = this.chart, e = this._cachedMeta, i = this.getDataset(), r = (u, h, f, p) => u === "x" ? h : u === "r" ? p : f, s = e.xAxisID = A(i.xAxisID, zl(t, "x")), o = e.yAxisID = A(i.yAxisID, zl(t, "y")), a = e.rAxisID = A(i.rAxisID, zl(t, "r")), l = e.indexAxis, c = e.iAxisID = r(l, s, o, a), d = e.vAxisID = r(l, o, s, a);
8539
+ const t = this.chart, e = this._cachedMeta, i = this.getDataset(), r = (u, h, f, p) => u === "x" ? h : u === "r" ? p : f, s = e.xAxisID = A(i.xAxisID, Tl(t, "x")), o = e.yAxisID = A(i.yAxisID, Tl(t, "y")), a = e.rAxisID = A(i.rAxisID, Tl(t, "r")), l = e.indexAxis, c = e.iAxisID = r(l, s, o, a), d = e.vAxisID = r(l, o, s, a);
8540
8540
  e.xScale = this.getScaleForId(s), e.yScale = this.getScaleForId(o), e.rScale = this.getScaleForId(a), e.iScale = this.getScaleForId(c), e.vScale = this.getScaleForId(d);
8541
8541
  }
8542
8542
  getDataset() {
@@ -8760,7 +8760,7 @@ class Le {
8760
8760
  return this._sharedOptions || (this._sharedOptions = Object.assign({}, t));
8761
8761
  }
8762
8762
  includeOptions(t, e) {
8763
- return !e || Tl(t) || this.chart._animationsDisabled;
8763
+ return !e || zl(t) || this.chart._animationsDisabled;
8764
8764
  }
8765
8765
  _getSharedOptions(t, e) {
8766
8766
  const i = this.resolveDataElementOptions(t, e), r = this._sharedOptions, s = this.getSharedOptions(i), o = this.includeOptions(e, s) || s !== r;
@@ -8770,10 +8770,10 @@ class Le {
8770
8770
  };
8771
8771
  }
8772
8772
  updateElement(t, e, i, r) {
8773
- Tl(r) ? Object.assign(t, i) : this._resolveAnimations(e, r).update(t, i);
8773
+ zl(r) ? Object.assign(t, i) : this._resolveAnimations(e, r).update(t, i);
8774
8774
  }
8775
8775
  updateSharedOptions(t, e, i) {
8776
- t && !Tl(e) && this._resolveAnimations(void 0, e).update(t, i);
8776
+ t && !zl(e) && this._resolveAnimations(void 0, e).update(t, i);
8777
8777
  }
8778
8778
  _setStyle(t, e, i, r) {
8779
8779
  t.active = r;
@@ -8924,7 +8924,7 @@ function N1(n, t, e, i) {
8924
8924
  start: c
8925
8925
  };
8926
8926
  }
8927
- function z1(n, t, e, i) {
8927
+ function T1(n, t, e, i) {
8928
8928
  const r = e.parse(n[0], i), s = e.parse(n[1], i), o = Math.min(r, s), a = Math.max(r, s);
8929
8929
  let l = o, c = a;
8930
8930
  Math.abs(o) > Math.abs(a) && (l = a, c = o), t[e.axis] = c, t._custom = {
@@ -8937,7 +8937,7 @@ function z1(n, t, e, i) {
8937
8937
  };
8938
8938
  }
8939
8939
  function Pm(n, t, e, i) {
8940
- return Wt(n) ? z1(n, t, e, i) : t[e.axis] = e.parse(n, i), t;
8940
+ return Wt(n) ? T1(n, t, e, i) : t[e.axis] = e.parse(n, i), t;
8941
8941
  }
8942
8942
  function Yh(n, t, e, i) {
8943
8943
  const r = n.iScale, s = n.vScale, o = r.getLabels(), a = r === s, l = [];
@@ -8949,7 +8949,7 @@ function Yh(n, t, e, i) {
8949
8949
  function Fl(n) {
8950
8950
  return n && n.barStart !== void 0 && n.barEnd !== void 0;
8951
8951
  }
8952
- function T1(n, t, e) {
8952
+ function z1(n, t, e) {
8953
8953
  return n !== 0 ? rn(n) : (t.isHorizontal() ? 1 : -1) * (t.min >= e ? 1 : -1);
8954
8954
  }
8955
8955
  function F1(n) {
@@ -9093,7 +9093,7 @@ class ti extends Le {
9093
9093
  const g = !dt(s) && !d ? s : h;
9094
9094
  let y = e.getPixelForValue(g);
9095
9095
  if (this.chart.getDataVisibility(t) ? p = e.getPixelForValue(h + f) : p = y, b = p - y, Math.abs(b) < o) {
9096
- b = T1(b, e, a) * o, u === a && (y -= b / 2);
9096
+ b = z1(b, e, a) * o, u === a && (y -= b / 2);
9097
9097
  const x = e.getPixelForDecimal(0), w = e.getPixelForDecimal(1), k = Math.min(x, w), X = Math.max(x, w);
9098
9098
  y = Math.max(Math.min(y, X), k), p = y + b, i && !d && (l._stacks[e.axis]._visualValues[r] = e.getValueForPixel(p) - e.getValueForPixel(y));
9099
9099
  }
@@ -9251,7 +9251,7 @@ M(ea, "id", "bubble"), M(ea, "defaults", {
9251
9251
  function O1(n, t, e) {
9252
9252
  let i = 1, r = 1, s = 0, o = 0;
9253
9253
  if (t < Xt) {
9254
- const a = n, l = a + t, c = Math.cos(a), d = Math.sin(a), u = Math.cos(l), h = Math.sin(l), f = (w, k, X) => Qs(w, a, l, !0) ? 1 : Math.max(k, k * e, X, X * e), p = (w, k, X) => Qs(w, a, l, !0) ? -1 : Math.min(k, k * e, X, X * e), b = f(0, c, u), g = f(Tt, d, h), y = p(_t, c, u), x = p(_t + Tt, d, h);
9254
+ const a = n, l = a + t, c = Math.cos(a), d = Math.sin(a), u = Math.cos(l), h = Math.sin(l), f = (w, k, X) => Qs(w, a, l, !0) ? 1 : Math.max(k, k * e, X, X * e), p = (w, k, X) => Qs(w, a, l, !0) ? -1 : Math.min(k, k * e, X, X * e), b = f(0, c, u), g = f(zt, d, h), y = p(_t, c, u), x = p(_t + zt, d, h);
9255
9255
  i = (b - y) / 2, r = (g - x) / 2, s = -(b + y) / 2, o = -(g + x) / 2;
9256
9256
  }
9257
9257
  return {
@@ -9464,7 +9464,7 @@ class Rn extends Le {
9464
9464
  }, t), this.updateElements(r, a, l, t);
9465
9465
  }
9466
9466
  updateElements(t, e, i, r) {
9467
- const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, { sharedOptions: d, includeOptions: u } = this._getSharedOptions(e, r), h = o.axis, f = a.axis, { spanGaps: p, segment: b } = this.options, g = zr(p) ? p : Number.POSITIVE_INFINITY, y = this.chart._animationsDisabled || s || r === "none", x = e + i, w = t.length;
9467
+ const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, { sharedOptions: d, includeOptions: u } = this._getSharedOptions(e, r), h = o.axis, f = a.axis, { spanGaps: p, segment: b } = this.options, g = Tr(p) ? p : Number.POSITIVE_INFINITY, y = this.chart._animationsDisabled || s || r === "none", x = e + i, w = t.length;
9468
9468
  let k = e > 0 && this.getParsed(e - 1);
9469
9469
  for (let X = 0; X < w; ++X) {
9470
9470
  const S = t[X], G = y ? S : {};
@@ -9702,7 +9702,7 @@ M(na, "id", "radar"), M(na, "defaults", {
9702
9702
  }
9703
9703
  }
9704
9704
  });
9705
- class Ti extends Le {
9705
+ class zi extends Le {
9706
9706
  getLabelAndValue(t) {
9707
9707
  const e = this._cachedMeta, i = this.chart.data.labels || [], { xScale: r, yScale: s } = e, o = this.getParsed(t), a = r.getLabelForValue(o.x), l = s.getLabelForValue(o.y);
9708
9708
  return {
@@ -9730,7 +9730,7 @@ class Ti extends Le {
9730
9730
  !this.datasetElementType && t && (this.datasetElementType = this.chart.registry.getElement("line")), super.addElements();
9731
9731
  }
9732
9732
  updateElements(t, e, i, r) {
9733
- const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, d = this.resolveDataElementOptions(e, r), u = this.getSharedOptions(d), h = this.includeOptions(r, u), f = o.axis, p = a.axis, { spanGaps: b, segment: g } = this.options, y = zr(b) ? b : Number.POSITIVE_INFINITY, x = this.chart._animationsDisabled || s || r === "none";
9733
+ const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, d = this.resolveDataElementOptions(e, r), u = this.getSharedOptions(d), h = this.includeOptions(r, u), f = o.axis, p = a.axis, { spanGaps: b, segment: g } = this.options, y = Tr(b) ? b : Number.POSITIVE_INFINITY, x = this.chart._animationsDisabled || s || r === "none";
9734
9734
  let w = e > 0 && this.getParsed(e - 1);
9735
9735
  for (let k = e; k < e + i; ++k) {
9736
9736
  const X = t[k], S = this.getParsed(k), G = x ? X : {}, _ = dt(S[p]), V = G[f] = o.getPixelForValue(S[f], k), Y = G[p] = s || _ ? a.getBasePixel() : a.getPixelForValue(l ? this.applyStack(a, S, l) : S[p], k);
@@ -9753,12 +9753,12 @@ class Ti extends Le {
9753
9753
  return Math.max(r, s, o) / 2;
9754
9754
  }
9755
9755
  }
9756
- M(Ti, "id", "scatter"), M(Ti, "defaults", {
9756
+ M(zi, "id", "scatter"), M(zi, "defaults", {
9757
9757
  datasetElementType: !1,
9758
9758
  dataElementType: "point",
9759
9759
  showLine: !1,
9760
9760
  fill: !1
9761
- }), M(Ti, "overrides", {
9761
+ }), M(zi, "overrides", {
9762
9762
  interaction: {
9763
9763
  mode: "point"
9764
9764
  },
@@ -9780,7 +9780,7 @@ var K1 = /* @__PURE__ */ Object.freeze({
9780
9780
  PieController: wc,
9781
9781
  PolarAreaController: sn,
9782
9782
  RadarController: na,
9783
- ScatterController: Ti
9783
+ ScatterController: zi
9784
9784
  });
9785
9785
  function Wi() {
9786
9786
  throw new Error("This method is not implemented: Check that a complete date adapter is provided.");
@@ -10123,7 +10123,7 @@ function fs(n, t, e, i) {
10123
10123
  function Vo(n, t, e, i, r) {
10124
10124
  n.top = e, n.left = t, n.right = t + i, n.bottom = e + r, n.width = i, n.height = r;
10125
10125
  }
10126
- function zh(n, t, e, i) {
10126
+ function Th(n, t, e, i) {
10127
10127
  const r = e.padding;
10128
10128
  let { x: s, y: o } = t;
10129
10129
  for (const a of n) {
@@ -10165,7 +10165,7 @@ var Bt = {
10165
10165
  update(n, t, e, i) {
10166
10166
  if (!n)
10167
10167
  return;
10168
- const r = Qt(n.options.layout.padding), s = Math.max(t - r.width, 0), o = Math.max(e - r.height, 0), a = t2(n.boxes), l = a.vertical, c = a.horizontal;
10168
+ const r = $t(n.options.layout.padding), s = Math.max(t - r.width, 0), o = Math.max(e - r.height, 0), a = t2(n.boxes), l = a.vertical, c = a.horizontal;
10169
10169
  mt(n.boxes, (b) => {
10170
10170
  typeof b.beforeLayout == "function" && b.beforeLayout();
10171
10171
  });
@@ -10178,7 +10178,7 @@ var Bt = {
10178
10178
  vBoxMaxWidth: s / 2 / d,
10179
10179
  hBoxMaxHeight: o / 2
10180
10180
  }), h = Object.assign({}, r);
10181
- Om(h, Qt(i));
10181
+ Om(h, $t(i));
10182
10182
  const f = Object.assign({
10183
10183
  maxPadding: h,
10184
10184
  w: s,
@@ -10186,7 +10186,7 @@ var Bt = {
10186
10186
  x: r.left,
10187
10187
  y: r.top
10188
10188
  }, r), p = q1(l.concat(c), u);
10189
- fs(a.fullSize, f, u, p), fs(l, f, u, p), fs(c, f, u, p) && fs(l, f, u, p), n2(f), zh(a.leftAndTop, f, u, p), f.x += f.w, f.y += f.h, zh(a.rightAndBottom, f, u, p), n.chartArea = {
10189
+ fs(a.fullSize, f, u, p), fs(l, f, u, p), fs(c, f, u, p) && fs(l, f, u, p), n2(f), Th(a.leftAndTop, f, u, p), f.x += f.w, f.y += f.h, Th(a.rightAndBottom, f, u, p), n.chartArea = {
10190
10190
  left: f.left,
10191
10191
  top: f.top,
10192
10192
  right: f.left + f.w,
@@ -10247,7 +10247,7 @@ const ia = "$chartjs", s2 = {
10247
10247
  pointerup: "mouseup",
10248
10248
  pointerleave: "mouseout",
10249
10249
  pointerout: "mouseout"
10250
- }, Th = (n) => n === null || n === "";
10250
+ }, zh = (n) => n === null || n === "";
10251
10251
  function o2(n, t) {
10252
10252
  const e = n.style, i = n.getAttribute("height"), r = n.getAttribute("width");
10253
10253
  if (n[ia] = {
@@ -10260,11 +10260,11 @@ function o2(n, t) {
10260
10260
  width: e.width
10261
10261
  }
10262
10262
  }
10263
- }, e.display = e.display || "block", e.boxSizing = e.boxSizing || "border-box", Th(r)) {
10263
+ }, e.display = e.display || "block", e.boxSizing = e.boxSizing || "border-box", zh(r)) {
10264
10264
  const s = Zh(n, "width");
10265
10265
  s !== void 0 && (n.width = s);
10266
10266
  }
10267
- if (Th(i))
10267
+ if (zh(i))
10268
10268
  if (n.style.height === "")
10269
10269
  n.height = n.width / (t || 2);
10270
10270
  else {
@@ -10432,7 +10432,7 @@ let pn = (jo = class {
10432
10432
  };
10433
10433
  }
10434
10434
  hasValue() {
10435
- return zr(this.x) && zr(this.y);
10435
+ return Tr(this.x) && Tr(this.y);
10436
10436
  }
10437
10437
  getProps(t, e) {
10438
10438
  const i = this.$animations;
@@ -10535,7 +10535,7 @@ function os(n) {
10535
10535
  function Oh(n, t) {
10536
10536
  if (!n.display)
10537
10537
  return 0;
10538
- const e = Pt(n.font, t), i = Qt(n.padding);
10538
+ const e = Pt(n.font, t), i = $t(n.padding);
10539
10539
  return (Wt(n.text) ? n.text.length : 1) * e.lineHeight + i.height;
10540
10540
  }
10541
10541
  function S2(n, t) {
@@ -10570,7 +10570,7 @@ function L2(n, t, e, i) {
10570
10570
  const y = Object.keys(e)[0], x = e[y];
10571
10571
  f = d[y].getPixelForValue(x) - g + t;
10572
10572
  } else e === "center" ? f = (c.left + c.right) / 2 - g + t : f = Hh(n, e, t);
10573
- p = Jt(i, o, r), u = e === "left" ? -Tt : Tt;
10573
+ p = Jt(i, o, r), u = e === "left" ? -zt : zt;
10574
10574
  }
10575
10575
  return {
10576
10576
  titleX: f,
@@ -10976,7 +10976,7 @@ class pi extends pn {
10976
10976
  o ? (X = _, G === "inner" && (y === x - 1 ? Ae = this.options.reverse ? "left" : "right" : y === 0 ? Ae = this.options.reverse ? "right" : "left" : Ae = "center"), r === "top" ? c === "near" || b !== 0 ? H = -K * Y + Y / 2 : c === "center" ? H = -q.highest.height / 2 - ut * Y + Y : H = -q.highest.height + Y / 2 : c === "near" || b !== 0 ? H = Y / 2 : c === "center" ? H = q.highest.height / 2 - ut * Y : H = q.highest.height - K * Y, u && (H *= -1), b !== 0 && !rt.showLabelBackdrop && (X += Y / 2 * Math.sin(b))) : (S = _, H = (1 - K) * Y / 2);
10977
10977
  let Fn;
10978
10978
  if (rt.showLabelBackdrop) {
10979
- const Hn = Qt(rt.backdropPadding), Zi = q.heights[y], gn = q.widths[y];
10979
+ const Hn = $t(rt.backdropPadding), Zi = q.heights[y], gn = q.widths[y];
10980
10980
  let Ce = H - Hn.top, Ne = 0 - Hn.left;
10981
10981
  switch (ot) {
10982
10982
  case "middle":
@@ -11124,7 +11124,7 @@ class pi extends pn {
11124
11124
  const { ctx: t, options: { position: e, title: i, reverse: r } } = this;
11125
11125
  if (!i.display)
11126
11126
  return;
11127
- const s = Pt(i.font), o = Qt(i.padding), a = i.align;
11127
+ const s = Pt(i.font), o = $t(i.padding), a = i.align;
11128
11128
  let l = s.lineHeight / 2;
11129
11129
  e === "bottom" || e === "center" || st(e) ? (l += o.bottom, Wt(i.text) && (l += s.lineHeight * (i.text.length - 1))) : l += o.top;
11130
11130
  const { titleX: c, titleY: d, maxWidth: u, rotation: h } = L2(this, l, e, a);
@@ -11348,7 +11348,7 @@ class C2 {
11348
11348
  }
11349
11349
  _createDescriptors(t, e) {
11350
11350
  const i = t && t.config, r = A(i.options && i.options.plugins, {}), s = N2(i);
11351
- return r === !1 && !e ? [] : T2(t, s, r, e);
11351
+ return r === !1 && !e ? [] : z2(t, s, r, e);
11352
11352
  }
11353
11353
  _notifyStateChanges(t) {
11354
11354
  const e = this._oldCache || [], i = this._cache, r = (s, o) => s.filter((a) => !o.some((l) => a.plugin.id === l.plugin.id));
@@ -11369,13 +11369,13 @@ function N2(n) {
11369
11369
  localIds: t
11370
11370
  };
11371
11371
  }
11372
- function z2(n, t) {
11372
+ function T2(n, t) {
11373
11373
  return !t && n === !1 ? null : n === !0 ? {} : n;
11374
11374
  }
11375
- function T2(n, { plugins: t, localIds: e }, i, r) {
11375
+ function z2(n, { plugins: t, localIds: e }, i, r) {
11376
11376
  const s = [], o = n.getContext();
11377
11377
  for (const a of t) {
11378
- const l = a.id, c = z2(i[l], r);
11378
+ const l = a.id, c = T2(i[l], r);
11379
11379
  c !== null && s.push({
11380
11380
  plugin: a,
11381
11381
  options: F2(n.config, {
@@ -11612,7 +11612,7 @@ class J2 {
11612
11612
  if (B2(o, e)) {
11613
11613
  s.$shared = !1, i = li(i) ? i() : i;
11614
11614
  const c = this.createResolver(t, i, a);
11615
- l = Tr(o, i, c);
11615
+ l = zr(o, i, c);
11616
11616
  }
11617
11617
  for (const c of e)
11618
11618
  s[c] = l[c];
@@ -11622,7 +11622,7 @@ class J2 {
11622
11622
  ""
11623
11623
  ], r) {
11624
11624
  const { resolver: s } = Eh(this._resolverCache, t, i);
11625
- return st(e) ? Tr(s, e, void 0, r) : s;
11625
+ return st(e) ? zr(s, e, void 0, r) : s;
11626
11626
  }
11627
11627
  }
11628
11628
  function Eh(n, t, e) {
@@ -12192,7 +12192,7 @@ function $h() {
12192
12192
  function eZ(n, t, e) {
12193
12193
  const { startAngle: i, pixelMargin: r, x: s, y: o, outerRadius: a, innerRadius: l } = t;
12194
12194
  let c = r / a;
12195
- n.beginPath(), n.arc(s, o, a, i - c, e + c), l > r ? (c = r / l, n.arc(s, o, l, e + c, i - c, !0)) : n.arc(s, o, r, e + Tt, i - Tt), n.closePath(), n.clip();
12195
+ n.beginPath(), n.arc(s, o, a, i - c, e + c), l > r ? (c = r / l, n.arc(s, o, l, e + c, i - c, !0)) : n.arc(s, o, r, e + zt, i - zt), n.closePath(), n.clip();
12196
12196
  }
12197
12197
  function nZ(n) {
12198
12198
  return vd(n, [
@@ -12233,22 +12233,22 @@ function Sa(n, t, e, i, r, s) {
12233
12233
  const rt = (V + Y) / 2;
12234
12234
  if (n.arc(o, a, u, V, rt), n.arc(o, a, u, rt, Y), k > 0) {
12235
12235
  const bt = pr(_, Y, o, a);
12236
- n.arc(bt.x, bt.y, k, Y, x + Tt);
12236
+ n.arc(bt.x, bt.y, k, Y, x + zt);
12237
12237
  }
12238
12238
  const ut = pr(H, x, o, a);
12239
12239
  if (n.lineTo(ut.x, ut.y), S > 0) {
12240
12240
  const bt = pr(H, q, o, a);
12241
- n.arc(bt.x, bt.y, S, x + Tt, q + Math.PI);
12241
+ n.arc(bt.x, bt.y, S, x + zt, q + Math.PI);
12242
12242
  }
12243
12243
  const ft = (x - S / h + (y + X / h)) / 2;
12244
12244
  if (n.arc(o, a, h, x - S / h, ft, !0), n.arc(o, a, h, ft, y + X / h, !0), X > 0) {
12245
12245
  const bt = pr(K, ot, o, a);
12246
- n.arc(bt.x, bt.y, X, ot + Math.PI, y - Tt);
12246
+ n.arc(bt.x, bt.y, X, ot + Math.PI, y - zt);
12247
12247
  }
12248
12248
  const Rt = pr(G, y, o, a);
12249
12249
  if (n.lineTo(Rt.x, Rt.y), w > 0) {
12250
12250
  const bt = pr(G, V, o, a);
12251
- n.arc(bt.x, bt.y, w, y - Tt, V);
12251
+ n.arc(bt.x, bt.y, w, y - zt, V);
12252
12252
  }
12253
12253
  } else {
12254
12254
  n.moveTo(o, a);
@@ -12449,7 +12449,7 @@ class Bn extends pn {
12449
12449
  return i && e[t[i - 1].end];
12450
12450
  }
12451
12451
  interpolate(t, e) {
12452
- const i = this.options, r = t[e], s = this.points, o = Tm(this, {
12452
+ const i = this.options, r = t[e], s = this.points, o = zm(this, {
12453
12453
  property: e,
12454
12454
  start: r,
12455
12455
  end: r
@@ -12914,9 +12914,9 @@ function VZ(n, t, e) {
12914
12914
  });
12915
12915
  continue;
12916
12916
  }
12917
- const u = Tm(t, d);
12917
+ const u = zm(t, d);
12918
12918
  for (const h of u) {
12919
- const f = Sc(e, s[h.start], s[h.end], h.loop), p = zm(a, r, f);
12919
+ const f = Sc(e, s[h.start], s[h.end], h.loop), p = Tm(a, r, f);
12920
12920
  for (const b of p)
12921
12921
  o.push({
12922
12922
  source: b,
@@ -13022,11 +13022,11 @@ function CZ(n, t, e) {
13022
13022
  function NZ(n, t, e, i) {
13023
13023
  return (n === "-" || n === "+") && (e = t + e), e === t || e < 0 || e >= i ? !1 : e;
13024
13024
  }
13025
- function zZ(n, t) {
13025
+ function TZ(n, t) {
13026
13026
  let e = null;
13027
13027
  return n === "start" ? e = t.bottom : n === "end" ? e = t.top : st(n) ? e = t.getPixelForValue(n.value) : t.getBasePixel && (e = t.getBasePixel()), e;
13028
13028
  }
13029
- function TZ(n, t, e) {
13029
+ function zZ(n, t, e) {
13030
13030
  let i;
13031
13031
  return n === "start" ? i = e : n === "end" ? i = t.options.reverse ? t.min : t.max : st(n) ? i = n.value : i = t.getBaseValue(), i;
13032
13032
  }
@@ -13132,7 +13132,7 @@ function JZ(n) {
13132
13132
  return (n.scale || {}).getPointPositionForValue ? BZ(n) : EZ(n);
13133
13133
  }
13134
13134
  function EZ(n) {
13135
- const { scale: t = {}, fill: e } = n, i = zZ(e, t);
13135
+ const { scale: t = {}, fill: e } = n, i = TZ(e, t);
13136
13136
  if (It(i)) {
13137
13137
  const r = t.isHorizontal();
13138
13138
  return {
@@ -13143,7 +13143,7 @@ function EZ(n) {
13143
13143
  return null;
13144
13144
  }
13145
13145
  function BZ(n) {
13146
- const { scale: t, fill: e } = n, i = t.options, r = t.getLabels().length, s = i.reverse ? t.max : t.min, o = TZ(e, t, s), a = [];
13146
+ const { scale: t, fill: e } = n, i = t.options, r = t.getLabels().length, s = i.reverse ? t.max : t.min, o = zZ(e, t, s), a = [];
13147
13147
  if (i.grid.circular) {
13148
13148
  const l = t.getPointPositionForValue(0, s);
13149
13149
  return new rb({
@@ -13421,7 +13421,7 @@ class df extends pn {
13421
13421
  }), Cm(this.ctx, t.textDirection);
13422
13422
  }
13423
13423
  drawTitle() {
13424
- const t = this.options, e = t.title, i = Pt(e.font), r = Qt(e.padding);
13424
+ const t = this.options, e = t.title, i = Pt(e.font), r = $t(e.padding);
13425
13425
  if (!e.display)
13426
13426
  return;
13427
13427
  const s = _r(t.rtl, this.left, this.width), o = this.ctx, a = e.position, l = i.size / 2, c = r.top + l;
@@ -13436,7 +13436,7 @@ class df extends pn {
13436
13436
  o.textAlign = s.textAlign(gd(a)), o.textBaseline = "middle", o.strokeStyle = e.color, o.fillStyle = e.color, o.font = i.string, Ui(o, e.text, f, d, i);
13437
13437
  }
13438
13438
  _computeTitleHeight() {
13439
- const t = this.options.title, e = Pt(t.font), i = Qt(t.padding);
13439
+ const t = this.options.title, e = Pt(t.font), i = $t(t.padding);
13440
13440
  return t.display ? e.lineHeight + i.height : 0;
13441
13441
  }
13442
13442
  _getLegendItemAt(t, e) {
@@ -13538,7 +13538,7 @@ var iw = {
13538
13538
  generateLabels(n) {
13539
13539
  const t = n.data.datasets, { labels: { usePointStyle: e, pointStyle: i, textAlign: r, color: s, useBorderRadius: o, borderRadius: a } } = n.legend.options;
13540
13540
  return n._getSortedDatasetMetas().map((l) => {
13541
- const c = l.controller.getStyle(e ? 0 : void 0), d = Qt(c.borderWidth);
13541
+ const c = l.controller.getStyle(e ? 0 : void 0), d = $t(c.borderWidth);
13542
13542
  return {
13543
13543
  text: t[l.index].label,
13544
13544
  fillStyle: c.backgroundColor,
@@ -13589,7 +13589,7 @@ class Sd extends pn {
13589
13589
  }
13590
13590
  this.width = this.right = t, this.height = this.bottom = e;
13591
13591
  const r = Wt(i.text) ? i.text.length : 1;
13592
- this._padding = Qt(i.padding);
13592
+ this._padding = $t(i.padding);
13593
13593
  const s = r * Pt(i.font).lineHeight + this._padding.height;
13594
13594
  this.isHorizontal() ? this.height = s : this.width = s;
13595
13595
  }
@@ -13667,7 +13667,7 @@ var sw = {
13667
13667
  _indexable: !1
13668
13668
  }
13669
13669
  };
13670
- const zo = /* @__PURE__ */ new WeakMap();
13670
+ const To = /* @__PURE__ */ new WeakMap();
13671
13671
  var ow = {
13672
13672
  id: "subtitle",
13673
13673
  start(n, t, e) {
@@ -13676,13 +13676,13 @@ var ow = {
13676
13676
  options: e,
13677
13677
  chart: n
13678
13678
  });
13679
- Bt.configure(n, i, e), Bt.addBox(n, i), zo.set(n, i);
13679
+ Bt.configure(n, i, e), Bt.addBox(n, i), To.set(n, i);
13680
13680
  },
13681
13681
  stop(n) {
13682
- Bt.removeBox(n, zo.get(n)), zo.delete(n);
13682
+ Bt.removeBox(n, To.get(n)), To.delete(n);
13683
13683
  },
13684
13684
  beforeUpdate(n, t, e) {
13685
- const i = zo.get(n);
13685
+ const i = To.get(n);
13686
13686
  Bt.configure(n, i, e), i.options = e;
13687
13687
  },
13688
13688
  defaults: {
@@ -13768,7 +13768,7 @@ function aw(n, t) {
13768
13768
  };
13769
13769
  }
13770
13770
  function uf(n, t) {
13771
- const e = n.chart.ctx, { body: i, footer: r, title: s } = n, { boxWidth: o, boxHeight: a } = t, l = Pt(t.bodyFont), c = Pt(t.titleFont), d = Pt(t.footerFont), u = s.length, h = r.length, f = i.length, p = Qt(t.padding);
13771
+ const e = n.chart.ctx, { body: i, footer: r, title: s } = n, { boxWidth: o, boxHeight: a } = t, l = Pt(t.bodyFont), c = Pt(t.titleFont), d = Pt(t.footerFont), u = s.length, h = r.length, f = i.length, p = $t(t.padding);
13772
13772
  let b = p.height, g = 0, y = i.reduce((k, X) => k + X.before.length + X.lines.length + X.after.length, 0);
13773
13773
  if (y += n.beforeBody.length + n.afterBody.length, u && (b += u * c.lineHeight + (u - 1) * t.titleSpacing + t.titleMarginBottom), y) {
13774
13774
  const k = t.displayColors ? Math.max(a, l.lineHeight) : l.lineHeight;
@@ -13824,8 +13824,8 @@ function ff(n, t, e, i) {
13824
13824
  y: Kt(b, 0, i.height - t.height)
13825
13825
  };
13826
13826
  }
13827
- function To(n, t, e) {
13828
- const i = Qt(e.padding);
13827
+ function zo(n, t, e) {
13828
+ const i = $t(e.padding);
13829
13829
  return t === "center" ? n.x + n.width / 2 : t === "right" ? n.x + n.width - i.right : n.x + i.left;
13830
13830
  }
13831
13831
  function pf(n) {
@@ -14001,12 +14001,12 @@ let bf = (nc = class extends pn {
14001
14001
  let o, a, l;
14002
14002
  if (s) {
14003
14003
  const c = _r(i.rtl, this.x, this.width);
14004
- for (t.x = To(this, i.titleAlign, i), e.textAlign = c.textAlign(i.titleAlign), e.textBaseline = "middle", o = Pt(i.titleFont), a = i.titleSpacing, e.fillStyle = i.titleColor, e.font = o.string, l = 0; l < s; ++l)
14004
+ for (t.x = zo(this, i.titleAlign, i), e.textAlign = c.textAlign(i.titleAlign), e.textBaseline = "middle", o = Pt(i.titleFont), a = i.titleSpacing, e.fillStyle = i.titleColor, e.font = o.string, l = 0; l < s; ++l)
14005
14005
  e.fillText(r[l], c.x(t.x), t.y + o.lineHeight / 2), t.y += o.lineHeight + a, l + 1 === s && (t.y += i.titleMarginBottom - a);
14006
14006
  }
14007
14007
  }
14008
14008
  _drawColorBox(t, e, i, r, s) {
14009
- const o = this.labelColors[i], a = this.labelPointStyles[i], { boxHeight: l, boxWidth: c } = s, d = Pt(s.bodyFont), u = To(this, "left", s), h = r.x(u), f = l < d.lineHeight ? (d.lineHeight - l) / 2 : 0, p = e.y + f;
14009
+ const o = this.labelColors[i], a = this.labelPointStyles[i], { boxHeight: l, boxWidth: c } = s, d = Pt(s.bodyFont), u = zo(this, "left", s), h = r.x(u), f = l < d.lineHeight ? (d.lineHeight - l) / 2 : 0, p = e.y + f;
14010
14010
  if (s.usePointStyle) {
14011
14011
  const b = {
14012
14012
  radius: Math.min(c, l) / 2,
@@ -14041,7 +14041,7 @@ let bf = (nc = class extends pn {
14041
14041
  e.fillText(_, p.x(t.x + f), t.y + h / 2), t.y += h + s;
14042
14042
  }, g = p.textAlign(o);
14043
14043
  let y, x, w, k, X, S, G;
14044
- for (e.textAlign = o, e.textBaseline = "middle", e.font = u.string, t.x = To(this, g, i), e.fillStyle = i.bodyColor, mt(this.beforeBody, b), f = a && g !== "right" ? o === "center" ? c / 2 + d : c + 2 + d : 0, k = 0, S = r.length; k < S; ++k) {
14044
+ for (e.textAlign = o, e.textBaseline = "middle", e.font = u.string, t.x = zo(this, g, i), e.fillStyle = i.bodyColor, mt(this.beforeBody, b), f = a && g !== "right" ? o === "center" ? c / 2 + d : c + 2 + d : 0, k = 0, S = r.length; k < S; ++k) {
14045
14045
  for (y = r[k], x = this.labelTextColors[k], e.fillStyle = x, mt(y.before, b), w = y.lines, a && w.length && (this._drawColorBox(e, t, k, p, i), h = Math.max(u.lineHeight, l)), X = 0, G = w.length; X < G; ++X)
14046
14046
  b(w[X]), h = u.lineHeight;
14047
14047
  mt(y.after, b);
@@ -14053,7 +14053,7 @@ let bf = (nc = class extends pn {
14053
14053
  let o, a;
14054
14054
  if (s) {
14055
14055
  const l = _r(i.rtl, this.x, this.width);
14056
- for (t.x = To(this, i.footerAlign, i), t.y += i.footerMarginTop, e.textAlign = l.textAlign(i.footerAlign), e.textBaseline = "middle", o = Pt(i.footerFont), e.fillStyle = i.footerColor, e.font = o.string, a = 0; a < s; ++a)
14056
+ for (t.x = zo(this, i.footerAlign, i), t.y += i.footerMarginTop, e.textAlign = l.textAlign(i.footerAlign), e.textBaseline = "middle", o = Pt(i.footerFont), e.fillStyle = i.footerColor, e.font = o.string, a = 0; a < s; ++a)
14057
14057
  e.fillText(r[a], l.x(t.x), t.y + o.lineHeight / 2), t.y += o.lineHeight + i.footerSpacing;
14058
14058
  }
14059
14059
  }
@@ -14088,7 +14088,7 @@ let bf = (nc = class extends pn {
14088
14088
  y: this.y
14089
14089
  };
14090
14090
  i = Math.abs(i) < 1e-3 ? 0 : i;
14091
- const o = Qt(e.padding), a = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;
14091
+ const o = $t(e.padding), a = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;
14092
14092
  e.enabled && a && (t.save(), t.globalAlpha = i, this.drawBackground(s, t, r, e), Mm(t, e.textDirection), s.y += o.top, this.drawTitle(s, t, e), this.drawBody(s, t, e), this.drawFooter(s, t, e), Cm(t, e.textDirection), t.restore());
14093
14093
  }
14094
14094
  getActiveElements() {
@@ -14544,7 +14544,7 @@ M(Gc, "id", "logarithmic"), M(Gc, "defaults", {
14544
14544
  function Rc(n) {
14545
14545
  const t = n.ticks;
14546
14546
  if (t.display && n.display) {
14547
- const e = Qt(t.backdropPadding);
14547
+ const e = $t(t.backdropPadding);
14548
14548
  return A(t.font && t.font.size, St.font.size) + e.height;
14549
14549
  }
14550
14550
  return 0;
@@ -14592,7 +14592,7 @@ function kw(n, t, e, i, r) {
14592
14592
  i.start < t.l ? (a = (t.l - i.start) / s, n.l = Math.min(n.l, t.l - a)) : i.end > t.r && (a = (i.end - t.r) / s, n.r = Math.max(n.r, t.r + a)), r.start < t.t ? (l = (t.t - r.start) / o, n.t = Math.min(n.t, t.t - l)) : r.end > t.b && (l = (r.end - t.b) / o, n.b = Math.max(n.b, t.b + l));
14593
14593
  }
14594
14594
  function Xw(n, t, e) {
14595
- const i = n.drawingArea, { extra: r, additionalAngle: s, padding: o, size: a } = e, l = n.getPointPosition(t, i + r + o, s), c = Math.round(md(ge(l.angle + Tt))), d = Rw(l.y, a.h, c), u = Sw(c), h = Gw(l.x, a.w, u);
14595
+ const i = n.drawingArea, { extra: r, additionalAngle: s, padding: o, size: a } = e, l = n.getPointPosition(t, i + r + o, s), c = Math.round(md(ge(l.angle + zt))), d = Rw(l.y, a.h, c), u = Sw(c), h = Gw(l.x, a.w, u);
14596
14596
  return {
14597
14597
  visible: !0,
14598
14598
  x: l.x,
@@ -14647,7 +14647,7 @@ function Rw(n, t, e) {
14647
14647
  function Lw(n, t, e) {
14648
14648
  const { left: i, top: r, right: s, bottom: o } = e, { backdropColor: a } = t;
14649
14649
  if (!dt(a)) {
14650
- const l = Ni(t.borderRadius), c = Qt(t.backdropPadding);
14650
+ const l = Ni(t.borderRadius), c = $t(t.backdropPadding);
14651
14651
  n.fillStyle = a;
14652
14652
  const d = i - c.left, u = r - c.top, h = s - i + c.width, f = o - r + c.height;
14653
14653
  Object.values(l).some((p) => p !== 0) ? (n.beginPath(), $s(n, {
@@ -14702,7 +14702,7 @@ class yr extends Ga {
14702
14702
  super(t), this.xCenter = void 0, this.yCenter = void 0, this.drawingArea = void 0, this._pointLabels = [], this._pointLabelItems = [];
14703
14703
  }
14704
14704
  setDimensions() {
14705
- const t = this._padding = Qt(Rc(this.options) / 2), e = this.width = this.maxWidth - t.width, i = this.height = this.maxHeight - t.height;
14705
+ const t = this._padding = $t(Rc(this.options) / 2), e = this.width = this.maxWidth - t.width, i = this.height = this.maxHeight - t.height;
14706
14706
  this.xCenter = Math.floor(this.left + e / 2 + t.left), this.yCenter = Math.floor(this.top + i / 2 + t.top), this.drawingArea = Math.floor(Math.min(e, i) / 2);
14707
14707
  }
14708
14708
  determineDataLimits() {
@@ -14752,7 +14752,7 @@ class yr extends Ga {
14752
14752
  }
14753
14753
  }
14754
14754
  getPointPosition(t, e, i = 0) {
14755
- const r = this.getIndexAngle(t) - Tt + i;
14755
+ const r = this.getIndexAngle(t) - zt + i;
14756
14756
  return {
14757
14757
  x: Math.cos(r) * e + this.xCenter,
14758
14758
  y: Math.sin(r) * e + this.yCenter,
@@ -14812,7 +14812,7 @@ class yr extends Ga {
14812
14812
  const c = i.setContext(this.getContext(l)), d = Pt(c.font);
14813
14813
  if (s = this.getDistanceFromCenterForValue(this.ticks[l].value), c.showLabelBackdrop) {
14814
14814
  t.font = d.string, o = t.measureText(a.label).width, t.fillStyle = c.backdropColor;
14815
- const u = Qt(c.backdropPadding);
14815
+ const u = $t(c.backdropPadding);
14816
14816
  t.fillRect(-o / 2 - u.left, -s - d.size / 2 - u.top, o + u.width, d.size + u.height);
14817
14817
  }
14818
14818
  Ui(t, a.label, 0, -s, d, {
@@ -14919,7 +14919,7 @@ function kf(n, t) {
14919
14919
  return null;
14920
14920
  const e = n._adapter, { parser: i, round: r, isoWeekday: s } = n._parseOpts;
14921
14921
  let o = t;
14922
- return typeof i == "function" && (o = i(o)), It(o) || (o = typeof i == "string" ? e.parse(o, i) : e.parse(o)), o === null ? null : (r && (o = r === "week" && (zr(s) || s === !0) ? e.startOf(o, "isoWeek", s) : e.startOf(o, r)), +o);
14922
+ return typeof i == "function" && (o = i(o)), It(o) || (o = typeof i == "string" ? e.parse(o, i) : e.parse(o)), o === null ? null : (r && (o = r === "week" && (Tr(s) || s === !0) ? e.startOf(o, "isoWeek", s) : e.startOf(o, r)), +o);
14923
14923
  }
14924
14924
  function Xf(n, t, e, i) {
14925
14925
  const r = le.length;
@@ -15030,7 +15030,7 @@ class no extends pi {
15030
15030
  };
15031
15031
  }
15032
15032
  _generate() {
15033
- const t = this._adapter, e = this.min, i = this.max, r = this.options, s = r.time, o = s.unit || Xf(s.minUnit, e, i, this._getLabelCapacity(e)), a = A(r.ticks.stepSize, 1), l = o === "week" ? s.isoWeekday : !1, c = zr(l) || l === !0, d = {};
15033
+ const t = this._adapter, e = this.min, i = this.max, r = this.options, s = r.time, o = s.unit || Xf(s.minUnit, e, i, this._getLabelCapacity(e)), a = A(r.ticks.stepSize, 1), l = o === "week" ? s.isoWeekday : !1, c = Tr(l) || l === !0, d = {};
15034
15034
  let u = e, h, f;
15035
15035
  if (c && (u = +t.startOf(u, "isoWeek", l)), u = +t.startOf(u, c ? "day" : o), t.diff(i, e, o) > 1e5 * a)
15036
15036
  throw new Error(e + " and " + i + " are too far apart with stepSize of " + a + " " + o);
@@ -15189,7 +15189,7 @@ class Lc extends no {
15189
15189
  }
15190
15190
  }
15191
15191
  M(Lc, "id", "timeseries"), M(Lc, "defaults", no.defaults);
15192
- var zw = /* @__PURE__ */ Object.freeze({
15192
+ var Tw = /* @__PURE__ */ Object.freeze({
15193
15193
  __proto__: null,
15194
15194
  CategoryScale: to,
15195
15195
  LinearScale: Ai,
@@ -15202,10 +15202,10 @@ const ir = [
15202
15202
  K1,
15203
15203
  xZ,
15204
15204
  pw,
15205
- zw
15205
+ Tw
15206
15206
  ], cb = 1e-10;
15207
15207
  function el(n, t) {
15208
- const e = Fw(n), i = e.filter((a) => Tw(a, n));
15208
+ const e = Fw(n), i = e.filter((a) => zw(a, n));
15209
15209
  let r = 0, s = 0;
15210
15210
  const o = [];
15211
15211
  if (i.length > 1) {
@@ -15256,7 +15256,7 @@ function el(n, t) {
15256
15256
  }
15257
15257
  return s /= 2, t && (t.area = r + s, t.arcArea = r, t.polygonArea = s, t.arcs = o, t.innerPoints = i, t.intersectionPoints = e), r + s;
15258
15258
  }
15259
- function Tw(n, t) {
15259
+ function zw(n, t) {
15260
15260
  return t.every((e) => ue(n, e) < e.radius + cb);
15261
15261
  }
15262
15262
  function Fw(n) {
@@ -15972,11 +15972,11 @@ function lk(n, t) {
15972
15972
  function ck(n, t) {
15973
15973
  return lk(n.cx - t.cx, n.cy - t.cy);
15974
15974
  }
15975
- const zc = 1 / 180 * Math.PI;
15975
+ const Tc = 1 / 180 * Math.PI;
15976
15976
  function dk(n, t, e, i) {
15977
15977
  return {
15978
- x: n + Math.cos(i * zc) * e,
15979
- y: t + Math.sin(i * zc) * e
15978
+ x: n + Math.cos(i * Tc) * e,
15979
+ y: t + Math.sin(i * Tc) * e
15980
15980
  };
15981
15981
  }
15982
15982
  class rr extends pn {
@@ -15985,7 +15985,7 @@ class rr extends pn {
15985
15985
  const r = this.getProps(["arcs", "refs", "sets"]), s = new Set(r.sets);
15986
15986
  function o(l, c, d) {
15987
15987
  if (An(c)) {
15988
- const u = c.rotation * zc, h = l.cx - c.cx, f = l.cy - c.cy, p = (h * Math.cos(u) + f * Math.sin(u)) ** 2 / c.rx ** 2 + (h * Math.sin(u) - f * Math.cos(u)) ** 2 / c.ry ** 2;
15988
+ const u = c.rotation * Tc, h = l.cx - c.cx, f = l.cy - c.cy, p = (h * Math.cos(u) + f * Math.sin(u)) ** 2 / c.rx ** 2 + (h * Math.sin(u) - f * Math.cos(u)) ** 2 / c.ry ** 2;
15989
15989
  if (d && p > 1 || !d && p < 1)
15990
15990
  return !1;
15991
15991
  } else {
@@ -18704,7 +18704,7 @@ class Nk extends Vt {
18704
18704
  }
18705
18705
  }
18706
18706
  Nk.id = mi.id;
18707
- function zk(n) {
18707
+ function Tk(n) {
18708
18708
  const t = n.reduce((i, r) => i + r.x, 0), e = n.reduce((i, r) => i + r.y, 0);
18709
18709
  return {
18710
18710
  x: t / n.length,
@@ -18722,7 +18722,7 @@ function Gf(n, t, e) {
18722
18722
  }).join(`
18723
18723
  `);
18724
18724
  }
18725
- function Tk(n, t) {
18725
+ function zk(n, t) {
18726
18726
  const e = n.x - t.x, i = n.y - t.y;
18727
18727
  return Math.atan2(i, e) / Math.PI * 180;
18728
18728
  }
@@ -18731,8 +18731,8 @@ function Fk(n, t) {
18731
18731
  width: t.width,
18732
18732
  height: t.height,
18733
18733
  distinct: !0
18734
- }), i = e.filter((c) => c.data.sets.length === 1), r = i.map((c) => c.data.sets[0]), s = i.map((c) => c.circles[0]), o = zk(i.map((c) => c.circles[0])), a = i.map((c) => {
18735
- const d = c.circles[0], u = Tk(d, o);
18734
+ }), i = e.filter((c) => c.data.sets.length === 1), r = i.map((c) => c.data.sets[0]), s = i.map((c) => c.circles[0]), o = Tk(i.map((c) => c.circles[0])), a = i.map((c) => {
18735
+ const d = c.circles[0], u = zk(d, o);
18736
18736
  return {
18737
18737
  cx: d.x + t.x,
18738
18738
  cy: d.y + t.y,
@@ -18841,7 +18841,7 @@ function Pk(n, t = {}) {
18841
18841
  }
18842
18842
  const sr = ({ configuration: n }) => {
18843
18843
  const t = Mt(null), e = Mt(null);
18844
- return ie(() => {
18844
+ return Qt(() => {
18845
18845
  if (t.current === null)
18846
18846
  return;
18847
18847
  const i = t.current.getContext("2d");
@@ -18877,7 +18877,7 @@ const Dk = ({
18877
18877
  ),
18878
18878
  [n, t]
18879
18879
  );
18880
- ie(() => {
18880
+ Qt(() => {
18881
18881
  if (e.current === null)
18882
18882
  return;
18883
18883
  if (r === null) {
@@ -19035,7 +19035,7 @@ class Sr extends Error {
19035
19035
  const Uk = ({ error: n, resetError: t, layout: e }) => {
19036
19036
  console.error(n);
19037
19037
  const i = Mt(null), r = Mt(null);
19038
- ie(() => {
19038
+ Qt(() => {
19039
19039
  var a;
19040
19040
  (a = i.current) == null || a.dispatchEvent(new Bk(n));
19041
19041
  });
@@ -19136,7 +19136,7 @@ function $k(n) {
19136
19136
  }
19137
19137
  function qk() {
19138
19138
  const [n, t] = it(document.fullscreenElement !== null);
19139
- return ie(() => {
19139
+ return Qt(() => {
19140
19140
  const e = () => {
19141
19141
  t(document.fullscreenElement !== null);
19142
19142
  };
@@ -19277,9 +19277,9 @@ function rX(n, t, e) {
19277
19277
  }
19278
19278
  function sX(n) {
19279
19279
  const t = Ya(n);
19280
- return [Tc(n), t, Tc(t)];
19280
+ return [zc(n), t, zc(t)];
19281
19281
  }
19282
- function Tc(n) {
19282
+ function zc(n) {
19283
19283
  return n.replace(/start|end/g, (t) => iX[t]);
19284
19284
  }
19285
19285
  function oX(n, t, e) {
@@ -19298,7 +19298,7 @@ function oX(n, t, e) {
19298
19298
  function aX(n, t, e, i) {
19299
19299
  const r = ol(n);
19300
19300
  let s = oX($i(n), e === "start", i);
19301
- return r && (s = s.map((o) => o + "-" + r), t && (s = s.concat(s.map(Tc)))), s;
19301
+ return r && (s = s.map((o) => o + "-" + r), t && (s = s.concat(s.map(zc)))), s;
19302
19302
  }
19303
19303
  function Ya(n) {
19304
19304
  return n.replace(/left|right|bottom|top/g, (t) => nX[t]);
@@ -20160,9 +20160,9 @@ const IX = fX, MX = pX, CX = uX, NX = (n, t, e) => {
20160
20160
  platform: s
20161
20161
  });
20162
20162
  };
20163
- function zX(n, t, e, i) {
20163
+ function TX(n, t, e, i) {
20164
20164
  const r = Mt(null);
20165
- ie(() => {
20165
+ Qt(() => {
20166
20166
  if (!n.current || !t.current)
20167
20167
  return;
20168
20168
  const { current: s } = n, { current: o } = t, a = () => {
@@ -20178,8 +20178,8 @@ function zX(n, t, e, i) {
20178
20178
  };
20179
20179
  }, [i, e, n, t]);
20180
20180
  }
20181
- function TX(n, t, e) {
20182
- ie(() => {
20181
+ function zX(n, t, e) {
20182
+ Qt(() => {
20183
20183
  const i = (r) => {
20184
20184
  const s = r.composedPath();
20185
20185
  n.current && !s.includes(n.current) && t.current && !s.includes(t.current) && e(!1);
@@ -20190,7 +20190,7 @@ function TX(n, t, e) {
20190
20190
  }, [n, t, e]);
20191
20191
  }
20192
20192
  function FX(n) {
20193
- ie(() => {
20193
+ Qt(() => {
20194
20194
  const t = (e) => {
20195
20195
  e.key === "Escape" && n(!1);
20196
20196
  };
@@ -20201,7 +20201,7 @@ function FX(n) {
20201
20201
  }
20202
20202
  const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md", Id = ({ children: n, buttonTitle: t, placement: e }) => {
20203
20203
  const [i, r] = it(!1), s = Mt(null), o = Mt(null);
20204
- return zX(s, o, [IX(4), MX(), CX()], e), TX(o, s, r), FX(r), /* @__PURE__ */ m(Gt, { children: [
20204
+ return TX(s, o, [IX(4), MX(), CX()], e), zX(o, s, r), FX(r), /* @__PURE__ */ m(Gt, { children: [
20205
20205
  /* @__PURE__ */ m("button", { type: "button", className: "btn btn-xs whitespace-nowrap w-full", onClick: () => {
20206
20206
  r(!i);
20207
20207
  }, ref: s, children: t }),
@@ -20332,7 +20332,7 @@ const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
20332
20332
  indicateError: e = !1
20333
20333
  }) => {
20334
20334
  const [i, r] = it(n);
20335
- ie(() => {
20335
+ Qt(() => {
20336
20336
  r(n);
20337
20337
  }, [n]);
20338
20338
  const s = (a) => {
@@ -20360,7 +20360,7 @@ const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
20360
20360
  };
20361
20361
  function Nf(n, t, e) {
20362
20362
  const i = Mt(!1);
20363
- ie(() => {
20363
+ Qt(() => {
20364
20364
  if (!i.current) {
20365
20365
  i.current = !0;
20366
20366
  return;
@@ -20451,7 +20451,7 @@ const DX = ({
20451
20451
  const e = "All segments", i = t.join(", ");
20452
20452
  return e.length >= i.length ? i : `${t.length} ${t.length === 1 ? "segment" : "segments"}`;
20453
20453
  };
20454
- function zd(n) {
20454
+ function Td(n) {
20455
20455
  const t = Ct(Ur), e = uy(t, n).map((i) => ({
20456
20456
  segment: i,
20457
20457
  label: i,
@@ -20466,7 +20466,7 @@ const lr = ({ tabs: n, toolbar: t }) => {
20466
20466
  s(`${d}px`);
20467
20467
  }
20468
20468
  };
20469
- ie(() => (a(), window.addEventListener("resize", a), () => {
20469
+ Qt(() => (a(), window.addEventListener("resize", a), () => {
20470
20470
  window.removeEventListener("resize", a);
20471
20471
  }), []);
20472
20472
  const l = /* @__PURE__ */ m("div", { className: "flex flex-row", children: n.map((d) => /* @__PURE__ */ m(Gt, { children: /* @__PURE__ */ m(
@@ -20496,7 +20496,7 @@ const lr = ({ tabs: n, toolbar: t }) => {
20496
20496
  };
20497
20497
  function Nn(n, t) {
20498
20498
  const [e, i] = it(null), [r, s] = it(null), [o, a] = it(!0);
20499
- return ie(() => {
20499
+ return Qt(() => {
20500
20500
  (async () => {
20501
20501
  a(!0);
20502
20502
  try {
@@ -20524,7 +20524,7 @@ const KX = (n) => {
20524
20524
  const [e, i] = it({ min: 0.5, max: 1 }), [r, s] = it([
20525
20525
  { label: "Substitutions", checked: !0, type: "substitution" },
20526
20526
  { label: "Deletions", checked: !0, type: "deletion" }
20527
- ]), [o, a] = zd(t.sequenceType), l = Oe(
20527
+ ]), [o, a] = Td(t.sequenceType), l = Oe(
20528
20528
  () => jk(n, o, r),
20529
20529
  [n, o, r]
20530
20530
  ), c = (u) => {
@@ -20603,7 +20603,7 @@ const KX = (n) => {
20603
20603
  Qi,
20604
20604
  {
20605
20605
  className: "mx-1 btn btn-xs",
20606
- getData: () => Tp({ content: r }, s),
20606
+ getData: () => zp({ content: r }, s),
20607
20607
  filename: "mutation_comparison.csv"
20608
20608
  }
20609
20609
  ),
@@ -20622,7 +20622,7 @@ var $X = Object.defineProperty, Ib = (n, t, e, i) => {
20622
20622
  (o = n[s]) && (r = o(t, e, r) || r);
20623
20623
  return r && $X(t, e, r), r;
20624
20624
  };
20625
- const qX = Ta(QX), t_ = Ta(AX), Ad = class Ad extends Li {
20625
+ const qX = za(QX), t_ = za(AX), Ad = class Ad extends Li {
20626
20626
  constructor() {
20627
20627
  super(...arguments), this.lapis = "", this.referenceGenome = {
20628
20628
  nucleotideSequences: [],
@@ -20642,7 +20642,7 @@ Ib([
20642
20642
  Ib([
20643
20643
  np({ context: up, subscribe: !0 })
20644
20644
  ], Ye.prototype, "referenceGenome");
20645
- const e_ = Ta(UX), Qd = class Qd extends Ye {
20645
+ const e_ = za(UX), Qd = class Qd extends Ye {
20646
20646
  };
20647
20647
  Qd.styles = [...Ye.styles, e_];
20648
20648
  let di = Qd;
@@ -20705,8 +20705,8 @@ function Cb(n, t) {
20705
20705
  proportion: i.proportion
20706
20706
  }));
20707
20707
  }
20708
- const zf = /(?:([A-Za-z0-9]+):)?(\d+)$/, Nb = (n, t) => {
20709
- const e = n.match(zf), i = t.match(zf);
20708
+ const Tf = /(?:([A-Za-z0-9]+):)?(\d+)$/, Nb = (n, t) => {
20709
+ const e = n.match(Tf), i = t.match(Tf);
20710
20710
  if (e && i)
20711
20711
  return e[1] !== i[1] ? e[1].localeCompare(i[1]) : parseInt(e[2], 10) - parseInt(i[2], 10);
20712
20712
  throw new Error(`Invalid mutation position: ${n} or ${t}`);
@@ -20866,7 +20866,7 @@ const m_ = (n) => {
20866
20866
  throw s;
20867
20867
  return r === null ? /* @__PURE__ */ m(we, {}) : /* @__PURE__ */ m(g_, { mutationsData: r, originalComponentProps: n });
20868
20868
  }, g_ = ({ mutationsData: n, originalComponentProps: t }) => {
20869
- const [e, i] = it({ min: 0.05, max: 1 }), [r, s] = zd(t.sequenceType), [o, a] = it([
20869
+ const [e, i] = it({ min: 0.05, max: 1 }), [r, s] = Td(t.sequenceType), [o, a] = it([
20870
20870
  { label: "Substitutions", checked: !0, type: "substitution" },
20871
20871
  { label: "Deletions", checked: !0, type: "deletion" }
20872
20872
  ]), l = p_(n, r, o), c = (h) => {
@@ -21044,7 +21044,7 @@ dr([
21044
21044
  hi = dr([
21045
21045
  ke("gs-mutations")
21046
21046
  ], hi);
21047
- function zb(n, t) {
21047
+ function Tb(n, t) {
21048
21048
  return n[0].content.map((e, i) => {
21049
21049
  var s;
21050
21050
  const r = n.map((o) => ({
@@ -21064,10 +21064,10 @@ const dl = {
21064
21064
  errorBarWhiskerRatio: { v: [0.2, 0.25] },
21065
21065
  errorBarWhiskerSize: { v: [20, 24] },
21066
21066
  errorBarWhiskerColor: { v: ["#2c2c2c", "#1f1f1f"] }
21067
- }, Td = {
21067
+ }, zd = {
21068
21068
  _scriptable: !0,
21069
21069
  _indexable: (n) => n !== "v"
21070
- }, Tf = Object.keys(dl);
21070
+ }, zf = Object.keys(dl);
21071
21071
  function Fd(n, t) {
21072
21072
  const e = Array.isArray(n) ? n : [n], i = Array.isArray(t) ? t : [t];
21073
21073
  if (e.length === i.length)
@@ -21101,7 +21101,7 @@ function k_(n, t, e, i, r) {
21101
21101
  r.lineWidth = ce(i.errorBarLineWidth, c), r.strokeStyle = ce(i.errorBarColor, c), r.beginPath(), r.moveTo(o, 0), r.lineTo(a, 0), r.stroke(), r.lineWidth = ce(i.errorBarWhiskerLineWidth, c), r.strokeStyle = ce(i.errorBarWhiskerColor, c), r.beginPath(), r.moveTo(o, -d), r.lineTo(o, d), r.moveTo(a, -d), r.lineTo(a, d), r.stroke();
21102
21102
  }), r.restore();
21103
21103
  }
21104
- function Tb(n, t) {
21104
+ function zb(n, t) {
21105
21105
  var e, i, r, s;
21106
21106
  const o = n.getProps(["x", "y", "width", "height", "xMin", "xMax", "yMin", "yMax"]);
21107
21107
  (o.xMin != null || o.xMax != null) && k_(o, (e = o.xMin) !== null && e !== void 0 ? e : null, (i = o.xMax) !== null && i !== void 0 ? i : null, n.options, t), (o.yMin != null || o.yMax != null) && w_(o, (r = o.yMin) !== null && r !== void 0 ? r : null, (s = o.yMax) !== null && s !== void 0 ? s : null, n.options, t);
@@ -21125,22 +21125,22 @@ function __(n, t) {
21125
21125
  }
21126
21126
  class ur extends ei {
21127
21127
  draw(t) {
21128
- super.draw(t), Tb(this, t);
21128
+ super.draw(t), zb(this, t);
21129
21129
  }
21130
21130
  }
21131
21131
  ur.id = "barWithErrorBar";
21132
21132
  ur.defaults = { ...ei.defaults, ...dl };
21133
21133
  ur.defaultRoutes = ei.defaultRoutes;
21134
- ur.descriptors = Td;
21134
+ ur.descriptors = zd;
21135
21135
  class Ve extends Fi {
21136
21136
  draw(t, e) {
21137
- super.draw.call(this, t, e), Tb(this, t);
21137
+ super.draw.call(this, t, e), zb(this, t);
21138
21138
  }
21139
21139
  }
21140
21140
  Ve.id = "pointWithErrorBar";
21141
21141
  Ve.defaults = { ...Fi.defaults, ...dl };
21142
21142
  Ve.defaultRoutes = Fi.defaultRoutes;
21143
- Ve.descriptors = Td;
21143
+ Ve.descriptors = zd;
21144
21144
  class Ar extends En {
21145
21145
  draw(t) {
21146
21146
  super.draw(t), __(this, t);
@@ -21149,7 +21149,7 @@ class Ar extends En {
21149
21149
  Ar.id = "arcWithErrorBar";
21150
21150
  Ar.defaults = { ...En.defaults, ...dl };
21151
21151
  Ar.defaultRoutes = En.defaultRoutes;
21152
- Ar.descriptors = Td;
21152
+ Ar.descriptors = zd;
21153
21153
  const Hc = ["xMin", "xMax", "yMin", "yMax"];
21154
21154
  function Fb(n) {
21155
21155
  return n ? Hc.slice(0, 2) : Hc.slice(2);
@@ -21223,11 +21223,11 @@ const ul = {
21223
21223
  animations: {
21224
21224
  numberArray: {
21225
21225
  fn: L_,
21226
- properties: Hc.concat(Tf.filter((n) => !n.endsWith("Color")), ["rMin", "rMax"])
21226
+ properties: Hc.concat(zf.filter((n) => !n.endsWith("Color")), ["rMin", "rMax"])
21227
21227
  },
21228
21228
  colorArray: {
21229
21229
  fn: Y_,
21230
- properties: Tf.filter((n) => n.endsWith("Color"))
21230
+ properties: zf.filter((n) => n.endsWith("Color"))
21231
21231
  }
21232
21232
  }
21233
21233
  };
@@ -21376,7 +21376,7 @@ class I_ extends Vt {
21376
21376
  }
21377
21377
  }
21378
21378
  I_.id = Qr.id;
21379
- class $r extends Ti {
21379
+ class $r extends zi {
21380
21380
  getMinMax(t, e) {
21381
21381
  return hl(t, (i) => super.getMinMax(i, e));
21382
21382
  }
@@ -21408,14 +21408,14 @@ class $r extends Ti {
21408
21408
  }
21409
21409
  $r.id = "scatterWithErrorBars";
21410
21410
  $r.defaults = Ze({}, [
21411
- Ti.defaults,
21411
+ zi.defaults,
21412
21412
  ul,
21413
21413
  {
21414
21414
  dataElementType: Ve.id
21415
21415
  }
21416
21416
  ]);
21417
21417
  $r.overrides = Ze({}, [
21418
- Ti.overrides,
21418
+ zi.overrides,
21419
21419
  {
21420
21420
  plugins: {
21421
21421
  tooltip: {
@@ -21585,7 +21585,7 @@ const N_ = ({
21585
21585
  }));
21586
21586
  if (r.length === 0)
21587
21587
  return /* @__PURE__ */ m(we, {});
21588
- const s = r.map((l, c) => z_(l, c, e)), o = t !== "logit" ? ml(Ed(r), i == null ? void 0 : i[t]) : void 0, a = {
21588
+ const s = r.map((l, c) => T_(l, c, e)), o = t !== "logit" ? ml(Ed(r), i == null ? void 0 : i[t]) : void 0, a = {
21589
21589
  type: yi.id,
21590
21590
  data: {
21591
21591
  datasets: s
@@ -21605,13 +21605,13 @@ const N_ = ({
21605
21605
  }
21606
21606
  };
21607
21607
  return /* @__PURE__ */ m(sr, { configuration: a });
21608
- }, z_ = (n, t, e) => ({
21608
+ }, T_ = (n, t, e) => ({
21609
21609
  borderWidth: 1,
21610
21610
  label: n.displayName,
21611
21611
  backgroundColor: Ie(t, 0.3),
21612
21612
  borderColor: Ie(t),
21613
- data: n.content.map(T_(e))
21614
- }), T_ = (n) => (t) => {
21613
+ data: n.content.map(z_(e))
21614
+ }), z_ = (n) => (t) => {
21615
21615
  var i;
21616
21616
  const e = F_(t, n);
21617
21617
  return {
@@ -21647,7 +21647,7 @@ const N_ = ({
21647
21647
  return t;
21648
21648
  }
21649
21649
  };
21650
- var Jb = 60, Eb = Jb * 60, Bb = Eb * 24, P_ = Bb * 7, Or = 1e3, Bl = Jb * Or, Hf = Eb * Or, D_ = Bb * Or, O_ = P_ * Or, Dd = "millisecond", vr = "second", xr = "minute", Zr = "hour", Te = "day", _s = "week", ze = "month", Ub = "quarter", Xn = "year", wr = "date", Ab = "YYYY-MM-DDTHH:mm:ssZ", Pf = "Invalid Date", K_ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, j_ = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
21650
+ var Jb = 60, Eb = Jb * 60, Bb = Eb * 24, P_ = Bb * 7, Or = 1e3, Bl = Jb * Or, Hf = Eb * Or, D_ = Bb * Or, O_ = P_ * Or, Dd = "millisecond", vr = "second", xr = "minute", Zr = "hour", ze = "day", _s = "week", Te = "month", Ub = "quarter", Xn = "year", wr = "date", Ab = "YYYY-MM-DDTHH:mm:ssZ", Pf = "Invalid Date", K_ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, j_ = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
21651
21651
  const J_ = {
21652
21652
  name: "en",
21653
21653
  weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
@@ -21665,16 +21665,16 @@ var Oc = function(t, e, i) {
21665
21665
  return (e <= 0 ? "+" : "-") + Oc(r, 2, "0") + ":" + Oc(s, 2, "0");
21666
21666
  }, B_ = function n(t, e) {
21667
21667
  if (t.date() < e.date()) return -n(e, t);
21668
- var i = (e.year() - t.year()) * 12 + (e.month() - t.month()), r = t.clone().add(i, ze), s = e - r < 0, o = t.clone().add(i + (s ? -1 : 1), ze);
21668
+ var i = (e.year() - t.year()) * 12 + (e.month() - t.month()), r = t.clone().add(i, Te), s = e - r < 0, o = t.clone().add(i + (s ? -1 : 1), Te);
21669
21669
  return +(-(i + (e - r) / (s ? r - o : o - r)) || 0);
21670
21670
  }, U_ = function(t) {
21671
21671
  return t < 0 ? Math.ceil(t) || 0 : Math.floor(t);
21672
21672
  }, A_ = function(t) {
21673
21673
  var e = {
21674
- M: ze,
21674
+ M: Te,
21675
21675
  y: Xn,
21676
21676
  w: _s,
21677
- d: Te,
21677
+ d: ze,
21678
21678
  D: wr,
21679
21679
  h: Zr,
21680
21680
  m: xr,
@@ -21772,7 +21772,7 @@ var tW = function(t) {
21772
21772
  }, t.startOf = function(i, r) {
21773
21773
  var s = this, o = gt.u(r) ? !0 : r, a = gt.p(i), l = function(y, x) {
21774
21774
  var w = gt.w(s.$u ? Date.UTC(s.$y, x, y) : new Date(s.$y, x, y), s);
21775
- return o ? w : w.endOf(Te);
21775
+ return o ? w : w.endOf(ze);
21776
21776
  }, c = function(y, x) {
21777
21777
  var w = [0, 0, 0, 0], k = [23, 59, 59, 999];
21778
21778
  return gt.w(s.toDate()[y].apply(
@@ -21784,13 +21784,13 @@ var tW = function(t) {
21784
21784
  switch (a) {
21785
21785
  case Xn:
21786
21786
  return o ? l(1, 0) : l(31, 11);
21787
- case ze:
21787
+ case Te:
21788
21788
  return o ? l(1, u) : l(0, u + 1);
21789
21789
  case _s: {
21790
21790
  var p = this.$locale().weekStart || 0, b = (d < p ? d + 7 : d) - p;
21791
21791
  return l(o ? h - b : h + (6 - b), u);
21792
21792
  }
21793
- case Te:
21793
+ case ze:
21794
21794
  case wr:
21795
21795
  return c(f + "Hours", 0);
21796
21796
  case Zr:
@@ -21805,8 +21805,8 @@ var tW = function(t) {
21805
21805
  }, t.endOf = function(i) {
21806
21806
  return this.startOf(i, !1);
21807
21807
  }, t.$set = function(i, r) {
21808
- var s, o = gt.p(i), a = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[Te] = a + "Date", s[wr] = a + "Date", s[ze] = a + "Month", s[Xn] = a + "FullYear", s[Zr] = a + "Hours", s[xr] = a + "Minutes", s[vr] = a + "Seconds", s[Dd] = a + "Milliseconds", s)[o], c = o === Te ? this.$D + (r - this.$W) : r;
21809
- if (o === ze || o === Xn) {
21808
+ var s, o = gt.p(i), a = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[ze] = a + "Date", s[wr] = a + "Date", s[Te] = a + "Month", s[Xn] = a + "FullYear", s[Zr] = a + "Hours", s[xr] = a + "Minutes", s[vr] = a + "Seconds", s[Dd] = a + "Milliseconds", s)[o], c = o === ze ? this.$D + (r - this.$W) : r;
21809
+ if (o === Te || o === Xn) {
21810
21810
  var d = this.clone().set(wr, 1);
21811
21811
  d.$d[l](c), d.init(), this.$d = d.set(wr, Math.min(this.$D, d.daysInMonth())).$d;
21812
21812
  } else l && this.$d[l](c);
@@ -21822,11 +21822,11 @@ var tW = function(t) {
21822
21822
  var f = kt(s);
21823
21823
  return gt.w(f.date(f.date() + Math.round(h * i)), s);
21824
21824
  };
21825
- if (a === ze)
21826
- return this.set(ze, this.$M + i);
21825
+ if (a === Te)
21826
+ return this.set(Te, this.$M + i);
21827
21827
  if (a === Xn)
21828
21828
  return this.set(Xn, this.$y + i);
21829
- if (a === Te)
21829
+ if (a === ze)
21830
21830
  return l(1);
21831
21831
  if (a === _s)
21832
21832
  return l(7);
@@ -21910,7 +21910,7 @@ var tW = function(t) {
21910
21910
  case Xn:
21911
21911
  h = u() / 12;
21912
21912
  break;
21913
- case ze:
21913
+ case Te:
21914
21914
  h = u();
21915
21915
  break;
21916
21916
  case Ub:
@@ -21919,7 +21919,7 @@ var tW = function(t) {
21919
21919
  case _s:
21920
21920
  h = (d - c) / O_;
21921
21921
  break;
21922
- case Te:
21922
+ case ze:
21923
21923
  h = (d - c) / D_;
21924
21924
  break;
21925
21925
  case Zr:
@@ -21937,7 +21937,7 @@ var tW = function(t) {
21937
21937
  }
21938
21938
  return s ? h : gt.a(h);
21939
21939
  }, t.daysInMonth = function() {
21940
- return this.endOf(ze).$D;
21940
+ return this.endOf(Te).$D;
21941
21941
  }, t.$locale = function() {
21942
21942
  return Pi[this.$L];
21943
21943
  }, t.locale = function(i, r) {
@@ -21957,7 +21957,7 @@ var tW = function(t) {
21957
21957
  }, n;
21958
21958
  }(), $b = bl.prototype;
21959
21959
  kt.prototype = $b;
21960
- [["$ms", Dd], ["$s", vr], ["$m", xr], ["$H", Zr], ["$W", Te], ["$M", ze], ["$y", Xn], ["$D", wr]].forEach(function(n) {
21960
+ [["$ms", Dd], ["$s", vr], ["$m", xr], ["$H", Zr], ["$W", ze], ["$M", Te], ["$y", Xn], ["$D", wr]].forEach(function(n) {
21961
21961
  $b[n[1]] = function(t) {
21962
21962
  return this.$g(t, n[0], n[1]);
21963
21963
  };
@@ -22019,16 +22019,16 @@ var nW = "isoweek";
22019
22019
  const iW = function(n, t, e) {
22020
22020
  var i = function(l, c) {
22021
22021
  var d = (c ? e.utc : e)().year(l).startOf(Xn), u = 4 - d.isoWeekday();
22022
- return d.isoWeekday() > 4 && (u += 7), d.add(u, Te);
22022
+ return d.isoWeekday() > 4 && (u += 7), d.add(u, ze);
22023
22023
  }, r = function(l) {
22024
- return l.add(4 - l.isoWeekday(), Te);
22024
+ return l.add(4 - l.isoWeekday(), ze);
22025
22025
  }, s = t.prototype;
22026
22026
  s.isoWeekYear = function() {
22027
22027
  var a = r(this);
22028
22028
  return a.year();
22029
22029
  }, s.isoWeek = function(a) {
22030
22030
  if (!this.$utils().u(a))
22031
- return this.add((a - this.isoWeek()) * 7, Te);
22031
+ return this.add((a - this.isoWeek()) * 7, ze);
22032
22032
  var l = r(this), c = i(this.isoWeekYear(), this.$u);
22033
22033
  return l.diff(c, _s) + 1;
22034
22034
  }, s.isoWeekday = function(a) {
@@ -22042,7 +22042,7 @@ const iW = function(n, t, e) {
22042
22042
  };
22043
22043
  kt.extend(iW);
22044
22044
  kt.extend(eW);
22045
- const Kc = "GGGG-[W]WW", za = class za {
22045
+ const Kc = "GGGG-[W]WW", Ta = class Ta {
22046
22046
  constructor() {
22047
22047
  this.yearMonthDayCache = /* @__PURE__ */ new Map(), this.yearWeekCache = /* @__PURE__ */ new Map(), this.yearMonthCache = /* @__PURE__ */ new Map(), this.yearCache = /* @__PURE__ */ new Map();
22048
22048
  }
@@ -22062,8 +22062,8 @@ const Kc = "GGGG-[W]WW", za = class za {
22062
22062
  return this.instance;
22063
22063
  }
22064
22064
  };
22065
- za.instance = new za();
22066
- let Qn = za;
22065
+ Ta.instance = new Ta();
22066
+ let Qn = Ta;
22067
22067
  class dn {
22068
22068
  constructor(t, e, i, r) {
22069
22069
  this.yearNumber = t, this.monthNumber = e, this.dayNumber = i, this.cache = r, this.type = "YearMonthDay", this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber), this.dayjs = kt(this.date), this.dateString = this.toString();
@@ -22524,7 +22524,7 @@ const xW = ({ data: n, granularity: t, pageSize: e }) => {
22524
22524
  ...i(o)
22525
22525
  ];
22526
22526
  return /* @__PURE__ */ m(nr, { data: ((o, a) => {
22527
- const l = zb(o, a);
22527
+ const l = Tb(o, a);
22528
22528
  return Object.values(l).map((c) => Object.values(c));
22529
22529
  })(n, t), columns: r(n), pageSize: e });
22530
22530
  };
@@ -22703,7 +22703,7 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
22703
22703
  return null;
22704
22704
  const i = [
22705
22705
  { label: "Confidence interval method", value: "none", disabled: !0 },
22706
- ...e.concat("none").map((r) => {
22706
+ ...e.map((r) => {
22707
22707
  switch (r) {
22708
22708
  case "wilson":
22709
22709
  return { label: "Wilson, 95% CI", value: "wilson" };
@@ -22773,7 +22773,11 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
22773
22773
  }, MW = ({ data: n, ...t }) => {
22774
22774
  const { views: e, granularity: i, confidenceIntervalMethods: r, pageSize: s, yAxisMaxLinear: o, yAxisMaxLogarithmic: a } = t, [l, c] = it("linear"), [d, u] = it(
22775
22775
  r.length > 0 ? r[0] : "none"
22776
- ), h = { linear: o, logarithmic: a }, f = (g) => {
22776
+ );
22777
+ Qt(() => {
22778
+ u((g) => r.includes(g) ? g : r.length > 0 ? r[0] : "none");
22779
+ }, [r]);
22780
+ const h = { linear: o, logarithmic: a }, f = (g) => {
22777
22781
  switch (g) {
22778
22782
  case "bar":
22779
22783
  return {
@@ -22856,7 +22860,7 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
22856
22860
  Qi,
22857
22861
  {
22858
22862
  className: "mx-1 btn btn-xs",
22859
- getData: () => zb(s, l),
22863
+ getData: () => Tb(s, l),
22860
22864
  filename: "prevalence_over_time.csv"
22861
22865
  }
22862
22866
  ),
@@ -22888,14 +22892,14 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
22888
22892
  /* @__PURE__ */ m(ar, { componentName: "prevalence-over-time", params: n, lapisUrl: r })
22889
22893
  ] });
22890
22894
  }, Ed = (n) => Math.max(...n.flatMap((t) => t.content.map((e) => e.prevalence)));
22891
- var zW = Object.defineProperty, TW = Object.getOwnPropertyDescriptor, Xe = (n, t, e, i) => {
22892
- for (var r = i > 1 ? void 0 : i ? TW(t, e) : t, s = n.length - 1, o; s >= 0; s--)
22895
+ var TW = Object.defineProperty, zW = Object.getOwnPropertyDescriptor, Xe = (n, t, e, i) => {
22896
+ for (var r = i > 1 ? void 0 : i ? zW(t, e) : t, s = n.length - 1, o; s >= 0; s--)
22893
22897
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
22894
- return i && r && zW(t, e, r), r;
22898
+ return i && r && TW(t, e, r), r;
22895
22899
  };
22896
22900
  let he = class extends di {
22897
22901
  constructor() {
22898
- super(...arguments), this.numeratorFilter = { displayName: "", lapisFilter: {} }, this.denominatorFilter = {}, this.granularity = "day", this.smoothingWindow = 0, this.views = ["bar", "line", "bubble", "table"], this.confidenceIntervalMethods = ["wilson"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.pageSize = !1, this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
22902
+ super(...arguments), this.numeratorFilter = { displayName: "", lapisFilter: {} }, this.denominatorFilter = {}, this.granularity = "day", this.smoothingWindow = 0, this.views = ["bar", "line", "bubble", "table"], this.confidenceIntervalMethods = ["none", "wilson"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.pageSize = !1, this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
22899
22903
  }
22900
22904
  render() {
22901
22905
  return /* @__PURE__ */ m(
@@ -23385,7 +23389,7 @@ const qW = ({ data: n, fields: t, pageSize: e }) => {
23385
23389
  /* @__PURE__ */ m(ar, { componentName: "aggregate", params: n, lapisUrl: t })
23386
23390
  ] });
23387
23391
  };
23388
- var sS = Object.defineProperty, oS = Object.getOwnPropertyDescriptor, zn = (n, t, e, i) => {
23392
+ var sS = Object.defineProperty, oS = Object.getOwnPropertyDescriptor, Tn = (n, t, e, i) => {
23389
23393
  for (var r = i > 1 ? void 0 : i ? oS(t, e) : t, s = n.length - 1, o; s >= 0; s--)
23390
23394
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
23391
23395
  return i && r && sS(t, e, r), r;
@@ -23410,31 +23414,31 @@ let un = class extends di {
23410
23414
  );
23411
23415
  }
23412
23416
  };
23413
- zn([
23417
+ Tn([
23414
23418
  C({ type: Array })
23415
23419
  ], un.prototype, "fields", 2);
23416
- zn([
23420
+ Tn([
23417
23421
  C({ type: Array })
23418
23422
  ], un.prototype, "views", 2);
23419
- zn([
23423
+ Tn([
23420
23424
  C({ type: Object })
23421
23425
  ], un.prototype, "filter", 2);
23422
- zn([
23426
+ Tn([
23423
23427
  C({ type: String })
23424
23428
  ], un.prototype, "width", 2);
23425
- zn([
23429
+ Tn([
23426
23430
  C({ type: String })
23427
23431
  ], un.prototype, "height", 2);
23428
- zn([
23432
+ Tn([
23429
23433
  C({ type: String })
23430
23434
  ], un.prototype, "initialSortField", 2);
23431
- zn([
23435
+ Tn([
23432
23436
  C({ type: String })
23433
23437
  ], un.prototype, "initialSortDirection", 2);
23434
- zn([
23438
+ Tn([
23435
23439
  C({ type: Object })
23436
23440
  ], un.prototype, "pageSize", 2);
23437
- un = zn([
23441
+ un = Tn([
23438
23442
  ke("gs-aggregate")
23439
23443
  ], un);
23440
23444
  const gl = (n, t) => {
@@ -23680,7 +23684,7 @@ const fS = (n) => {
23680
23684
  )
23681
23685
  ] });
23682
23686
  };
23683
- var yS = Object.defineProperty, vS = Object.getOwnPropertyDescriptor, Tn = (n, t, e, i) => {
23687
+ var yS = Object.defineProperty, vS = Object.getOwnPropertyDescriptor, zn = (n, t, e, i) => {
23684
23688
  for (var r = i > 1 ? void 0 : i ? vS(t, e) : t, s = n.length - 1, o; s >= 0; s--)
23685
23689
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
23686
23690
  return i && r && yS(t, e, r), r;
@@ -23705,34 +23709,34 @@ let hn = class extends di {
23705
23709
  );
23706
23710
  }
23707
23711
  };
23708
- Tn([
23712
+ zn([
23709
23713
  C({ type: Object })
23710
23714
  ], hn.prototype, "lapisFilter", 2);
23711
- Tn([
23715
+ zn([
23712
23716
  C({ type: String })
23713
23717
  ], hn.prototype, "lapisDateField", 2);
23714
- Tn([
23718
+ zn([
23715
23719
  C({ type: Array })
23716
23720
  ], hn.prototype, "views", 2);
23717
- Tn([
23721
+ zn([
23718
23722
  C({ type: String })
23719
23723
  ], hn.prototype, "width", 2);
23720
- Tn([
23724
+ zn([
23721
23725
  C({ type: String })
23722
23726
  ], hn.prototype, "height", 2);
23723
- Tn([
23727
+ zn([
23724
23728
  C({ type: String })
23725
23729
  ], hn.prototype, "granularity", 2);
23726
- Tn([
23730
+ zn([
23727
23731
  C({ type: Number })
23728
23732
  ], hn.prototype, "smoothingWindow", 2);
23729
- Tn([
23733
+ zn([
23730
23734
  C({ type: Object })
23731
23735
  ], hn.prototype, "pageSize", 2);
23732
- hn = Tn([
23736
+ hn = zn([
23733
23737
  ke("gs-number-sequences-over-time")
23734
23738
  ], hn);
23735
- const rg = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB4OyhmdW5jdGlvbihyKXtyLmFzc2VydEVxdWFsPXM9PnM7ZnVuY3Rpb24gZShzKXt9ci5hc3NlcnRJcz1lO2Z1bmN0aW9uIHQocyl7dGhyb3cgbmV3IEVycm9yfXIuYXNzZXJ0TmV2ZXI9dCxyLmFycmF5VG9FbnVtPXM9Pntjb25zdCBhPXt9O2Zvcihjb25zdCBpIG9mIHMpYVtpXT1pO3JldHVybiBhfSxyLmdldFZhbGlkRW51bVZhbHVlcz1zPT57Y29uc3QgYT1yLm9iamVjdEtleXMocykuZmlsdGVyKG89PnR5cGVvZiBzW3Nbb11dIT0ibnVtYmVyIiksaT17fTtmb3IoY29uc3QgbyBvZiBhKWlbb109c1tvXTtyZXR1cm4gci5vYmplY3RWYWx1ZXMoaSl9LHIub2JqZWN0VmFsdWVzPXM9PnIub2JqZWN0S2V5cyhzKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHNbYV19KSxyLm9iamVjdEtleXM9dHlwZW9mIE9iamVjdC5rZXlzPT0iZnVuY3Rpb24iP3M9Pk9iamVjdC5rZXlzKHMpOnM9Pntjb25zdCBhPVtdO2Zvcihjb25zdCBpIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsaSkmJmEucHVzaChpKTtyZXR1cm4gYX0sci5maW5kPShzLGEpPT57Zm9yKGNvbnN0IGkgb2YgcylpZihhKGkpKXJldHVybiBpfSxyLmlzSW50ZWdlcj10eXBlb2YgTnVtYmVyLmlzSW50ZWdlcj09ImZ1bmN0aW9uIj9zPT5OdW1iZXIuaXNJbnRlZ2VyKHMpOnM9PnR5cGVvZiBzPT0ibnVtYmVyIiYmaXNGaW5pdGUocykmJk1hdGguZmxvb3Iocyk9PT1zO2Z1bmN0aW9uIG4ocyxhPSIgfCAiKXtyZXR1cm4gcy5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP2AnJHtpfSdgOmkpLmpvaW4oYSl9ci5qb2luVmFsdWVzPW4sci5qc29uU3RyaW5naWZ5UmVwbGFjZXI9KHMsYSk9PnR5cGVvZiBhPT0iYmlnaW50Ij9hLnRvU3RyaW5nKCk6YX0pKHh8fCh4PXt9KSk7dmFyIHJ0OyhmdW5jdGlvbihyKXtyLm1lcmdlU2hhcGVzPShlLHQpPT4oey4uLmUsLi4udH0pfSkocnR8fChydD17fSkpO2NvbnN0IGY9eC5hcnJheVRvRW51bShbInN0cmluZyIsIm5hbiIsIm51bWJlciIsImludGVnZXIiLCJmbG9hdCIsImJvb2xlYW4iLCJkYXRlIiwiYmlnaW50Iiwic3ltYm9sIiwiZnVuY3Rpb24iLCJ1bmRlZmluZWQiLCJudWxsIiwiYXJyYXkiLCJvYmplY3QiLCJ1bmtub3duIiwicHJvbWlzZSIsInZvaWQiLCJuZXZlciIsIm1hcCIsInNldCJdKSxCPXI9Pntzd2l0Y2godHlwZW9mIHIpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gZi51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBmLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKHIpP2YubmFuOmYubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGYuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZi5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIGYuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gZi5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KHIpP2YuYXJyYXk6cj09PW51bGw/Zi5udWxsOnIudGhlbiYmdHlwZW9mIHIudGhlbj09ImZ1bmN0aW9uIiYmci5jYXRjaCYmdHlwZW9mIHIuY2F0Y2g9PSJmdW5jdGlvbiI/Zi5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZyIGluc3RhbmNlb2YgTWFwP2YubWFwOnR5cGVvZiBTZXQ8InUiJiZyIGluc3RhbmNlb2YgU2V0P2Yuc2V0OnR5cGVvZiBEYXRlPCJ1IiYmciBpbnN0YW5jZW9mIERhdGU/Zi5kYXRlOmYub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIGYudW5rbm93bn19LGQ9eC5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxpcj1yPT5KU09OLnN0cmluZ2lmeShyLG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyBBIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzc3Vlcz1bXSx0aGlzLmFkZElzc3VlPW49Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsbl19LHRoaXMuYWRkSXNzdWVzPShuPVtdKT0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcywuLi5uXX07Y29uc3QgdD1uZXcudGFyZ2V0LnByb3RvdHlwZTtPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsdCk6dGhpcy5fX3Byb3RvX189dCx0aGlzLm5hbWU9IlpvZEVycm9yIix0aGlzLmlzc3Vlcz1lfWdldCBlcnJvcnMoKXtyZXR1cm4gdGhpcy5pc3N1ZXN9Zm9ybWF0KGUpe2NvbnN0IHQ9ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWVzc2FnZX0sbj17X2Vycm9yczpbXX0scz1hPT57Zm9yKGNvbnN0IGkgb2YgYS5pc3N1ZXMpaWYoaS5jb2RlPT09ImludmFsaWRfdW5pb24iKWkudW5pb25FcnJvcnMubWFwKHMpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfcmV0dXJuX3R5cGUiKXMoaS5yZXR1cm5UeXBlRXJyb3IpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfYXJndW1lbnRzIilzKGkuYXJndW1lbnRzRXJyb3IpO2Vsc2UgaWYoaS5wYXRoLmxlbmd0aD09PTApbi5fZXJyb3JzLnB1c2godChpKSk7ZWxzZXtsZXQgbz1uLGM9MDtmb3IoO2M8aS5wYXRoLmxlbmd0aDspe2NvbnN0IHU9aS5wYXRoW2NdO2M9PT1pLnBhdGgubGVuZ3RoLTE/KG9bdV09b1t1XXx8e19lcnJvcnM6W119LG9bdV0uX2Vycm9ycy5wdXNoKHQoaSkpKTpvW3VdPW9bdV18fHtfZXJyb3JzOltdfSxvPW9bdV0sYysrfX19O3JldHVybiBzKHRoaXMpLG59c3RhdGljIGFzc2VydChlKXtpZighKGUgaW5zdGFuY2VvZiBBKSl0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke2V9YCl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5tZXNzYWdlfWdldCBtZXNzYWdlKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLHguanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbihlPXQ9PnQubWVzc2FnZSl7Y29uc3QgdD17fSxuPVtdO2Zvcihjb25zdCBzIG9mIHRoaXMuaXNzdWVzKXMucGF0aC5sZW5ndGg+MD8odFtzLnBhdGhbMF1dPXRbcy5wYXRoWzBdXXx8W10sdFtzLnBhdGhbMF1dLnB1c2goZShzKSkpOm4ucHVzaChlKHMpKTtyZXR1cm57Zm9ybUVycm9yczpuLGZpZWxkRXJyb3JzOnR9fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1BLmNyZWF0ZT1yPT5uZXcgQShyKTtjb25zdCBpZT0ocixlKT0+e2xldCB0O3N3aXRjaChyLmNvZGUpe2Nhc2UgZC5pbnZhbGlkX3R5cGU6ci5yZWNlaXZlZD09PWYudW5kZWZpbmVkP3Q9IlJlcXVpcmVkIjp0PWBFeHBlY3RlZCAke3IuZXhwZWN0ZWR9LCByZWNlaXZlZCAke3IucmVjZWl2ZWR9YDticmVhaztjYXNlIGQuaW52YWxpZF9saXRlcmFsOnQ9YEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShyLmV4cGVjdGVkLHguanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgZC51bnJlY29nbml6ZWRfa2V5czp0PWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt4LmpvaW5WYWx1ZXMoci5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb246dD0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjp0PWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7eC5qb2luVmFsdWVzKHIub3B0aW9ucyl9YDticmVhaztjYXNlIGQuaW52YWxpZF9lbnVtX3ZhbHVlOnQ9YEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt4LmpvaW5WYWx1ZXMoci5vcHRpb25zKX0sIHJlY2VpdmVkICcke3IucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBkLmludmFsaWRfYXJndW1lbnRzOnQ9IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIGQuaW52YWxpZF9yZXR1cm5fdHlwZTp0PSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIGQuaW52YWxpZF9kYXRlOnQ9IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBkLmludmFsaWRfc3RyaW5nOnR5cGVvZiByLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiByLnZhbGlkYXRpb24/KHQ9YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtyLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIHIudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJih0PWAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ci52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke3IudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDp4LmFzc2VydE5ldmVyKHIudmFsaWRhdGlvbik6ci52YWxpZGF0aW9uIT09InJlZ2V4Ij90PWBJbnZhbGlkICR7ci52YWxpZGF0aW9ufWA6dD0iSW52YWxpZCI7YnJlYWs7Y2FzZSBkLnRvb19zbWFsbDpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7ci5taW5pbXVtfSBlbGVtZW50KHMpYDpyLnR5cGU9PT0ic3RyaW5nIj90PWBTdHJpbmcgbXVzdCBjb250YWluICR7ci5leGFjdD8iZXhhY3RseSI6ci5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7ci5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnIudHlwZT09PSJudW1iZXIiP3Q9YE51bWJlciBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtyLm1pbmltdW19YDpyLnR5cGU9PT0iZGF0ZSI/dD1gRGF0ZSBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIoci5taW5pbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQudG9vX2JpZzpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19IGVsZW1lbnQocylgOnIudHlwZT09PSJzdHJpbmciP3Q9YFN0cmluZyBtdXN0IGNvbnRhaW4gJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHtyLm1heGltdW19IGNoYXJhY3RlcihzKWA6ci50eXBlPT09Im51bWJlciI/dD1gTnVtYmVyIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19YDpyLnR5cGU9PT0iYmlnaW50Ij90PWBCaWdJbnQgbXVzdCBiZSAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3IubWF4aW11bX1gOnIudHlwZT09PSJkYXRlIj90PWBEYXRlIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIoci5tYXhpbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQuY3VzdG9tOnQ9IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgZC5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczp0PSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIGQubm90X211bHRpcGxlX29mOnQ9YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtyLm11bHRpcGxlT2Z9YDticmVhaztjYXNlIGQubm90X2Zpbml0ZTp0PSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6dD1lLmRlZmF1bHRFcnJvcix4LmFzc2VydE5ldmVyKHIpfXJldHVybnttZXNzYWdlOnR9fTtsZXQgX3Q9aWU7ZnVuY3Rpb24gb3Iocil7X3Q9cn1mdW5jdGlvbiBQZSgpe3JldHVybiBfdH1jb25zdCBWZT1yPT57Y29uc3R7ZGF0YTplLHBhdGg6dCxlcnJvck1hcHM6bixpc3N1ZURhdGE6c309cixhPVsuLi50LC4uLnMucGF0aHx8W11dLGk9ey4uLnMscGF0aDphfTtpZihzLm1lc3NhZ2UhPT12b2lkIDApcmV0dXJuey4uLnMscGF0aDphLG1lc3NhZ2U6cy5tZXNzYWdlfTtsZXQgbz0iIjtjb25zdCBjPW4uZmlsdGVyKHU9PiEhdSkuc2xpY2UoKS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHUgb2YgYylvPXUoaSx7ZGF0YTplLGRlZmF1bHRFcnJvcjpvfSkubWVzc2FnZTtyZXR1cm57Li4ucyxwYXRoOmEsbWVzc2FnZTpvfX0sY3I9W107ZnVuY3Rpb24gaChyLGUpe2NvbnN0IHQ9UGUoKSxuPVZlKHtpc3N1ZURhdGE6ZSxkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxlcnJvck1hcHM6W3IuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxyLnNjaGVtYUVycm9yTWFwLHQsdD09PWllP3ZvaWQgMDppZV0uZmlsdGVyKHM9PiEhcyl9KTtyLmNvbW1vbi5pc3N1ZXMucHVzaChuKX1jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT0idmFsaWQifWRpcnR5KCl7dGhpcy52YWx1ZT09PSJ2YWxpZCImJih0aGlzLnZhbHVlPSJkaXJ0eSIpfWFib3J0KCl7dGhpcy52YWx1ZSE9PSJhYm9ydGVkIiYmKHRoaXMudmFsdWU9ImFib3J0ZWQiKX1zdGF0aWMgbWVyZ2VBcnJheShlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7aWYocy5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7cy5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksbi5wdXNoKHMudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1hd2FpdCBzLmtleSxpPWF3YWl0IHMudmFsdWU7bi5wdXNoKHtrZXk6YSx2YWx1ZTppfSl9cmV0dXJuIEQubWVyZ2VPYmplY3RTeW5jKGUsbil9c3RhdGljIG1lcmdlT2JqZWN0U3luYyhlLHQpe2NvbnN0IG49e307Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3R7a2V5OmEsdmFsdWU6aX09cztpZihhLnN0YXR1cz09PSJhYm9ydGVkInx8aS5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7YS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksaS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksYS52YWx1ZSE9PSJfX3Byb3RvX18iJiYodHlwZW9mIGkudmFsdWU8InUifHxzLmFsd2F5c1NldCkmJihuW2EudmFsdWVdPWkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX19Y29uc3QgZz1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksb2U9cj0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyfSksTz1yPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOnJ9KSxudD1yPT5yLnN0YXR1cz09PSJhYm9ydGVkIixzdD1yPT5yLnN0YXR1cz09PSJkaXJ0eSIseGU9cj0+ci5zdGF0dXM9PT0idmFsaWQiLGtlPXI9PnR5cGVvZiBQcm9taXNlPCJ1IiYmciBpbnN0YW5jZW9mIFByb21pc2U7ZnVuY3Rpb24gTGUocixlLHQsbil7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiI/ciE9PWV8fCFuOiFlLmhhcyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTtyZXR1cm4gZS5nZXQocil9ZnVuY3Rpb24geHQocixlLHQsbixzKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIj9yIT09ZXx8IXM6IWUuaGFzKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7cmV0dXJuIGUuc2V0KHIsdCksdH10eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIHA7KGZ1bmN0aW9uKHIpe3IuZXJyVG9PYmo9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmV8fHt9LHIudG9TdHJpbmc9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP2U6ZT09bnVsbD92b2lkIDA6ZS5tZXNzYWdlfSkocHx8KHA9e30pKTt2YXIgYmUsd2U7Y2xhc3MgWXtjb25zdHJ1Y3RvcihlLHQsbixzKXt0aGlzLl9jYWNoZWRQYXRoPVtdLHRoaXMucGFyZW50PWUsdGhpcy5kYXRhPXQsdGhpcy5fcGF0aD1uLHRoaXMuX2tleT1zfWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RofHwodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsLi4udGhpcy5fa2V5KTp0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCx0aGlzLl9rZXkpKSx0aGlzLl9jYWNoZWRQYXRofX1jb25zdCBrdD0ocixlKT0+e2lmKHhlKGUpKXJldHVybntzdWNjZXNzOiEwLGRhdGE6ZS52YWx1ZX07aWYoIXIuY29tbW9uLmlzc3Vlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpO3JldHVybntzdWNjZXNzOiExLGdldCBlcnJvcigpe2lmKHRoaXMuX2Vycm9yKXJldHVybiB0aGlzLl9lcnJvcjtjb25zdCB0PW5ldyBBKHIuY29tbW9uLmlzc3Vlcyk7cmV0dXJuIHRoaXMuX2Vycm9yPXQsdGhpcy5fZXJyb3J9fX07ZnVuY3Rpb24gdihyKXtpZighcilyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjp0LHJlcXVpcmVkX2Vycm9yOm4sZGVzY3JpcHRpb246c309cjtpZihlJiYodHx8bikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246c306e2Vycm9yTWFwOihpLG8pPT57dmFyIGMsdTtjb25zdHttZXNzYWdlOmx9PXI7cmV0dXJuIGkuY29kZT09PSJpbnZhbGlkX2VudW1fdmFsdWUiP3ttZXNzYWdlOmw/P28uZGVmYXVsdEVycm9yfTp0eXBlb2Ygby5kYXRhPiJ1Ij97bWVzc2FnZTooYz1sPz9uKSE9PW51bGwmJmMhPT12b2lkIDA/YzpvLmRlZmF1bHRFcnJvcn06aS5jb2RlIT09ImludmFsaWRfdHlwZSI/e21lc3NhZ2U6by5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOih1PWw/P3QpIT09bnVsbCYmdSE9PXZvaWQgMD91Om8uZGVmYXVsdEVycm9yfX0sZGVzY3JpcHRpb246c319Y2xhc3MgX3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIEIoZS5kYXRhKX1fZ2V0T3JSZXR1cm5DdHgoZSx0KXtyZXR1cm4gdHx8e2NvbW1vbjplLnBhcmVudC5jb21tb24sZGF0YTplLmRhdGEscGFyc2VkVHlwZTpCKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19X3Byb2Nlc3NJbnB1dFBhcmFtcyhlKXtyZXR1cm57c3RhdHVzOm5ldyBELGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOkIoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX19X3BhcnNlU3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO2lmKGtlKHQpKXRocm93IG5ldyBFcnJvcigiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS4iKTtyZXR1cm4gdH1fcGFyc2VBc3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9cGFyc2UoZSx0KXtjb25zdCBuPXRoaXMuc2FmZVBhcnNlKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1zYWZlUGFyc2UoZSx0KXt2YXIgbjtjb25zdCBzPXtjb21tb246e2lzc3VlczpbXSxhc3luYzoobj10PT1udWxsP3ZvaWQgMDp0LmFzeW5jKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSxjb250ZXh0dWFsRXJyb3JNYXA6dD09bnVsbD92b2lkIDA6dC5lcnJvck1hcH0scGF0aDoodD09bnVsbD92b2lkIDA6dC5wYXRoKXx8W10sc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhcmVudDpudWxsLGRhdGE6ZSxwYXJzZWRUeXBlOkIoZSl9LGE9dGhpcy5fcGFyc2VTeW5jKHtkYXRhOmUscGF0aDpzLnBhdGgscGFyZW50OnN9KTtyZXR1cm4ga3QocyxhKX1hc3luYyBwYXJzZUFzeW5jKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1hc3luYyBzYWZlUGFyc2VBc3luYyhlLHQpe2NvbnN0IG49e2NvbW1vbjp7aXNzdWVzOltdLGNvbnRleHR1YWxFcnJvck1hcDp0PT1udWxsP3ZvaWQgMDp0LmVycm9yTWFwLGFzeW5jOiEwfSxwYXRoOih0PT1udWxsP3ZvaWQgMDp0LnBhdGgpfHxbXSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGFyZW50Om51bGwsZGF0YTplLHBhcnNlZFR5cGU6QihlKX0scz10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6bi5wYXRoLHBhcmVudDpufSksYT1hd2FpdChrZShzKT9zOlByb21pc2UucmVzb2x2ZShzKSk7cmV0dXJuIGt0KG4sYSl9cmVmaW5lKGUsdCl7Y29uc3Qgbj1zPT50eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PiJ1Ij97bWVzc2FnZTp0fTp0eXBlb2YgdD09ImZ1bmN0aW9uIj90KHMpOnQ7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHMsYSk9Pntjb25zdCBpPWUocyksbz0oKT0+YS5hZGRJc3N1ZSh7Y29kZTpkLmN1c3RvbSwuLi5uKHMpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGM9PmM/ITA6KG8oKSwhMSkpOmk/ITA6KG8oKSwhMSl9KX1yZWZpbmVtZW50KGUsdCl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKG4scyk9PmUobik/ITA6KHMuYWRkSXNzdWUodHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChuLHMpOnQpLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBDKHtzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJyZWZpbmVtZW50IixyZWZpbmVtZW50OmV9fSl9c3VwZXJSZWZpbmUoZSl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoZSl9b3B0aW9uYWwoKXtyZXR1cm4gUC5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIEouY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1udWxsaXNoKCl7cmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpfWFycmF5KCl7cmV0dXJuIFIuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1wcm9taXNlKCl7cmV0dXJuIGxlLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9b3IoZSl7cmV0dXJuIE1lLmNyZWF0ZShbdGhpcyxlXSx0aGlzLl9kZWYpfWFuZChlKXtyZXR1cm4gRGUuY3JlYXRlKHRoaXMsZSx0aGlzLl9kZWYpfXRyYW5zZm9ybShlKXtyZXR1cm4gbmV3IEMoey4uLnYodGhpcy5fZGVmKSxzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJ0cmFuc2Zvcm0iLHRyYW5zZm9ybTplfX0pfWRlZmF1bHQoZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgUmUoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6dCx0eXBlTmFtZTp5LlpvZERlZmF1bHR9KX1icmFuZCgpe3JldHVybiBuZXcgb3Qoe3R5cGVOYW1lOnkuWm9kQnJhbmRlZCx0eXBlOnRoaXMsLi4udih0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgQ2Uoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxjYXRjaFZhbHVlOnQsdHlwZU5hbWU6eS5ab2RDYXRjaH0pfWRlc2NyaWJlKGUpe2NvbnN0IHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IHQoey4uLnRoaXMuX2RlZixkZXNjcmlwdGlvbjplfSl9cGlwZShlKXtyZXR1cm4gWmUuY3JlYXRlKHRoaXMsZSl9cmVhZG9ubHkoKXtyZXR1cm4gSWUuY3JlYXRlKHRoaXMpfWlzT3B0aW9uYWwoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2Uodm9pZCAwKS5zdWNjZXNzfWlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc319Y29uc3QgdXI9L15jW15ccy1dezgsfSQvaSxkcj0vXlswLTlhLXpdKyQvLGxyPS9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvLGhyPS9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2ksZnI9L15bYS16MC05Xy1dezIxfSQvaSxtcj0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLHByPS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XycrXC1cLl0qKVtBLVowLTlfKy1dQChbQS1aMC05XVtBLVowLTlcLV0qXC4pK1tBLVpdezIsfSQvaSx5cj0iXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJCI7bGV0IGF0O2NvbnN0IGdyPS9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLyx2cj0vXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKSQvLF9yPS9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxidD0iKChcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXGR8MzApfCgwMiktKDBbMS05XXwxXFxkfDJbMC04XSkpKSIseHI9bmV3IFJlZ0V4cChgXiR7YnR9JGApO2Z1bmN0aW9uIHd0KHIpe2xldCBlPSIoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkIjtyZXR1cm4gci5wcmVjaXNpb24/ZT1gJHtlfVxcLlxcZHske3IucHJlY2lzaW9ufX1gOnIucHJlY2lzaW9uPT1udWxsJiYoZT1gJHtlfShcXC5cXGQrKT9gKSxlfWZ1bmN0aW9uIGtyKHIpe3JldHVybiBuZXcgUmVnRXhwKGBeJHt3dChyKX0kYCl9ZnVuY3Rpb24gU3Qocil7bGV0IGU9YCR7YnR9VCR7d3Qocil9YDtjb25zdCB0PVtdO3JldHVybiB0LnB1c2goci5sb2NhbD8iWj8iOiJaIiksci5vZmZzZXQmJnQucHVzaCgiKFsrLV1cXGR7Mn06P1xcZHsyfSkiKSxlPWAke2V9KCR7dC5qb2luKCJ8Iil9KWAsbmV3IFJlZ0V4cChgXiR7ZX0kYCl9ZnVuY3Rpb24gYnIocixlKXtyZXR1cm4hISgoZT09PSJ2NCJ8fCFlKSYmZ3IudGVzdChyKXx8KGU9PT0idjYifHwhZSkmJnZyLnRlc3QocikpfWNsYXNzIEUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5zdHJpbmcpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnN0cmluZyxyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWNvbnN0IG49bmV3IEQ7bGV0IHM7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylpZihhLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPGEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0ibWF4IillLmRhdGEubGVuZ3RoPmEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09Imxlbmd0aCIpe2NvbnN0IGk9ZS5kYXRhLmxlbmd0aD5hLnZhbHVlLG89ZS5kYXRhLmxlbmd0aDxhLnZhbHVlOyhpfHxvKSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxpP2gocyx7Y29kZTpkLnRvb19iaWcsbWF4aW11bTphLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6YS5tZXNzYWdlfSk6byYmaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMCxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSl9ZWxzZSBpZihhLmtpbmQ9PT0iZW1haWwiKXByLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImVtYWlsIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImVtb2ppIilhdHx8KGF0PW5ldyBSZWdFeHAoeXIsInUiKSksYXQudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0idXVpZCIpaHIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoidXVpZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJuYW5vaWQiKWZyLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246Im5hbm9pZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJjdWlkIil1ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImN1aWQyIilkci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJ1bGlkIilsci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1bGlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09InVybCIpdHJ5e25ldyBVUkwoZS5kYXRhKX1jYXRjaHtzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1cmwiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKX1lbHNlIGEua2luZD09PSJyZWdleCI/KGEucmVnZXgubGFzdEluZGV4PTAsYS5yZWdleC50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKSk6YS5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOmEua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKGEudmFsdWUsYS5wb3NpdGlvbil8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7aW5jbHVkZXM6YS52YWx1ZSxwb3NpdGlvbjphLnBvc2l0aW9ufSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09InRvTG93ZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvTG93ZXJDYXNlKCk6YS5raW5kPT09InRvVXBwZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvVXBwZXJDYXNlKCk6YS5raW5kPT09InN0YXJ0c1dpdGgiP2UuZGF0YS5zdGFydHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e3N0YXJ0c1dpdGg6YS52YWx1ZX0sbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJlbmRzV2l0aCI/ZS5kYXRhLmVuZHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOmEudmFsdWV9LG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTphLmtpbmQ9PT0iZGF0ZXRpbWUiP1N0KGEpLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOiJkYXRldGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkYXRlIj94ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJ0aW1lIj9rcihhKS50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoidGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkdXJhdGlvbiI/bXIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZHVyYXRpb24iLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09ImlwIj9icihlLmRhdGEsYS52ZXJzaW9uKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImlwIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJiYXNlNjQiP19yLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImJhc2U2NCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTp4LmFzc2VydE5ldmVyKGEpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLHQsbil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChzPT5lLnRlc3Qocykse3ZhbGlkYXRpb246dCxjb2RlOmQuaW52YWxpZF9zdHJpbmcsLi4ucC5lcnJUb09iaihuKX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1lbWFpbChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVtYWlsIiwuLi5wLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5wLmVyclRvT2JqKGUpfSl9ZW1vamkoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbW9qaSIsLi4ucC5lcnJUb09iaihlKX0pfXV1aWQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJ1dWlkIiwuLi5wLmVyclRvT2JqKGUpfSl9bmFub2lkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibmFub2lkIiwuLi5wLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLnAuZXJyVG9PYmooZSl9KX1jdWlkMihlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQyIiwuLi5wLmVyclRvT2JqKGUpfSl9dWxpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InVsaWQiLC4uLnAuZXJyVG9PYmooZSl9KX1iYXNlNjQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJiYXNlNjQiLC4uLnAuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5wLmVyclRvT2JqKGUpfSl9ZGF0ZXRpbWUoZSl7dmFyIHQsbjtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOm51bGwsb2Zmc2V0OiExLGxvY2FsOiExLG1lc3NhZ2U6ZX0pOnRoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sb2Zmc2V0Oih0PWU9PW51bGw/dm9pZCAwOmUub2Zmc2V0KSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSxsb2NhbDoobj1lPT1udWxsP3ZvaWQgMDplLmxvY2FsKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSwuLi5wLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1kYXRlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZGF0ZSIsbWVzc2FnZTplfSl9dGltZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJ0aW1lIixwcmVjaXNpb246bnVsbCxtZXNzYWdlOmV9KTp0aGlzLl9hZGRDaGVjayh7a2luZDoidGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sLi4ucC5lcnJUb09iaihlPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2UpfSl9ZHVyYXRpb24oZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJkdXJhdGlvbiIsLi4ucC5lcnJUb09iaihlKX0pfXJlZ2V4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJyZWdleCIscmVnZXg6ZSwuLi5wLmVyclRvT2JqKHQpfSl9aW5jbHVkZXMoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImluY2x1ZGVzIix2YWx1ZTplLHBvc2l0aW9uOnQ9PW51bGw/dm9pZCAwOnQucG9zaXRpb24sLi4ucC5lcnJUb09iaih0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9ZW5kc1dpdGgoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVuZHNXaXRoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4ucC5lcnJUb09iaih0KX0pfWxlbmd0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibGVuZ3RoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxwLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyBFKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOiJ0cmltIn1dfSl9dG9Mb3dlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvTG93ZXJDYXNlIn1dfSl9dG9VcHBlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNEYXRlKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImRhdGUiKX1nZXQgaXNUaW1lKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InRpbWUiKX1nZXQgaXNEdXJhdGlvbigpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJkdXJhdGlvbiIpfWdldCBpc0VtYWlsKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtYWlsIil9Z2V0IGlzVVJMKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InVybCIpfWdldCBpc0Vtb2ppKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtb2ppIil9Z2V0IGlzVVVJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1dWlkIil9Z2V0IGlzTkFOT0lEKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09Im5hbm9pZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgaXNCYXNlNjQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iYmFzZTY0Iil9Z2V0IG1pbkxlbmd0aCgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHx0LnZhbHVlPmUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4TGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHQudmFsdWU8ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfX1FLmNyZWF0ZT1yPT57dmFyIGU7cmV0dXJuIG5ldyBFKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2RTdHJpbmcsY29lcmNlOihlPXI9PW51bGw/dm9pZCAwOnIuY29lcmNlKSE9PW51bGwmJmUhPT12b2lkIDA/ZTohMSwuLi52KHIpfSl9O2Z1bmN0aW9uIHdyKHIsZSl7Y29uc3QgdD0oci50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscz10Pm4/dDpuLGE9cGFyc2VJbnQoci50b0ZpeGVkKHMpLnJlcGxhY2UoIi4iLCIiKSksaT1wYXJzZUludChlLnRvRml4ZWQocykucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gYSVpL01hdGgucG93KDEwLHMpfWNsYXNzIEggZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZSx0aGlzLnN0ZXA9dGhpcy5tdWx0aXBsZU9mfV9wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPU51bWJlcihlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5udW1iZXIpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLm51bWJlcixyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWxldCBuO2NvbnN0IHM9bmV3IEQ7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylhLmtpbmQ9PT0iaW50Ij94LmlzSW50ZWdlcihlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDoiaW50ZWdlciIscmVjZWl2ZWQ6ImZsb2F0IixtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1pbiI/KGEuaW5jbHVzaXZlP2UuZGF0YTxhLnZhbHVlOmUuZGF0YTw9YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTphLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1heCI/KGEuaW5jbHVzaXZlP2UuZGF0YT5hLnZhbHVlOmUuZGF0YT49YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6YS5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtdWx0aXBsZU9mIj93cihlLmRhdGEsYS52YWx1ZSkhPT0wJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOmEudmFsdWUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJmaW5pdGUiP051bWJlci5pc0Zpbml0ZShlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9maW5pdGUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOnguYXNzZXJ0TmV2ZXIoYSk7cmV0dXJue3N0YXR1czpzLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxwLnRvU3RyaW5nKHQpKX1ndChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEscC50b1N0cmluZyh0KSl9bHRlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMCxwLnRvU3RyaW5nKHQpKX1sdChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEscC50b1N0cmluZyh0KSl9c2V0TGltaXQoZSx0LG4scyl7cmV0dXJuIG5ldyBIKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOmUsdmFsdWU6dCxpbmNsdXNpdmU6bixtZXNzYWdlOnAudG9TdHJpbmcocyl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEgoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1pbnQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJpbnQiLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMSxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9bm9ucG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWZpbml0ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImZpbml0ZSIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9c2FmZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsaW5jbHVzaXZlOiEwLHZhbHVlOk51bWJlci5NSU5fU0FGRV9JTlRFR0VSLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgaXNJbnQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaW50Inx8ZS5raW5kPT09Im11bHRpcGxlT2YiJiZ4LmlzSW50ZWdlcihlLnZhbHVlKSl9Z2V0IGlzRmluaXRlKCl7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyl7aWYobi5raW5kPT09ImZpbml0ZSJ8fG4ua2luZD09PSJpbnQifHxuLmtpbmQ9PT0ibXVsdGlwbGVPZiIpcmV0dXJuITA7bi5raW5kPT09Im1pbiI/KHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTpuLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKX1yZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpJiZOdW1iZXIuaXNGaW5pdGUoZSl9fUguY3JlYXRlPXI9Pm5ldyBIKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2ROdW1iZXIsY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBxIGV4dGVuZHMgX3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5taW49dGhpcy5ndGUsdGhpcy5tYXg9dGhpcy5sdGV9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9QmlnSW50KGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJpZ2ludCl7Y29uc3QgYT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChhLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuYmlnaW50LHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9bGV0IG47Y29uc3Qgcz1uZXcgRDtmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iPyhhLmluY2x1c2l2ZT9lLmRhdGE8YS52YWx1ZTplLmRhdGE8PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06YS52YWx1ZSxpbmNsdXNpdmU6YS5pbmNsdXNpdmUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtYXgiPyhhLmluY2x1c2l2ZT9lLmRhdGE+YS52YWx1ZTplLmRhdGE+PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19iaWcsdHlwZToiYmlnaW50IixtYXhpbXVtOmEudmFsdWUsaW5jbHVzaXZlOmEuaW5jbHVzaXZlLG1lc3NhZ2U6YS5tZXNzYWdlfSkscy5kaXJ0eSgpKTphLmtpbmQ9PT0ibXVsdGlwbGVPZiI/ZS5kYXRhJWEudmFsdWUhPT1CaWdJbnQoMCkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6YS52YWx1ZSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOnMudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLHAudG9TdHJpbmcodCkpfWd0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMSxwLnRvU3RyaW5nKHQpKX1sdGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLHAudG9TdHJpbmcodCkpfWx0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxwLnRvU3RyaW5nKHQpKX1zZXRMaW1pdChlLHQsbixzKXtyZXR1cm4gbmV3IHEoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTp0LGluY2x1c2l2ZTpuLG1lc3NhZ2U6cC50b1N0cmluZyhzKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgcSh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW11bHRpcGxlT2YoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im11bHRpcGxlT2YiLHZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX19cS5jcmVhdGU9cj0+e3ZhciBlO3JldHVybiBuZXcgcSh7Y2hlY2tzOltdLHR5cGVOYW1lOnkuWm9kQmlnSW50LGNvZXJjZTooZT1yPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4udihyKX0pfTtjbGFzcyBTZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9ISFlLmRhdGEpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJvb2xlYW4pe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmJvb2xlYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1TZS5jcmVhdGU9cj0+bmV3IFNlKHt0eXBlTmFtZTp5LlpvZEJvb2xlYW4sY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBLIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5kYXRlKXtjb25zdCBhPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKGEse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5kYXRlLHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9aWYoaXNOYU4oZS5kYXRhLmdldFRpbWUoKSkpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfZGF0ZX0pLGd9Y29uc3Qgbj1uZXcgRDtsZXQgcztmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iP2UuZGF0YS5nZXRUaW1lKCk8YS52YWx1ZSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC50b29fc21hbGwsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6YS5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5hLnZhbHVlJiYocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLnRvb19iaWcsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1heGltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6bmV3IERhdGUoZS5kYXRhLmdldFRpbWUoKSl9fV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEsoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUuZ2V0VGltZSgpLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWdldCBtaW5EYXRlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlIT1udWxsP25ldyBEYXRlKGUpOm51bGx9Z2V0IG1heERhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpdC5raW5kPT09Im1heCImJihlPT09bnVsbHx8dC52YWx1ZTxlKSYmKGU9dC52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH19Sy5jcmVhdGU9cj0+bmV3IEsoe2NoZWNrczpbXSxjb2VyY2U6KHI9PW51bGw/dm9pZCAwOnIuY29lcmNlKXx8ITEsdHlwZU5hbWU6eS5ab2REYXRlLC4uLnYocil9KTtjbGFzcyB6ZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLnN5bWJvbCl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChuLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuc3ltYm9sLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19emUuY3JlYXRlPXI9Pm5ldyB6ZSh7dHlwZU5hbWU6eS5ab2RTeW1ib2wsLi4udihyKX0pO2NsYXNzIFRlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi51bmRlZmluZWQscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1UZS5jcmVhdGU9cj0+bmV3IFRlKHt0eXBlTmFtZTp5LlpvZFVuZGVmaW5lZCwuLi52KHIpfSk7Y2xhc3MgJGUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09Zi5udWxsKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5udWxsLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19JGUuY3JlYXRlPXI9Pm5ldyAkZSh7dHlwZU5hbWU6eS5ab2ROdWxsLC4uLnYocil9KTtjbGFzcyBjZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2FueT0hMH1fcGFyc2UoZSl7cmV0dXJuIE8oZS5kYXRhKX19Y2UuY3JlYXRlPXI9Pm5ldyBjZSh7dHlwZU5hbWU6eS5ab2RBbnksLi4udihyKX0pO2NsYXNzIFEgZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4gTyhlLmRhdGEpfX1RLmNyZWF0ZT1yPT5uZXcgUSh7dHlwZU5hbWU6eS5ab2RVbmtub3duLC4uLnYocil9KTtjbGFzcyBMIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYubmV2ZXIscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZ319TC5jcmVhdGU9cj0+bmV3IEwoe3R5cGVOYW1lOnkuWm9kTmV2ZXIsLi4udihyKX0pO2NsYXNzIFVlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi52b2lkLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19VWUuY3JlYXRlPXI9Pm5ldyBVZSh7dHlwZU5hbWU6eS5ab2RWb2lkLC4uLnYocil9KTtjbGFzcyBSIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnQsc3RhdHVzOm59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZjtpZih0LnBhcnNlZFR5cGUhPT1mLmFycmF5KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5hcnJheSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2lmKHMuZXhhY3RMZW5ndGghPT1udWxsKXtjb25zdCBpPXQuZGF0YS5sZW5ndGg+cy5leGFjdExlbmd0aC52YWx1ZSxvPXQuZGF0YS5sZW5ndGg8cy5leGFjdExlbmd0aC52YWx1ZTsoaXx8bykmJihoKHQse2NvZGU6aT9kLnRvb19iaWc6ZC50b29fc21hbGwsbWluaW11bTpvP3MuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06aT9zLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6cy5leGFjdExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKX1pZihzLm1pbkxlbmd0aCE9PW51bGwmJnQuZGF0YS5sZW5ndGg8cy5taW5MZW5ndGgudmFsdWUmJihoKHQse2NvZGU6ZC50b29fc21hbGwsbWluaW11bTpzLm1pbkxlbmd0aC52YWx1ZSx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5taW5MZW5ndGgubWVzc2FnZX0pLG4uZGlydHkoKSkscy5tYXhMZW5ndGghPT1udWxsJiZ0LmRhdGEubGVuZ3RoPnMubWF4TGVuZ3RoLnZhbHVlJiYoaCh0LHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnMubWF4TGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpzLm1heExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKSx0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwoWy4uLnQuZGF0YV0ubWFwKChpLG8pPT5zLnR5cGUuX3BhcnNlQXN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpKS50aGVuKGk9PkQubWVyZ2VBcnJheShuLGkpKTtjb25zdCBhPVsuLi50LmRhdGFdLm1hcCgoaSxvKT0+cy50eXBlLl9wYXJzZVN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpO3JldHVybiBELm1lcmdlQXJyYXkobixhKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSx0KXtyZXR1cm4gbmV3IFIoey4uLnRoaXMuX2RlZixtaW5MZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgUih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOnAudG9TdHJpbmcodCl9fSl9bGVuZ3RoKGUsdCl7cmV0dXJuIG5ldyBSKHsuLi50aGlzLl9kZWYsZXhhY3RMZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1SLmNyZWF0ZT0ocixlKT0+bmV3IFIoe3R5cGU6cixtaW5MZW5ndGg6bnVsbCxtYXhMZW5ndGg6bnVsbCxleGFjdExlbmd0aDpudWxsLHR5cGVOYW1lOnkuWm9kQXJyYXksLi4udihlKX0pO2Z1bmN0aW9uIHVlKHIpe2lmKHIgaW5zdGFuY2VvZiBUKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIuc2hhcGUpe2NvbnN0IG49ci5zaGFwZVt0XTtlW3RdPVAuY3JlYXRlKHVlKG4pKX1yZXR1cm4gbmV3IFQoey4uLnIuX2RlZixzaGFwZTooKT0+ZX0pfWVsc2UgcmV0dXJuIHIgaW5zdGFuY2VvZiBSP25ldyBSKHsuLi5yLl9kZWYsdHlwZTp1ZShyLmVsZW1lbnQpfSk6ciBpbnN0YW5jZW9mIFA/UC5jcmVhdGUodWUoci51bndyYXAoKSkpOnIgaW5zdGFuY2VvZiBKP0ouY3JlYXRlKHVlKHIudW53cmFwKCkpKTpyIGluc3RhbmNlb2YgVz9XLmNyZWF0ZShyLml0ZW1zLm1hcChlPT51ZShlKSkpOnJ9Y2xhc3MgVCBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2NhY2hlZD1udWxsLHRoaXMubm9uc3RyaWN0PXRoaXMucGFzc3Rocm91Z2gsdGhpcy5hdWdtZW50PXRoaXMuZXh0ZW5kfV9nZXRDYWNoZWQoKXtpZih0aGlzLl9jYWNoZWQhPT1udWxsKXJldHVybiB0aGlzLl9jYWNoZWQ7Y29uc3QgZT10aGlzLl9kZWYuc2hhcGUoKSx0PXgub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6dH19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh1LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGd9Y29uc3R7c3RhdHVzOm4sY3R4OnN9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSx7c2hhcGU6YSxrZXlzOml9PXRoaXMuX2dldENhY2hlZCgpLG89W107aWYoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBzLmRhdGEpaS5pbmNsdWRlcyh1KXx8by5wdXNoKHUpO2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgb2YgaSl7Y29uc3QgbD1hW3VdLGs9cy5kYXRhW3VdO2MucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpsLl9wYXJzZShuZXcgWShzLGsscy5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBzLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMKXtjb25zdCB1PXRoaXMuX2RlZi51bmtub3duS2V5cztpZih1PT09InBhc3N0aHJvdWdoIilmb3IoY29uc3QgbCBvZiBvKWMucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTpsfSx2YWx1ZTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6cy5kYXRhW2xdfX0pO2Vsc2UgaWYodT09PSJzdHJpY3QiKW8ubGVuZ3RoPjAmJihoKHMse2NvZGU6ZC51bnJlY29nbml6ZWRfa2V5cyxrZXlzOm99KSxuLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgbCBvZiBvKXtjb25zdCBrPXMuZGF0YVtsXTtjLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6bH0sdmFsdWU6dS5fcGFyc2UobmV3IFkocyxrLHMucGF0aCxsKSksYWx3YXlzU2V0OmwgaW4gcy5kYXRhfSl9fXJldHVybiBzLmNvbW1vbi5hc3luYz9Qcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntjb25zdCB1PVtdO2Zvcihjb25zdCBsIG9mIGMpe2NvbnN0IGs9YXdhaXQgbC5rZXksUz1hd2FpdCBsLnZhbHVlO3UucHVzaCh7a2V5OmssdmFsdWU6UyxhbHdheXNTZXQ6bC5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+RC5tZXJnZU9iamVjdFN5bmMobix1KSk6RC5tZXJnZU9iamVjdFN5bmMobixjKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KGUpe3JldHVybiBwLmVyclRvT2JqLG5ldyBUKHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InN0cmljdCIsLi4uZSE9PXZvaWQgMD97ZXJyb3JNYXA6KHQsbik9Pnt2YXIgcyxhLGksbztjb25zdCBjPShpPShhPShzPXRoaXMuX2RlZikuZXJyb3JNYXApPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS5jYWxsKHMsdCxuKS5tZXNzYWdlKSE9PW51bGwmJmkhPT12b2lkIDA/aTpuLmRlZmF1bHRFcnJvcjtyZXR1cm4gdC5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIj97bWVzc2FnZToobz1wLmVyclRvT2JqKGUpLm1lc3NhZ2UpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmN9OnttZXNzYWdlOmN9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJwYXNzdGhyb3VnaCJ9KX1leHRlbmQoZSl7cmV0dXJuIG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4uZX0pfSl9bWVyZ2UoZSl7cmV0dXJuIG5ldyBUKHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6eS5ab2RPYmplY3R9KX1zZXRLZXkoZSx0KXtyZXR1cm4gdGhpcy5hdWdtZW50KHtbZV06dH0pfWNhdGNoYWxsKGUpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOmV9KX1waWNrKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyhlKS5mb3JFYWNoKG49PntlW25dJiZ0aGlzLnNoYXBlW25dJiYodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1vbWl0KGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntlW25dfHwodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1kZWVwUGFydGlhbCgpe3JldHVybiB1ZSh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49Pntjb25zdCBzPXRoaXMuc2hhcGVbbl07ZSYmIWVbbl0/dFtuXT1zOnRbbl09cy5vcHRpb25hbCgpfSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfXJlcXVpcmVkKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntpZihlJiYhZVtuXSl0W25dPXRoaXMuc2hhcGVbbl07ZWxzZXtsZXQgYT10aGlzLnNoYXBlW25dO2Zvcig7YSBpbnN0YW5jZW9mIFA7KWE9YS5fZGVmLmlubmVyVHlwZTt0W25dPWF9fSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfWtleW9mKCl7cmV0dXJuIFR0KHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fVQuY3JlYXRlPShyLGUpPT5uZXcgVCh7c2hhcGU6KCk9PnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KSxULnN0cmljdENyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOigpPT5yLHVua25vd25LZXlzOiJzdHJpY3QiLGNhdGNoYWxsOkwuY3JlYXRlKCksdHlwZU5hbWU6eS5ab2RPYmplY3QsLi4udihlKX0pLFQubGF6eWNyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KTtjbGFzcyBNZSBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksbj10aGlzLl9kZWYub3B0aW9ucztmdW5jdGlvbiBzKGEpe2Zvcihjb25zdCBvIG9mIGEpaWYoby5yZXN1bHQuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gby5yZXN1bHQ7Zm9yKGNvbnN0IG8gb2YgYSlpZihvLnJlc3VsdC5zdGF0dXM9PT0iZGlydHkiKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5vLmN0eC5jb21tb24uaXNzdWVzKSxvLnJlc3VsdDtjb25zdCBpPWEubWFwKG89Pm5ldyBBKG8uY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczppfSksZ31pZih0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwobi5tYXAoYXN5bmMgYT0+e2NvbnN0IGk9ey4uLnQsY29tbW9uOnsuLi50LmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfTtyZXR1cm57cmVzdWx0OmF3YWl0IGEuX3BhcnNlQXN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDppfSksY3R4Oml9fSkpLnRoZW4ocyk7e2xldCBhO2NvbnN0IGk9W107Zm9yKGNvbnN0IGMgb2Ygbil7Y29uc3QgdT17Li4udCxjb21tb246ey4uLnQuY29tbW9uLGlzc3VlczpbXX0scGFyZW50Om51bGx9LGw9Yy5fcGFyc2VTeW5jKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dX0pO2lmKGwuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gbDtsLnN0YXR1cz09PSJkaXJ0eSImJiFhJiYoYT17cmVzdWx0OmwsY3R4OnV9KSx1LmNvbW1vbi5pc3N1ZXMubGVuZ3RoJiZpLnB1c2godS5jb21tb24uaXNzdWVzKX1pZihhKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5hLmN0eC5jb21tb24uaXNzdWVzKSxhLnJlc3VsdDtjb25zdCBvPWkubWFwKGM9Pm5ldyBBKGMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpvfSksZ319Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fU1lLmNyZWF0ZT0ocixlKT0+bmV3IE1lKHtvcHRpb25zOnIsdHlwZU5hbWU6eS5ab2RVbmlvbiwuLi52KGUpfSk7Y29uc3Qgej1yPT5yIGluc3RhbmNlb2YgTmU/eihyLnNjaGVtYSk6ciBpbnN0YW5jZW9mIEM/eihyLmlubmVyVHlwZSgpKTpyIGluc3RhbmNlb2YgQWU/W3IudmFsdWVdOnIgaW5zdGFuY2VvZiBHP3Iub3B0aW9uczpyIGluc3RhbmNlb2YgRWU/eC5vYmplY3RWYWx1ZXMoci5lbnVtKTpyIGluc3RhbmNlb2YgUmU/eihyLl9kZWYuaW5uZXJUeXBlKTpyIGluc3RhbmNlb2YgVGU/W3ZvaWQgMF06ciBpbnN0YW5jZW9mICRlP1tudWxsXTpyIGluc3RhbmNlb2YgUD9bdm9pZCAwLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBKP1tudWxsLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBvdHx8ciBpbnN0YW5jZW9mIEllP3ooci51bndyYXAoKSk6ciBpbnN0YW5jZW9mIENlP3ooci5fZGVmLmlubmVyVHlwZSk6W107Y2xhc3MgRmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztjb25zdCBuPXRoaXMuZGlzY3JpbWluYXRvcixzPXQuZGF0YVtuXSxhPXRoaXMub3B0aW9uc01hcC5nZXQocyk7cmV0dXJuIGE/dC5jb21tb24uYXN5bmM/YS5fcGFyc2VBc3luYyh7ZGF0YTp0LmRhdGEscGF0aDp0LnBhdGgscGFyZW50OnR9KTphLl9wYXJzZVN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDp0fSk6KGgodCx7Y29kZTpkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSkscGF0aDpbbl19KSxnKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsdCxuKXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgaT16KGEuc2hhcGVbZV0pO2lmKCFpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgbyBvZiBpKXtpZihzLmhhcyhvKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcobyl9YCk7cy5zZXQobyxhKX19cmV0dXJuIG5ldyBGZSh7dHlwZU5hbWU6eS5ab2REaXNjcmltaW5hdGVkVW5pb24sZGlzY3JpbWluYXRvcjplLG9wdGlvbnM6dCxvcHRpb25zTWFwOnMsLi4udihuKX0pfX1mdW5jdGlvbiBpdChyLGUpe2NvbnN0IHQ9QihyKSxuPUIoZSk7aWYocj09PWUpcmV0dXJue3ZhbGlkOiEwLGRhdGE6cn07aWYodD09PWYub2JqZWN0JiZuPT09Zi5vYmplY3Qpe2NvbnN0IHM9eC5vYmplY3RLZXlzKGUpLGE9eC5vYmplY3RLZXlzKHIpLmZpbHRlcihvPT5zLmluZGV4T2YobykhPT0tMSksaT17Li4uciwuLi5lfTtmb3IoY29uc3QgbyBvZiBhKXtjb25zdCBjPWl0KHJbb10sZVtvXSk7aWYoIWMudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtpW29dPWMuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTppfX1lbHNlIGlmKHQ9PT1mLmFycmF5JiZuPT09Zi5hcnJheSl7aWYoci5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IHM9W107Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2NvbnN0IGk9clthXSxvPWVbYV0sYz1pdChpLG8pO2lmKCFjLnZhbGlkKXJldHVybnt2YWxpZDohMX07cy5wdXNoKGMuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6c319ZWxzZSByZXR1cm4gdD09PWYuZGF0ZSYmbj09PWYuZGF0ZSYmK3I9PStlP3t2YWxpZDohMCxkYXRhOnJ9Ont2YWxpZDohMX19Y2xhc3MgRGUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHM9KGEsaSk9PntpZihudChhKXx8bnQoaSkpcmV0dXJuIGc7Y29uc3Qgbz1pdChhLnZhbHVlLGkudmFsdWUpO3JldHVybiBvLnZhbGlkPygoc3QoYSl8fHN0KGkpKSYmdC5kaXJ0eSgpLHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvLmRhdGF9KTooaChuLHtjb2RlOmQuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSxnKX07cmV0dXJuIG4uY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSldKS50aGVuKChbYSxpXSk9PnMoYSxpKSk6cyh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pKX19RGUuY3JlYXRlPShyLGUsdCk9Pm5ldyBEZSh7bGVmdDpyLHJpZ2h0OmUsdHlwZU5hbWU6eS5ab2RJbnRlcnNlY3Rpb24sLi4udih0KX0pO2NsYXNzIFcgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYuYXJyYXkpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmFycmF5LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGc7aWYobi5kYXRhLmxlbmd0aDx0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKXJldHVybiBoKG4se2NvZGU6ZC50b29fc21hbGwsbWluaW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxnOyF0aGlzLl9kZWYucmVzdCYmbi5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYoaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHQuZGlydHkoKSk7Y29uc3QgYT1bLi4ubi5kYXRhXS5tYXAoKGksbyk9Pntjb25zdCBjPXRoaXMuX2RlZi5pdGVtc1tvXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGM/Yy5fcGFyc2UobmV3IFkobixpLG4ucGF0aCxvKSk6bnVsbH0pLmZpbHRlcihpPT4hIWkpO3JldHVybiBuLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChhKS50aGVuKGk9PkQubWVyZ2VBcnJheSh0LGkpKTpELm1lcmdlQXJyYXkodCxhKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QoZSl7cmV0dXJuIG5ldyBXKHsuLi50aGlzLl9kZWYscmVzdDplfSl9fVcuY3JlYXRlPShyLGUpPT57aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgVyh7aXRlbXM6cix0eXBlTmFtZTp5LlpvZFR1cGxlLHJlc3Q6bnVsbCwuLi52KGUpfSl9O2NsYXNzIE9lIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPVtdLGE9dGhpcy5fZGVmLmtleVR5cGUsaT10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBvIGluIG4uZGF0YSlzLnB1c2goe2tleTphLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLG8pKSx2YWx1ZTppLl9wYXJzZShuZXcgWShuLG4uZGF0YVtvXSxuLnBhdGgsbykpLGFsd2F5c1NldDpvIGluIG4uZGF0YX0pO3JldHVybiBuLmNvbW1vbi5hc3luYz9ELm1lcmdlT2JqZWN0QXN5bmModCxzKTpELm1lcmdlT2JqZWN0U3luYyh0LHMpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLHQsbil7cmV0dXJuIHQgaW5zdGFuY2VvZiBfP25ldyBPZSh7a2V5VHlwZTplLHZhbHVlVHlwZTp0LHR5cGVOYW1lOnkuWm9kUmVjb3JkLC4uLnYobil9KTpuZXcgT2Uoe2tleVR5cGU6RS5jcmVhdGUoKSx2YWx1ZVR5cGU6ZSx0eXBlTmFtZTp5LlpvZFJlY29yZCwuLi52KHQpfSl9fWNsYXNzIEJlIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYubWFwKXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5tYXAscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPXRoaXMuX2RlZi5rZXlUeXBlLGE9dGhpcy5fZGVmLnZhbHVlVHlwZSxpPVsuLi5uLmRhdGEuZW50cmllcygpXS5tYXAoKFtvLGNdLHUpPT4oe2tleTpzLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLFt1LCJrZXkiXSkpLHZhbHVlOmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsW3UsInZhbHVlIl0pKX0pKTtpZihuLmNvbW1vbi5hc3luYyl7Y29uc3Qgbz1uZXcgTWFwO3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntmb3IoY29uc3QgYyBvZiBpKXtjb25zdCB1PWF3YWl0IGMua2V5LGw9YXdhaXQgYy52YWx1ZTtpZih1LnN0YXR1cz09PSJhYm9ydGVkInx8bC5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7KHUuc3RhdHVzPT09ImRpcnR5Inx8bC5zdGF0dXM9PT0iZGlydHkiKSYmdC5kaXJ0eSgpLG8uc2V0KHUudmFsdWUsbC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOm99fSl9ZWxzZXtjb25zdCBvPW5ldyBNYXA7Zm9yKGNvbnN0IGMgb2YgaSl7Y29uc3QgdT1jLmtleSxsPWMudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnOyh1LnN0YXR1cz09PSJkaXJ0eSJ8fGwuc3RhdHVzPT09ImRpcnR5IikmJnQuZGlydHkoKSxvLnNldCh1LnZhbHVlLGwudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX19fUJlLmNyZWF0ZT0ocixlLHQpPT5uZXcgQmUoe3ZhbHVlVHlwZTplLGtleVR5cGU6cix0eXBlTmFtZTp5LlpvZE1hcCwuLi52KHQpfSk7Y2xhc3MgWCBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e3N0YXR1czp0LGN0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09Zi5zZXQpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnNldCxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnO2NvbnN0IHM9dGhpcy5fZGVmO3MubWluU2l6ZSE9PW51bGwmJm4uZGF0YS5zaXplPHMubWluU2l6ZS52YWx1ZSYmKGgobix7Y29kZTpkLnRvb19zbWFsbCxtaW5pbXVtOnMubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOnMubWluU2l6ZS5tZXNzYWdlfSksdC5kaXJ0eSgpKSxzLm1heFNpemUhPT1udWxsJiZuLmRhdGEuc2l6ZT5zLm1heFNpemUudmFsdWUmJihoKG4se2NvZGU6ZC50b29fYmlnLG1heGltdW06cy5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5tYXhTaXplLm1lc3NhZ2V9KSx0LmRpcnR5KCkpO2NvbnN0IGE9dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBpKGMpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgbCBvZiBjKXtpZihsLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZztsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSx1LmFkZChsLnZhbHVlKX1yZXR1cm57c3RhdHVzOnQudmFsdWUsdmFsdWU6dX19Y29uc3Qgbz1bLi4ubi5kYXRhLnZhbHVlcygpXS5tYXAoKGMsdSk9PmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsdSkpKTtyZXR1cm4gbi5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihjPT5pKGMpKTppKG8pfW1pbihlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1heFNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfXNpemUoZSx0KXtyZXR1cm4gdGhpcy5taW4oZSx0KS5tYXgoZSx0KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WC5jcmVhdGU9KHIsZSk9Pm5ldyBYKHt2YWx1ZVR5cGU6cixtaW5TaXplOm51bGwsbWF4U2l6ZTpudWxsLHR5cGVOYW1lOnkuWm9kU2V0LC4uLnYoZSl9KTtjbGFzcyBkZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMudmFsaWRhdGU9dGhpcy5pbXBsZW1lbnR9X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYodC5wYXJzZWRUeXBlIT09Zi5mdW5jdGlvbilyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuZnVuY3Rpb24scmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztmdW5jdGlvbiBuKG8sYyl7cmV0dXJuIFZlKHtkYXRhOm8scGF0aDp0LnBhdGgsZXJyb3JNYXBzOlt0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsdC5zY2hlbWFFcnJvck1hcCxQZSgpLGllXS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6ZC5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjpjfX0pfWZ1bmN0aW9uIHMobyxjKXtyZXR1cm4gVmUoe2RhdGE6byxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLFBlKCksaWVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpkLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmN9fSl9Y29uc3QgYT17ZXJyb3JNYXA6dC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxpPXQuZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIGxlKXtjb25zdCBvPXRoaXM7cmV0dXJuIE8oYXN5bmMgZnVuY3Rpb24oLi4uYyl7Y29uc3QgdT1uZXcgQShbXSksbD1hd2FpdCBvLl9kZWYuYXJncy5wYXJzZUFzeW5jKGMsYSkuY2F0Y2goTT0+e3Rocm93IHUuYWRkSXNzdWUobihjLE0pKSx1fSksaz1hd2FpdCBSZWZsZWN0LmFwcGx5KGksdGhpcyxsKTtyZXR1cm4gYXdhaXQgby5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoayxhKS5jYXRjaChNPT57dGhyb3cgdS5hZGRJc3N1ZShzKGssTSkpLHV9KX0pfWVsc2V7Y29uc3Qgbz10aGlzO3JldHVybiBPKGZ1bmN0aW9uKC4uLmMpe2NvbnN0IHU9by5fZGVmLmFyZ3Muc2FmZVBhcnNlKGMsYSk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgQShbbihjLHUuZXJyb3IpXSk7Y29uc3QgbD1SZWZsZWN0LmFwcGx5KGksdGhpcyx1LmRhdGEpLGs9by5fZGVmLnJldHVybnMuc2FmZVBhcnNlKGwsYSk7aWYoIWsuc3VjY2Vzcyl0aHJvdyBuZXcgQShbcyhsLGsuZXJyb3IpXSk7cmV0dXJuIGsuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYsYXJnczpXLmNyZWF0ZShlKS5yZXN0KFEuY3JlYXRlKCkpfSl9cmV0dXJucyhlKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYscmV0dXJuczplfSl9aW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0cmljdEltcGxlbWVudChlKXtyZXR1cm4gdGhpcy5wYXJzZShlKX1zdGF0aWMgY3JlYXRlKGUsdCxuKXtyZXR1cm4gbmV3IGRlKHthcmdzOmV8fFcuY3JlYXRlKFtdKS5yZXN0KFEuY3JlYXRlKCkpLHJldHVybnM6dHx8US5jcmVhdGUoKSx0eXBlTmFtZTp5LlpvZEZ1bmN0aW9uLC4uLnYobil9KX19Y2xhc3MgTmUgZXh0ZW5kcyBfe2dldCBzY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCkuX3BhcnNlKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfX1OZS5jcmVhdGU9KHIsZSk9Pm5ldyBOZSh7Z2V0dGVyOnIsdHlwZU5hbWU6eS5ab2RMYXp5LC4uLnYoZSl9KTtjbGFzcyBBZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKGUuZGF0YSE9PXRoaXMuX2RlZi52YWx1ZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtyZWNlaXZlZDp0LmRhdGEsY29kZTpkLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSxnfXJldHVybntzdGF0dXM6InZhbGlkIix2YWx1ZTplLmRhdGF9fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWV9fUFlLmNyZWF0ZT0ocixlKT0+bmV3IEFlKHt2YWx1ZTpyLHR5cGVOYW1lOnkuWm9kTGl0ZXJhbCwuLi52KGUpfSk7ZnVuY3Rpb24gVHQocixlKXtyZXR1cm4gbmV3IEcoe3ZhbHVlczpyLHR5cGVOYW1lOnkuWm9kRW51bSwuLi52KGUpfSl9Y2xhc3MgRyBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGJlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2lmKHR5cGVvZiBlLmRhdGEhPSJzdHJpbmciKXtjb25zdCB0PXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLG49dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gaCh0LHtleHBlY3RlZDp4LmpvaW5WYWx1ZXMobikscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlLGNvZGU6ZC5pbnZhbGlkX3R5cGV9KSxnfWlmKExlKHRoaXMsYmUpfHx4dCh0aGlzLGJlLG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcykpLCFMZSh0aGlzLGJlKS5oYXMoZS5kYXRhKSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKSxuPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIGgodCx7cmVjZWl2ZWQ6dC5kYXRhLGNvZGU6ZC5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpufSksZ31yZXR1cm4gTyhlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYudmFsdWVzKWVbdF09dDtyZXR1cm4gZX1leHRyYWN0KGUsdD10aGlzLl9kZWYpe3JldHVybiBHLmNyZWF0ZShlLHsuLi50aGlzLl9kZWYsLi4udH0pfWV4Y2x1ZGUoZSx0PXRoaXMuX2RlZil7cmV0dXJuIEcuY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpLHsuLi50aGlzLl9kZWYsLi4udH0pfX1iZT1uZXcgV2Vha01hcCxHLmNyZWF0ZT1UdDtjbGFzcyBFZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHdlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2NvbnN0IHQ9eC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyksbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtpZihuLnBhcnNlZFR5cGUhPT1mLnN0cmluZyYmbi5wYXJzZWRUeXBlIT09Zi5udW1iZXIpe2NvbnN0IHM9eC5vYmplY3RWYWx1ZXModCk7cmV0dXJuIGgobix7ZXhwZWN0ZWQ6eC5qb2luVmFsdWVzKHMpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOmQuaW52YWxpZF90eXBlfSksZ31pZihMZSh0aGlzLHdlKXx8eHQodGhpcyx3ZSxuZXcgU2V0KHguZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksIUxlKHRoaXMsd2UpLmhhcyhlLmRhdGEpKXtjb25zdCBzPXgub2JqZWN0VmFsdWVzKHQpO3JldHVybiBoKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOmQuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6c30pLGd9cmV0dXJuIE8oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13ZT1uZXcgV2Vha01hcCxFZS5jcmVhdGU9KHIsZSk9Pm5ldyBFZSh7dmFsdWVzOnIsdHlwZU5hbWU6eS5ab2ROYXRpdmVFbnVtLC4uLnYoZSl9KTtjbGFzcyBsZSBleHRlbmRzIF97dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYucHJvbWlzZSYmdC5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYucHJvbWlzZSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2NvbnN0IG49dC5wYXJzZWRUeXBlPT09Zi5wcm9taXNlP3QuZGF0YTpQcm9taXNlLnJlc29sdmUodC5kYXRhKTtyZXR1cm4gTyhuLnRoZW4ocz0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhzLHtwYXRoOnQucGF0aCxlcnJvck1hcDp0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1sZS5jcmVhdGU9KHIsZSk9Pm5ldyBsZSh7dHlwZTpyLHR5cGVOYW1lOnkuWm9kUHJvbWlzZSwuLi52KGUpfSk7Y2xhc3MgQyBleHRlbmRzIF97aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT15LlpvZEVmZmVjdHM/dGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKCk6dGhpcy5fZGVmLnNjaGVtYX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOnQsY3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZi5lZmZlY3R8fG51bGwsYT17YWRkSXNzdWU6aT0+e2gobixpKSxpLmZhdGFsP3QuYWJvcnQoKTp0LmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIG4ucGF0aH19O2lmKGEuYWRkSXNzdWU9YS5hZGRJc3N1ZS5iaW5kKGEpLHMudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgaT1zLnRyYW5zZm9ybShuLmRhdGEsYSk7aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKS50aGVuKGFzeW5jIG89PntpZih0LnZhbHVlPT09ImFib3J0ZWQiKXJldHVybiBnO2NvbnN0IGM9YXdhaXQgdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpvLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGMuc3RhdHVzPT09ImFib3J0ZWQiP2c6Yy5zdGF0dXM9PT0iZGlydHkifHx0LnZhbHVlPT09ImRpcnR5Ij9vZShjLnZhbHVlKTpjfSk7e2lmKHQudmFsdWU9PT0iYWJvcnRlZCIpcmV0dXJuIGc7Y29uc3Qgbz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6aSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nOm8uc3RhdHVzPT09ImRpcnR5Inx8dC52YWx1ZT09PSJkaXJ0eSI/b2Uoby52YWx1ZSk6b319aWYocy50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBpPW89Pntjb25zdCBjPXMucmVmaW5lbWVudChvLGEpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBvfTtpZihuLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBvPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gby5zdGF0dXM9PT0iYWJvcnRlZCI/Zzooby5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksaShvLnZhbHVlKSx7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pfWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSkudGhlbihvPT5vLnN0YXR1cz09PSJhYm9ydGVkIj9nOihvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxpKG8udmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pKSkpfWlmKHMudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKG4uY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGk9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO2lmKCF4ZShpKSlyZXR1cm4gaTtjb25zdCBvPXMudHJhbnNmb3JtKGkudmFsdWUsYSk7aWYobyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLnRoZW4oaT0+eGUoaSk/UHJvbWlzZS5yZXNvbHZlKHMudHJhbnNmb3JtKGkudmFsdWUsYSkpLnRoZW4obz0+KHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfSkpOmkpO3guYXNzZXJ0TmV2ZXIocyl9fUMuY3JlYXRlPShyLGUsdCk9Pm5ldyBDKHtzY2hlbWE6cix0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4udih0KX0pLEMuY3JlYXRlV2l0aFByZXByb2Nlc3M9KHIsZSx0KT0+bmV3IEMoe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnJ9LHR5cGVOYW1lOnkuWm9kRWZmZWN0cywuLi52KHQpfSk7Y2xhc3MgUCBleHRlbmRzIF97X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09Zi51bmRlZmluZWQ/Tyh2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1QLmNyZWF0ZT0ocixlKT0+bmV3IFAoe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kT3B0aW9uYWwsLi4udihlKX0pO2NsYXNzIEogZXh0ZW5kcyBfe19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PWYubnVsbD9PKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1KLmNyZWF0ZT0ocixlKT0+bmV3IEooe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kTnVsbGFibGUsLi4udihlKX0pO2NsYXNzIFJlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtsZXQgbj10LmRhdGE7cmV0dXJuIHQucGFyc2VkVHlwZT09PWYudW5kZWZpbmVkJiYobj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOm4scGF0aDp0LnBhdGgscGFyZW50OnR9KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fVJlLmNyZWF0ZT0ocixlKT0+bmV3IFJlKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4udihlKX0pO2NsYXNzIENlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxuPXsuLi50LGNvbW1vbjp7Li4udC5jb21tb24saXNzdWVzOltdfX0scz10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnsuLi5ufX0pO3JldHVybiBrZShzKT9zLnRoZW4oYT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTphLnN0YXR1cz09PSJ2YWxpZCI/YS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTpzLnN0YXR1cz09PSJ2YWxpZCI/cy52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfX1yZW1vdmVDYXRjaCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1DZS5jcmVhdGU9KHIsZSk9Pm5ldyBDZSh7aW5uZXJUeXBlOnIsdHlwZU5hbWU6eS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiBlLmNhdGNoPT0iZnVuY3Rpb24iP2UuY2F0Y2g6KCk9PmUuY2F0Y2gsLi4udihlKX0pO2NsYXNzIEhlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYubmFuKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5uYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19SGUuY3JlYXRlPXI9Pm5ldyBIZSh7dHlwZU5hbWU6eS5ab2ROYU4sLi4udihyKX0pO2NvbnN0IFNyPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3Mgb3QgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLG49dC5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6bixwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgWmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybihhc3luYygpPT57Y29uc3QgYT1hd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGEuc3RhdHVzPT09ImFib3J0ZWQiP2c6YS5zdGF0dXM9PT0iZGlydHkiPyh0LmRpcnR5KCksb2UoYS52YWx1ZSkpOnRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe2RhdGE6YS52YWx1ZSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfSkoKTt7Y29uc3Qgcz10aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/ZzpzLnN0YXR1cz09PSJkaXJ0eSI/KHQuZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6cy52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTpzLnZhbHVlLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXN0YXRpYyBjcmVhdGUoZSx0KXtyZXR1cm4gbmV3IFplKHtpbjplLG91dDp0LHR5cGVOYW1lOnkuWm9kUGlwZWxpbmV9KX19Y2xhc3MgSWUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdCB0PXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLG49cz0+KHhlKHMpJiYocy52YWx1ZT1PYmplY3QuZnJlZXplKHMudmFsdWUpKSxzKTtyZXR1cm4ga2UodCk/dC50aGVuKHM9Pm4ocykpOm4odCl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUllLmNyZWF0ZT0ocixlKT0+bmV3IEllKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZFJlYWRvbmx5LC4uLnYoZSl9KTtmdW5jdGlvbiAkdChyLGU9e30sdCl7cmV0dXJuIHI/Y2UuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKG4scyk9Pnt2YXIgYSxpO2lmKCFyKG4pKXtjb25zdCBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmUsYz0oaT0oYT1vLmZhdGFsKSE9PW51bGwmJmEhPT12b2lkIDA/YTp0KSE9PW51bGwmJmkhPT12b2lkIDA/aTohMCx1PXR5cGVvZiBvPT0ic3RyaW5nIj97bWVzc2FnZTpvfTpvO3MuYWRkSXNzdWUoe2NvZGU6ImN1c3RvbSIsLi4udSxmYXRhbDpjfSl9fSk6Y2UuY3JlYXRlKCl9Y29uc3QgVHI9e29iamVjdDpULmxhenljcmVhdGV9O3ZhciB5OyhmdW5jdGlvbihyKXtyLlpvZFN0cmluZz0iWm9kU3RyaW5nIixyLlpvZE51bWJlcj0iWm9kTnVtYmVyIixyLlpvZE5hTj0iWm9kTmFOIixyLlpvZEJpZ0ludD0iWm9kQmlnSW50IixyLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHIuWm9kRGF0ZT0iWm9kRGF0ZSIsci5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsci5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsci5ab2ROdWxsPSJab2ROdWxsIixyLlpvZEFueT0iWm9kQW55IixyLlpvZFVua25vd249IlpvZFVua25vd24iLHIuWm9kTmV2ZXI9IlpvZE5ldmVyIixyLlpvZFZvaWQ9IlpvZFZvaWQiLHIuWm9kQXJyYXk9IlpvZEFycmF5IixyLlpvZE9iamVjdD0iWm9kT2JqZWN0IixyLlpvZFVuaW9uPSJab2RVbmlvbiIsci5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsci5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsci5ab2RUdXBsZT0iWm9kVHVwbGUiLHIuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHIuWm9kTWFwPSJab2RNYXAiLHIuWm9kU2V0PSJab2RTZXQiLHIuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixyLlpvZExhenk9IlpvZExhenkiLHIuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsci5ab2RFbnVtPSJab2RFbnVtIixyLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHIuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsci5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHIuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixyLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHIuWm9kQ2F0Y2g9IlpvZENhdGNoIixyLlpvZFByb21pc2U9IlpvZFByb21pc2UiLHIuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsci5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHIuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKHl8fCh5PXt9KSk7Y29uc3QgJHI9KHIsZT17bWVzc2FnZTpgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7ci5uYW1lfWB9KT0+JHQodD0+dCBpbnN0YW5jZW9mIHIsZSksTXQ9RS5jcmVhdGUsRHQ9SC5jcmVhdGUsTXI9SGUuY3JlYXRlLERyPXEuY3JlYXRlLE90PVNlLmNyZWF0ZSxPcj1LLmNyZWF0ZSxOcj16ZS5jcmVhdGUsQXI9VGUuY3JlYXRlLEVyPSRlLmNyZWF0ZSxScj1jZS5jcmVhdGUsQ3I9US5jcmVhdGUsWnI9TC5jcmVhdGUsSXI9VWUuY3JlYXRlLGpyPVIuY3JlYXRlLFlyPVQuY3JlYXRlLFdyPVQuc3RyaWN0Q3JlYXRlLFByPU1lLmNyZWF0ZSxWcj1GZS5jcmVhdGUsTHI9RGUuY3JlYXRlLHpyPVcuY3JlYXRlLFVyPU9lLmNyZWF0ZSxGcj1CZS5jcmVhdGUsQnI9WC5jcmVhdGUsSHI9ZGUuY3JlYXRlLHFyPU5lLmNyZWF0ZSxHcj1BZS5jcmVhdGUsSnI9Ry5jcmVhdGUsS3I9RWUuY3JlYXRlLFFyPWxlLmNyZWF0ZSxOdD1DLmNyZWF0ZSxYcj1QLmNyZWF0ZSxlbj1KLmNyZWF0ZSx0bj1DLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLHJuPVplLmNyZWF0ZTt2YXIgbT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6aWUsc2V0RXJyb3JNYXA6b3IsZ2V0RXJyb3JNYXA6UGUsbWFrZUlzc3VlOlZlLEVNUFRZX1BBVEg6Y3IsYWRkSXNzdWVUb0NvbnRleHQ6aCxQYXJzZVN0YXR1czpELElOVkFMSUQ6ZyxESVJUWTpvZSxPSzpPLGlzQWJvcnRlZDpudCxpc0RpcnR5OnN0LGlzVmFsaWQ6eGUsaXNBc3luYzprZSxnZXQgdXRpbCgpe3JldHVybiB4fSxnZXQgb2JqZWN0VXRpbCgpe3JldHVybiBydH0sWm9kUGFyc2VkVHlwZTpmLGdldFBhcnNlZFR5cGU6Qixab2RUeXBlOl8sZGF0ZXRpbWVSZWdleDpTdCxab2RTdHJpbmc6RSxab2ROdW1iZXI6SCxab2RCaWdJbnQ6cSxab2RCb29sZWFuOlNlLFpvZERhdGU6Syxab2RTeW1ib2w6emUsWm9kVW5kZWZpbmVkOlRlLFpvZE51bGw6JGUsWm9kQW55OmNlLFpvZFVua25vd246USxab2ROZXZlcjpMLFpvZFZvaWQ6VWUsWm9kQXJyYXk6Uixab2RPYmplY3Q6VCxab2RVbmlvbjpNZSxab2REaXNjcmltaW5hdGVkVW5pb246RmUsWm9kSW50ZXJzZWN0aW9uOkRlLFpvZFR1cGxlOlcsWm9kUmVjb3JkOk9lLFpvZE1hcDpCZSxab2RTZXQ6WCxab2RGdW5jdGlvbjpkZSxab2RMYXp5Ok5lLFpvZExpdGVyYWw6QWUsWm9kRW51bTpHLFpvZE5hdGl2ZUVudW06RWUsWm9kUHJvbWlzZTpsZSxab2RFZmZlY3RzOkMsWm9kVHJhbnNmb3JtZXI6Qyxab2RPcHRpb25hbDpQLFpvZE51bGxhYmxlOkosWm9kRGVmYXVsdDpSZSxab2RDYXRjaDpDZSxab2ROYU46SGUsQlJBTkQ6U3IsWm9kQnJhbmRlZDpvdCxab2RQaXBlbGluZTpaZSxab2RSZWFkb25seTpJZSxjdXN0b206JHQsU2NoZW1hOl8sWm9kU2NoZW1hOl8sbGF0ZTpUcixnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIHl9LGNvZXJjZTp7c3RyaW5nOnI9PkUuY3JlYXRlKHsuLi5yLGNvZXJjZTohMH0pLG51bWJlcjpyPT5ILmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxib29sZWFuOnI9PlNlLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxiaWdpbnQ6cj0+cS5jcmVhdGUoey4uLnIsY29lcmNlOiEwfSksZGF0ZTpyPT5LLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KX0sYW55OlJyLGFycmF5OmpyLGJpZ2ludDpEcixib29sZWFuOk90LGRhdGU6T3IsZGlzY3JpbWluYXRlZFVuaW9uOlZyLGVmZmVjdDpOdCxlbnVtOkpyLGZ1bmN0aW9uOkhyLGluc3RhbmNlb2Y6JHIsaW50ZXJzZWN0aW9uOkxyLGxhenk6cXIsbGl0ZXJhbDpHcixtYXA6RnIsbmFuOk1yLG5hdGl2ZUVudW06S3IsbmV2ZXI6WnIsbnVsbDpFcixudWxsYWJsZTplbixudW1iZXI6RHQsb2JqZWN0OllyLG9ib29sZWFuOigpPT5PdCgpLm9wdGlvbmFsKCksb251bWJlcjooKT0+RHQoKS5vcHRpb25hbCgpLG9wdGlvbmFsOlhyLG9zdHJpbmc6KCk9Pk10KCkub3B0aW9uYWwoKSxwaXBlbGluZTpybixwcmVwcm9jZXNzOnRuLHByb21pc2U6UXIscmVjb3JkOlVyLHNldDpCcixzdHJpY3RPYmplY3Q6V3Isc3RyaW5nOk10LHN5bWJvbDpOcix0cmFuc2Zvcm1lcjpOdCx0dXBsZTp6cix1bmRlZmluZWQ6QXIsdW5pb246UHIsdW5rbm93bjpDcix2b2lkOklyLE5FVkVSOmcsWm9kSXNzdWVDb2RlOmQscXVvdGVsZXNzSnNvbjppcixab2RFcnJvcjpBfSk7bS5vYmplY3Qoe251Y2xlb3RpZGVTZXF1ZW5jZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSksZ2VuZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSl9KTtjb25zdCBubj1tLmVudW0oWyJhc2NlbmRpbmciLCJkZXNjZW5kaW5nIl0pLHNuPW0ub2JqZWN0KHtmaWVsZDptLnN0cmluZygpLHR5cGU6bm59KTttLm9iamVjdCh7bGltaXQ6bS5udW1iZXIoKS5vcHRpb25hbCgpLG9mZnNldDptLm51bWJlcigpLm9wdGlvbmFsKCksZmllbGRzOm0uYXJyYXkobS5zdHJpbmcoKSkub3B0aW9uYWwoKSxvcmRlckJ5Om0uYXJyYXkoc24pLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChtLnVuaW9uKFttLmJvb2xlYW4oKSxtLnVuZGVmaW5lZCgpLG0uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKSxtLmFycmF5KG0uc3RyaW5nKCkpXSkpLmV4dGVuZCh7bWluUHJvcG9ydGlvbjptLm51bWJlcigpLm9wdGlvbmFsKCl9KTtjb25zdCBhbj1tLm9iamVjdCh7bXV0YXRpb246bS5zdHJpbmcoKSxwcm9wb3J0aW9uOm0ubnVtYmVyKCksY291bnQ6bS5udW1iZXIoKSxzZXF1ZW5jZU5hbWU6bS51bmlvbihbbS5zdHJpbmcoKSxtLm51bGwoKV0pLG11dGF0aW9uRnJvbTptLnN0cmluZygpLG11dGF0aW9uVG86bS5zdHJpbmcoKSxwb3NpdGlvbjptLm51bWJlcigpfSksb249Y3QobS5hcnJheShhbikpLGNuPW0ub2JqZWN0KHtpbnNlcnRpb246bS5zdHJpbmcoKSxjb3VudDptLm51bWJlcigpLGluc2VydGVkU3ltYm9sczptLnN0cmluZygpLHBvc2l0aW9uOm0ubnVtYmVyKCksc2VxdWVuY2VOYW1lOm0udW5pb24oW20uc3RyaW5nKCksbS5udWxsKCldKX0pO2N0KG0uYXJyYXkoY24pKTtjb25zdCB1bj1tLm9iamVjdCh7Y291bnQ6bS5udW1iZXIoKX0pLmNhdGNoYWxsKG0udW5pb24oW20uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKV0pKSxkbj1jdChtLmFycmF5KHVuKSk7ZnVuY3Rpb24gY3Qocil7cmV0dXJuIG0ub2JqZWN0KHtkYXRhOnJ9KX1jb25zdCBBdD1tLm9iamVjdCh7dGl0bGU6bS5zdHJpbmcoKS5vcHRpb25hbCgpLHN0YXR1czptLm51bWJlcigpLGRldGFpbDptLnN0cmluZygpLm9wdGlvbmFsKCksdHlwZTptLnN0cmluZygpLGluc3RhbmNlOm0uc3RyaW5nKCkub3B0aW9uYWwoKX0pLGxuPW0ub2JqZWN0KHtlcnJvcjpBdH0pO2NsYXNzIHV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUpLHRoaXMuc3RhdHVzPXQsdGhpcy5yZXF1ZXN0ZWREYXRhPW4sdGhpcy5uYW1lPSJVbmtub3duTGFwaXNFcnJvciJ9fWNsYXNzIEV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4scyl7c3VwZXIoZSksdGhpcy5zdGF0dXM9dCx0aGlzLnByb2JsZW1EZXRhaWw9bix0aGlzLnJlcXVlc3RlZERhdGE9cyx0aGlzLm5hbWU9IkxhcGlzRXJyb3IifX1hc3luYyBmdW5jdGlvbiBobihyLGUsdCl7Y29uc3Qgbj1hd2FpdCBSdChwbihyKSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOnR9LCJhZ2dyZWdhdGVkIGRhdGEiKTtyZXR1cm4gZG4ucGFyc2UoYXdhaXQgbi5qc29uKCkpfWFzeW5jIGZ1bmN0aW9uIGZuKHIsZSx0LG4pe2NvbnN0IHM9YXdhaXQgUnQoeW4ocix0KSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOm59LGAke3R9IG11dGF0aW9uc2ApO3JldHVybiBvbi5wYXJzZShhd2FpdCBzLmpzb24oKSl9YXN5bmMgZnVuY3Rpb24gUnQocixlLHQpe3RyeXtjb25zdCBuPWF3YWl0IGZldGNoKHIsZSk7cmV0dXJuIGF3YWl0IG1uKG4sdCksbn1jYXRjaChuKXtjb25zdCBzPW4gaW5zdGFuY2VvZiBFcnJvcj9uLm1lc3NhZ2U6YCR7bn1gO3Rocm93IG5ldyB1dChgRmFpbGVkIHRvIGNvbm5lY3QgdG8gTEFQSVM6ICR7c31gLDUwMCx0KX19Y29uc3QgbW49YXN5bmMocixlKT0+e2lmKCFyLm9rKXtpZihyLnN0YXR1cz49NDAwJiZyLnN0YXR1czw1MDApe2NvbnN0IHQ9YXdhaXQgci5qc29uKCksbj1sbi5zYWZlUGFyc2UodCk7aWYobi5zdWNjZXNzKXRocm93IG5ldyBFdChyLnN0YXR1c1RleHQrbi5kYXRhLmVycm9yLmRldGFpbCxyLnN0YXR1cyxuLmRhdGEuZXJyb3IsZSk7Y29uc3Qgcz1BdC5zYWZlUGFyc2UodCk7dGhyb3cgcy5zdWNjZXNzP25ldyBFdChyLnN0YXR1c1RleHQrcy5kYXRhLmRldGFpbCxyLnN0YXR1cyxzLmRhdGEsZSk6bmV3IHV0KGAke3Iuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkodCl9YCxyLnN0YXR1cyxlKX10aHJvdyBuZXcgdXQoYCR7ci5zdGF0dXNUZXh0fTogJHtyLnN0YXR1c31gLHIuc3RhdHVzLGUpfX0scG49cj0+YCR7cn0vc2FtcGxlL2FnZ3JlZ2F0ZWRgLHluPShyLGUpPT5lPT09ImFtaW5vIGFjaWQiP2Ake3J9L3NhbXBsZS9hbWlub0FjaWRNdXRhdGlvbnNgOmAke3J9L3NhbXBsZS9udWNsZW90aWRlTXV0YXRpb25zYDtjbGFzcyBDdHtjb25zdHJ1Y3RvcihlLHQ9W10pe3RoaXMuZmlsdGVyPWUsdGhpcy5maWVsZHM9dH1hc3luYyBldmFsdWF0ZShlLHQpe2NvbnN0IG49KGF3YWl0IGhuKGUsey4uLnRoaXMuZmlsdGVyLGZpZWxkczp0aGlzLmZpZWxkc30sdCkpLmRhdGE7aWYoZ24obikpcmV0dXJue2NvbnRlbnQ6bn07dGhyb3cgbmV3IEVycm9yKCJBZ2dyZWdhdGVkIHJlc3BvbnNlIGRvZXMgbm90IGhhdmUgY291bnQiKX19ZnVuY3Rpb24gZ24ocil7cmV0dXJuIHIuZXZlcnkoZT0+dHlwZW9mIGU9PSJvYmplY3QiJiYiY291bnQiaW4gZSYmdHlwZW9mIGUuY291bnQ9PSJudW1iZXIiKX1jbGFzcyB2bntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5jaGlsZD1lLHRoaXMuZmllbGQ9dCx0aGlzLmFnZ3JlZ2F0ZT1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkscz1uZXcgTWFwO2Zvcihjb25zdCBpIG9mIG4uY29udGVudCl7Y29uc3Qgbz1pW3RoaXMuZmllbGRdO3MuaGFzKG8pfHxzLnNldChvLFtdKSxzLmdldChvKS5wdXNoKGkpfWNvbnN0IGE9bmV3IEFycmF5O2Zvcihjb25zdFssaV1vZiBzKWEucHVzaCh0aGlzLmFnZ3JlZ2F0ZShpKSk7cmV0dXJue2NvbnRlbnQ6YX19fWNsYXNzIF9uIGV4dGVuZHMgdm57Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsdCxzPT57bGV0IGE9MDtmb3IoY29uc3QgaSBvZiBzKWErPWlbbl07cmV0dXJue1t0XTpzWzBdW3RdLFtuXTphfX0pfX1jbGFzcyBkdHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY2hpbGQ9ZSx0aGlzLmZ1bmM9dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQubWFwKHRoaXMuZnVuYyl9fX1jbGFzcyB4biBleHRlbmRzIGR0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHM9Pih7Li4ucyxbbl06c1t0XX0pKX19Y2xhc3Mga257Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoaWxkPWUsdGhpcy5jb21wYXJlRm49dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbil9fX12YXIgWnQ9NjAsSXQ9WnQqNjAsanQ9SXQqMjQsYm49anQqNyxoZT0xZTMsbHQ9WnQqaGUsWXQ9SXQqaGUsd249anQqaGUsU249Ym4qaGUsaHQ9Im1pbGxpc2Vjb25kIixmZT0ic2Vjb25kIixtZT0ibWludXRlIixwZT0iaG91ciIsWj0iZGF5IixqZT0id2VlayIsST0ibW9udGgiLFd0PSJxdWFydGVyIixVPSJ5ZWFyIix5ZT0iZGF0ZSIsUHQ9IllZWVktTU0tRERUSEg6bW06c3NaIixWdD0iSW52YWxpZCBEYXRlIixUbj0vXihcZHs0fSlbLS9dPyhcZHsxLDJ9KT9bLS9dPyhcZHswLDJ9KVtUdFxzXSooXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Wy46XT8oXGQrKT8kLywkbj0vXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE1uPXtuYW1lOiJlbiIsd2Vla2RheXM6IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLG1vbnRoczoiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSxvcmRpbmFsOmZ1bmN0aW9uKGUpe3ZhciB0PVsidGgiLCJzdCIsIm5kIiwicmQiXSxuPWUlMTAwO3JldHVybiJbIitlKyh0WyhuLTIwKSUxMF18fHRbbl18fHRbMF0pKyJdIn19LGZ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1TdHJpbmcoZSk7cmV0dXJuIXN8fHMubGVuZ3RoPj10P2U6IiIrQXJyYXkodCsxLXMubGVuZ3RoKS5qb2luKG4pK2V9LERuPWZ1bmN0aW9uKGUpe3ZhciB0PS1lLnV0Y09mZnNldCgpLG49TWF0aC5hYnModCkscz1NYXRoLmZsb29yKG4vNjApLGE9biU2MDtyZXR1cm4odDw9MD8iKyI6Ii0iKStmdChzLDIsIjAiKSsiOiIrZnQoYSwyLCIwIil9LE9uPWZ1bmN0aW9uIHIoZSx0KXtpZihlLmRhdGUoKTx0LmRhdGUoKSlyZXR1cm4tcih0LGUpO3ZhciBuPSh0LnllYXIoKS1lLnllYXIoKSkqMTIrKHQubW9udGgoKS1lLm1vbnRoKCkpLHM9ZS5jbG9uZSgpLmFkZChuLEkpLGE9dC1zPDAsaT1lLmNsb25lKCkuYWRkKG4rKGE/LTE6MSksSSk7cmV0dXJuKygtKG4rKHQtcykvKGE/cy1pOmktcykpfHwwKX0sTm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD9NYXRoLmNlaWwoZSl8fDA6TWF0aC5mbG9vcihlKX0sQW49ZnVuY3Rpb24oZSl7dmFyIHQ9e006SSx5OlUsdzpqZSxkOlosRDp5ZSxoOnBlLG06bWUsczpmZSxtczpodCxROld0fTtyZXR1cm4gdFtlXXx8U3RyaW5nKGV8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywiIil9LEVuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwfSxSbj17czpmdCx6OkRuLG06T24sYTpObixwOkFuLHU6RW59LFllPSJlbiIsZWU9e307ZWVbWWVdPU1uO3ZhciBMdD0iJGlzRGF5anNPYmplY3QiLG10PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2V8fCEhKGUmJmVbTHRdKX0scWU9ZnVuY3Rpb24gcihlLHQsbil7dmFyIHM7aWYoIWUpcmV0dXJuIFllO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIGE9ZS50b0xvd2VyQ2FzZSgpO2VlW2FdJiYocz1hKSx0JiYoZWVbYV09dCxzPWEpO3ZhciBpPWUuc3BsaXQoIi0iKTtpZighcyYmaS5sZW5ndGg+MSlyZXR1cm4gcihpWzBdKX1lbHNle3ZhciBvPWUubmFtZTtlZVtvXT1lLHM9b31yZXR1cm4hbiYmcyYmKFllPXMpLHN8fCFuJiZZZX0sdz1mdW5jdGlvbihlLHQpe2lmKG10KGUpKXJldHVybiBlLmNsb25lKCk7dmFyIG49dHlwZW9mIHQ9PSJvYmplY3QiP3Q6e307cmV0dXJuIG4uZGF0ZT1lLG4uYXJncz1hcmd1bWVudHMsbmV3IEdlKG4pfSxDbj1mdW5jdGlvbihlLHQpe3JldHVybiB3KGUse2xvY2FsZTp0LiRMLHV0Yzp0LiR1LHg6dC4keCwkb2Zmc2V0OnQuJG9mZnNldH0pfSxiPVJuO2IubD1xZSxiLmk9bXQsYi53PUNuO3ZhciBabj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGUsbj1lLnV0YztpZih0PT09bnVsbClyZXR1cm4gbmV3IERhdGUoTmFOKTtpZihiLnUodCkpcmV0dXJuIG5ldyBEYXRlO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0eXBlb2YgdD09InN0cmluZyImJiEvWiQvaS50ZXN0KHQpKXt2YXIgcz10Lm1hdGNoKFRuKTtpZihzKXt2YXIgYT1zWzJdLTF8fDAsaT0oc1s3XXx8IjAiKS5zdWJzdHJpbmcoMCwzKTtyZXR1cm4gbj9uZXcgRGF0ZShEYXRlLlVUQyhzWzFdLGEsc1szXXx8MSxzWzRdfHwwLHNbNV18fDAsc1s2XXx8MCxpKSk6bmV3IERhdGUoc1sxXSxhLHNbM118fDEsc1s0XXx8MCxzWzVdfHwwLHNbNl18fDAsaSl9fXJldHVybiBuZXcgRGF0ZSh0KX0sR2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQpe3RoaXMuJEw9cWUodC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KSx0aGlzLiR4PXRoaXMuJHh8fHQueHx8e30sdGhpc1tMdF09ITB9dmFyIGU9ci5wcm90b3R5cGU7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dGhpcy4kZD1abihuKSx0aGlzLmluaXQoKX0sZS5pbml0PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy4kZDt0aGlzLiR5PW4uZ2V0RnVsbFllYXIoKSx0aGlzLiRNPW4uZ2V0TW9udGgoKSx0aGlzLiREPW4uZ2V0RGF0ZSgpLHRoaXMuJFc9bi5nZXREYXkoKSx0aGlzLiRIPW4uZ2V0SG91cnMoKSx0aGlzLiRtPW4uZ2V0TWludXRlcygpLHRoaXMuJHM9bi5nZXRTZWNvbmRzKCksdGhpcy4kbXM9bi5nZXRNaWxsaXNlY29uZHMoKX0sZS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9TdHJpbmcoKSE9PVZ0fSxlLmlzU2FtZT1mdW5jdGlvbihuLHMpe3ZhciBhPXcobik7cmV0dXJuIHRoaXMuc3RhcnRPZihzKTw9YSYmYTw9dGhpcy5lbmRPZihzKX0sZS5pc0FmdGVyPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHcobik8dGhpcy5zdGFydE9mKHMpfSxlLmlzQmVmb3JlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5kT2Yocyk8dyhuKX0sZS4kZz1mdW5jdGlvbihuLHMsYSl7cmV0dXJuIGIudShuKT90aGlzW3NdOnRoaXMuc2V0KGEsbil9LGUudW5peD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9LGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLmdldFRpbWUoKX0sZS5zdGFydE9mPWZ1bmN0aW9uKG4scyl7dmFyIGE9dGhpcyxpPWIudShzKT8hMDpzLG89Yi5wKG4pLGM9ZnVuY3Rpb24odmUsail7dmFyIE49Yi53KGEuJHU/RGF0ZS5VVEMoYS4keSxqLHZlKTpuZXcgRGF0ZShhLiR5LGosdmUpLGEpO3JldHVybiBpP046Ti5lbmRPZihaKX0sdT1mdW5jdGlvbih2ZSxqKXt2YXIgTj1bMCwwLDAsMF0sX2U9WzIzLDU5LDU5LDk5OV07cmV0dXJuIGIudyhhLnRvRGF0ZSgpW3ZlXS5hcHBseShhLnRvRGF0ZSgicyIpLChpP046X2UpLnNsaWNlKGopKSxhKX0sbD10aGlzLiRXLGs9dGhpcy4kTSxTPXRoaXMuJEQsTT0ic2V0IisodGhpcy4kdT8iVVRDIjoiIik7c3dpdGNoKG8pe2Nhc2UgVTpyZXR1cm4gaT9jKDEsMCk6YygzMSwxMSk7Y2FzZSBJOnJldHVybiBpP2MoMSxrKTpjKDAsaysxKTtjYXNlIGplOnt2YXIgRj10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsYWU9KGw8Rj9sKzc6bCktRjtyZXR1cm4gYyhpP1MtYWU6UysoNi1hZSksayl9Y2FzZSBaOmNhc2UgeWU6cmV0dXJuIHUoTSsiSG91cnMiLDApO2Nhc2UgcGU6cmV0dXJuIHUoTSsiTWludXRlcyIsMSk7Y2FzZSBtZTpyZXR1cm4gdShNKyJTZWNvbmRzIiwyKTtjYXNlIGZlOnJldHVybiB1KE0rIk1pbGxpc2Vjb25kcyIsMyk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jbG9uZSgpfX0sZS5lbmRPZj1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5zdGFydE9mKG4sITEpfSxlLiRzZXQ9ZnVuY3Rpb24obixzKXt2YXIgYSxpPWIucChuKSxvPSJzZXQiKyh0aGlzLiR1PyJVVEMiOiIiKSxjPShhPXt9LGFbWl09bysiRGF0ZSIsYVt5ZV09bysiRGF0ZSIsYVtJXT1vKyJNb250aCIsYVtVXT1vKyJGdWxsWWVhciIsYVtwZV09bysiSG91cnMiLGFbbWVdPW8rIk1pbnV0ZXMiLGFbZmVdPW8rIlNlY29uZHMiLGFbaHRdPW8rIk1pbGxpc2Vjb25kcyIsYSlbaV0sdT1pPT09Wj90aGlzLiREKyhzLXRoaXMuJFcpOnM7aWYoaT09PUl8fGk9PT1VKXt2YXIgbD10aGlzLmNsb25lKCkuc2V0KHllLDEpO2wuJGRbY10odSksbC5pbml0KCksdGhpcy4kZD1sLnNldCh5ZSxNYXRoLm1pbih0aGlzLiRELGwuZGF5c0luTW9udGgoKSkpLiRkfWVsc2UgYyYmdGhpcy4kZFtjXSh1KTtyZXR1cm4gdGhpcy5pbml0KCksdGhpc30sZS5zZXQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQobixzKX0sZS5nZXQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXNbYi5wKG4pXSgpfSxlLmFkZD1mdW5jdGlvbihuLHMpe3ZhciBhPXRoaXMsaTtuPU51bWJlcihuKTt2YXIgbz1iLnAocyksYz1mdW5jdGlvbihTKXt2YXIgTT13KGEpO3JldHVybiBiLncoTS5kYXRlKE0uZGF0ZSgpK01hdGgucm91bmQoUypuKSksYSl9O2lmKG89PT1JKXJldHVybiB0aGlzLnNldChJLHRoaXMuJE0rbik7aWYobz09PVUpcmV0dXJuIHRoaXMuc2V0KFUsdGhpcy4keStuKTtpZihvPT09WilyZXR1cm4gYygxKTtpZihvPT09amUpcmV0dXJuIGMoNyk7dmFyIHU9KGk9e30saVttZV09bHQsaVtwZV09WXQsaVtmZV09aGUsaSlbb118fDEsbD10aGlzLiRkLmdldFRpbWUoKStuKnU7cmV0dXJuIGIudyhsLHRoaXMpfSxlLnN1YnRyYWN0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuYWRkKG4qLTEscyl9LGUuZm9ybWF0PWZ1bmN0aW9uKG4pe3ZhciBzPXRoaXMsYT10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIGEuaW52YWxpZERhdGV8fFZ0O3ZhciBpPW58fFB0LG89Yi56KHRoaXMpLGM9dGhpcy4kSCx1PXRoaXMuJG0sbD10aGlzLiRNLGs9YS53ZWVrZGF5cyxTPWEubW9udGhzLE09YS5tZXJpZGllbSxGPWZ1bmN0aW9uKE4sX2UsdHQsZ3Mpe3JldHVybiBOJiYoTltfZV18fE4ocyxpKSl8fHR0W19lXS5zbGljZSgwLGdzKX0sYWU9ZnVuY3Rpb24oTil7cmV0dXJuIGIucyhjJTEyfHwxMixOLCIwIil9LGV0PU18fGZ1bmN0aW9uKGosTixfZSl7dmFyIHR0PWo8MTI/IkFNIjoiUE0iO3JldHVybiBfZT90dC50b0xvd2VyQ2FzZSgpOnR0fSx2ZT1mdW5jdGlvbihOKXtzd2l0Y2goTil7Y2FzZSJZWSI6cmV0dXJuIFN0cmluZyhzLiR5KS5zbGljZSgtMik7Y2FzZSJZWVlZIjpyZXR1cm4gYi5zKHMuJHksNCwiMCIpO2Nhc2UiTSI6cmV0dXJuIGwrMTtjYXNlIk1NIjpyZXR1cm4gYi5zKGwrMSwyLCIwIik7Y2FzZSJNTU0iOnJldHVybiBGKGEubW9udGhzU2hvcnQsbCxTLDMpO2Nhc2UiTU1NTSI6cmV0dXJuIEYoUyxsKTtjYXNlIkQiOnJldHVybiBzLiREO2Nhc2UiREQiOnJldHVybiBiLnMocy4kRCwyLCIwIik7Y2FzZSJkIjpyZXR1cm4gU3RyaW5nKHMuJFcpO2Nhc2UiZGQiOnJldHVybiBGKGEud2Vla2RheXNNaW4scy4kVyxrLDIpO2Nhc2UiZGRkIjpyZXR1cm4gRihhLndlZWtkYXlzU2hvcnQscy4kVyxrLDMpO2Nhc2UiZGRkZCI6cmV0dXJuIGtbcy4kV107Y2FzZSJIIjpyZXR1cm4gU3RyaW5nKGMpO2Nhc2UiSEgiOnJldHVybiBiLnMoYywyLCIwIik7Y2FzZSJoIjpyZXR1cm4gYWUoMSk7Y2FzZSJoaCI6cmV0dXJuIGFlKDIpO2Nhc2UiYSI6cmV0dXJuIGV0KGMsdSwhMCk7Y2FzZSJBIjpyZXR1cm4gZXQoYyx1LCExKTtjYXNlIm0iOnJldHVybiBTdHJpbmcodSk7Y2FzZSJtbSI6cmV0dXJuIGIucyh1LDIsIjAiKTtjYXNlInMiOnJldHVybiBTdHJpbmcocy4kcyk7Y2FzZSJzcyI6cmV0dXJuIGIucyhzLiRzLDIsIjAiKTtjYXNlIlNTUyI6cmV0dXJuIGIucyhzLiRtcywzLCIwIik7Y2FzZSJaIjpyZXR1cm4gb31yZXR1cm4gbnVsbH07cmV0dXJuIGkucmVwbGFjZSgkbixmdW5jdGlvbihqLE4pe3JldHVybiBOfHx2ZShqKXx8by5yZXBsYWNlKCI6IiwiIil9KX0sZS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpKjE1fSxlLmRpZmY9ZnVuY3Rpb24obixzLGEpe3ZhciBpPXRoaXMsbz1iLnAocyksYz13KG4pLHU9KGMudXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqbHQsbD10aGlzLWMsaz1mdW5jdGlvbigpe3JldHVybiBiLm0oaSxjKX0sUztzd2l0Y2gobyl7Y2FzZSBVOlM9aygpLzEyO2JyZWFrO2Nhc2UgSTpTPWsoKTticmVhaztjYXNlIFd0OlM9aygpLzM7YnJlYWs7Y2FzZSBqZTpTPShsLXUpL1NuO2JyZWFrO2Nhc2UgWjpTPShsLXUpL3duO2JyZWFrO2Nhc2UgcGU6Uz1sL1l0O2JyZWFrO2Nhc2UgbWU6Uz1sL2x0O2JyZWFrO2Nhc2UgZmU6Uz1sL2hlO2JyZWFrO2RlZmF1bHQ6Uz1sO2JyZWFrfXJldHVybiBhP1M6Yi5hKFMpfSxlLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoSSkuJER9LGUuJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiBlZVt0aGlzLiRMXX0sZS5sb2NhbGU9ZnVuY3Rpb24obixzKXtpZighbilyZXR1cm4gdGhpcy4kTDt2YXIgYT10aGlzLmNsb25lKCksaT1xZShuLHMsITApO3JldHVybiBpJiYoYS4kTD1pKSxhfSxlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIudyh0aGlzLiRkLHRoaXMpfSxlLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LHJ9KCksenQ9R2UucHJvdG90eXBlO3cucHJvdG90eXBlPXp0LFtbIiRtcyIsaHRdLFsiJHMiLGZlXSxbIiRtIixtZV0sWyIkSCIscGVdLFsiJFciLFpdLFsiJE0iLEldLFsiJHkiLFVdLFsiJEQiLHllXV0uZm9yRWFjaChmdW5jdGlvbihyKXt6dFtyWzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHJbMF0sclsxXSl9fSksdy5leHRlbmQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gci4kaXx8KHIoZSxHZSx3KSxyLiRpPSEwKSx3fSx3LmxvY2FsZT1xZSx3LmlzRGF5anM9bXQsdy51bml4PWZ1bmN0aW9uKHIpe3JldHVybiB3KHIqMWUzKX0sdy5lbj1lZVtZZV0sdy5Mcz1lZSx3LnA9e307dmFyIEluPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9ZS5wcm90b3R5cGUsbj10LmZvcm1hdDt0LmZvcm1hdD1mdW5jdGlvbihzKXt2YXIgYT10aGlzLGk9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykocyk7dmFyIG89dGhpcy4kdXRpbHMoKSxjPXN8fFB0LHU9Yy5yZXBsYWNlKC9cWyhbXlxdXSspXXxRfHdvfHd3fHd8V1d8V3x6enp8enxnZ2dnfEdHR0d8RG98WHx4fGt7MSwyfXxTL2csZnVuY3Rpb24obCl7c3dpdGNoKGwpe2Nhc2UiUSI6cmV0dXJuIE1hdGguY2VpbCgoYS4kTSsxKS8zKTtjYXNlIkRvIjpyZXR1cm4gaS5vcmRpbmFsKGEuJEQpO2Nhc2UiZ2dnZyI6cmV0dXJuIGEud2Vla1llYXIoKTtjYXNlIkdHR0ciOnJldHVybiBhLmlzb1dlZWtZZWFyKCk7Y2FzZSJ3byI6cmV0dXJuIGkub3JkaW5hbChhLndlZWsoKSwiVyIpO2Nhc2UidyI6Y2FzZSJ3dyI6cmV0dXJuIG8ucyhhLndlZWsoKSxsPT09InciPzE6MiwiMCIpO2Nhc2UiVyI6Y2FzZSJXVyI6cmV0dXJuIG8ucyhhLmlzb1dlZWsoKSxsPT09IlciPzE6MiwiMCIpO2Nhc2UiayI6Y2FzZSJrayI6cmV0dXJuIG8ucyhTdHJpbmcoYS4kSD09PTA/MjQ6YS4kSCksbD09PSJrIj8xOjIsIjAiKTtjYXNlIlgiOnJldHVybiBNYXRoLmZsb29yKGEuJGQuZ2V0VGltZSgpLzFlMyk7Y2FzZSJ4IjpyZXR1cm4gYS4kZC5nZXRUaW1lKCk7Y2FzZSJ6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCkrIl0iO2Nhc2Uienp6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCJsb25nIikrIl0iO2RlZmF1bHQ6cmV0dXJuIGx9fSk7cmV0dXJuIG4uYmluZCh0aGlzKSh1KX19LGpuPSJpc293ZWVrIixZbj1mdW5jdGlvbihyLGUsdCl7dmFyIG49ZnVuY3Rpb24oYyx1KXt2YXIgbD0odT90LnV0Yzp0KSgpLnllYXIoYykuc3RhcnRPZihVKSxrPTQtbC5pc29XZWVrZGF5KCk7cmV0dXJuIGwuaXNvV2Vla2RheSgpPjQmJihrKz03KSxsLmFkZChrLFopfSxzPWZ1bmN0aW9uKGMpe3JldHVybiBjLmFkZCg0LWMuaXNvV2Vla2RheSgpLFopfSxhPWUucHJvdG90eXBlO2EuaXNvV2Vla1llYXI9ZnVuY3Rpb24oKXt2YXIgbz1zKHRoaXMpO3JldHVybiBvLnllYXIoKX0sYS5pc29XZWVrPWZ1bmN0aW9uKG8pe2lmKCF0aGlzLiR1dGlscygpLnUobykpcmV0dXJuIHRoaXMuYWRkKChvLXRoaXMuaXNvV2VlaygpKSo3LFopO3ZhciBjPXModGhpcyksdT1uKHRoaXMuaXNvV2Vla1llYXIoKSx0aGlzLiR1KTtyZXR1cm4gYy5kaWZmKHUsamUpKzF9LGEuaXNvV2Vla2RheT1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KG8pP3RoaXMuZGF5KCl8fDc6dGhpcy5kYXkodGhpcy5kYXkoKSU3P286by03KX07dmFyIGk9YS5zdGFydE9mO2Euc3RhcnRPZj1mdW5jdGlvbihvLGMpe3ZhciB1PXRoaXMuJHV0aWxzKCksbD11LnUoYyk/ITA6YyxrPXUucChvKTtyZXR1cm4gaz09PWpuP2w/dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLSh0aGlzLmlzb1dlZWtkYXkoKS0xKSkuc3RhcnRPZigiZGF5Iik6dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLTEtKHRoaXMuaXNvV2Vla2RheSgpLTEpKzcpLmVuZE9mKCJkYXkiKTppLmJpbmQodGhpcykobyxjKX19O3cuZXh0ZW5kKFluKSx3LmV4dGVuZChJbik7Y29uc3QgcHQ9IkdHR0ctW1ddV1ciLFhlPWNsYXNzIFhle2NvbnN0cnVjdG9yKCl7dGhpcy55ZWFyTW9udGhEYXlDYWNoZT1uZXcgTWFwLHRoaXMueWVhcldlZWtDYWNoZT1uZXcgTWFwLHRoaXMueWVhck1vbnRoQ2FjaGU9bmV3IE1hcCx0aGlzLnllYXJDYWNoZT1uZXcgTWFwfWdldFllYXJNb250aERheShlKXtyZXR1cm4gdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoZSl8fHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuc2V0KGUsdGUucGFyc2UoZSx0aGlzKSksdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5nZXQoZSl9Z2V0WWVhck1vbnRoKGUpe3JldHVybiB0aGlzLnllYXJNb250aENhY2hlLmhhcyhlKXx8dGhpcy55ZWFyTW9udGhDYWNoZS5zZXQoZSxuZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJNb250aENhY2hlLmdldChlKX1nZXRZZWFyV2VlayhlKXtyZXR1cm4gdGhpcy55ZWFyV2Vla0NhY2hlLmhhcyhlKXx8dGhpcy55ZWFyV2Vla0NhY2hlLnNldChlLHJlLnBhcnNlKGUsdGhpcykpLHRoaXMueWVhcldlZWtDYWNoZS5nZXQoZSl9Z2V0WWVhcihlKXtyZXR1cm4gdGhpcy55ZWFyQ2FjaGUuaGFzKGUpfHx0aGlzLnllYXJDYWNoZS5zZXQoZSxzZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJDYWNoZS5nZXQoZSl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2V9fTtYZS5pbnN0YW5jZT1uZXcgWGU7bGV0IHl0PVhlO2NsYXNzIHRle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMueWVhck51bWJlcj1lLHRoaXMubW9udGhOdW1iZXI9dCx0aGlzLmRheU51bWJlcj1uLHRoaXMuY2FjaGU9cyx0aGlzLnR5cGU9IlllYXJNb250aERheSIsdGhpcy5kYXRlPW5ldyBEYXRlKHRoaXMueWVhck51bWJlcix0aGlzLm1vbnRoTnVtYmVyLTEsdGhpcy5kYXlOdW1iZXIpLHRoaXMuZGF5anM9dyh0aGlzLmRhdGUpLHRoaXMuZGF0ZVN0cmluZz10aGlzLnRvU3RyaW5nKCl9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0tREQiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoImRkZGQsIE1NTU0gRCwgWVlZWSIpfWdldCBmaXJzdERheSgpe3JldHVybiB0aGlzfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXN9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKGAke3RoaXMueWVhck51bWJlcn1gKX1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgodGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0iKSl9Z2V0IHdlZWsoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChwdCkpfWFkZERheXMoZSl7Y29uc3Qgbj10aGlzLmRheWpzLmFkZChlLCJkYXkiKS5mb3JtYXQoIllZWVktTU0tREQiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZGF5anMuZGlmZihlLmRheWpzLCJkYXkiKX1zdGF0aWMgcGFyc2UoZSx0KXtjb25zdFtuLHMsYV09ZS5zcGxpdCgiLSIpLm1hcChpPT5wYXJzZUludChpLDEwKSk7cmV0dXJuIG5ldyB0ZShuLHMsYSx0KX19Y2xhc3MgcmV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuaXNvWWVhck51bWJlcj1lLHRoaXMuaXNvV2Vla051bWJlcj10LHRoaXMuY2FjaGU9bix0aGlzLnR5cGU9IlllYXJXZWVrIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KHB0KX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm5gV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7Y29uc3QgZT13KCkueWVhcih0aGlzLmlzb1llYXJOdW1iZXIpLm1vbnRoKDEpLmRhdGUoNCkuaXNvV2Vlayh0aGlzLmlzb1dlZWtOdW1iZXIpLnN0YXJ0T2YoImlzb1dlZWsiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZS5mb3JtYXQoIllZWVktTU0tREQiKSl9Z2V0IGxhc3REYXkoKXtjb25zdCB0PXcoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyLTEpKjcsImRheSIpLnN0YXJ0T2YoIndlZWsiKS5hZGQoMSwiZGF5IikuYWRkKDYsImRheSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheSh0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKX1nZXQgeWVhcigpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIoYCR7dGhpcy5pc29ZZWFyTnVtYmVyfWApfWFkZFdlZWtzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwid2VlayIpLmZvcm1hdChwdCk7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcldlZWsobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ3ZWVrIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbbixzXT1lLnNwbGl0KCItVyIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyByZShuLHMsdCl9fWNsYXNzIG5le2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnllYXJOdW1iZXI9ZSx0aGlzLm1vbnRoTnVtYmVyPXQsdGhpcy5jYWNoZT1uLHRoaXMudHlwZT0iWWVhck1vbnRoIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KCJZWVlZLU1NIil9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy50ZXh0fWVuZ2xpc2hOYW1lKCl7cmV0dXJuYCR7V24odGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZW5kT2YoIm1vbnRoIikuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCB5ZWFyKCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCl9YWRkTW9udGhzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwibW9udGgiKS5mb3JtYXQoIllZWVktTU0iKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJtb250aCIpfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0W24sc109ZS5zcGxpdCgiLSIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyBuZShuLHMsdCl9fWNsYXNzIHNle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy55ZWFyPWUsdGhpcy5jYWNoZT10LHRoaXMudHlwZT0iWWVhciIsdGhpcy5kYXRlU3RyaW5nPXRoaXMudG9TdHJpbmcoKX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdCgiWVlZWSIpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudGV4dH1lbmdsaXNoTmFtZSgpe3JldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKX1nZXQgZmlyc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTAxYCl9Z2V0IGxhc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTEyYCl9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheX1nZXQgbGFzdERheSgpe3JldHVybiB0aGlzLmxhc3RNb250aC5sYXN0RGF5fWFkZFllYXJzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwieWVhciIpLmZvcm1hdCgiWVlZWSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ5ZWFyIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLDEwKTtyZXR1cm4gbmV3IHNlKG4sdCl9fWZ1bmN0aW9uIFduKHIpe3JldHVybiB3KCkubW9udGgoci0xKS5mb3JtYXQoIk1NTU0iKX1mdW5jdGlvbiBVdChyKXtzd2l0Y2goci50eXBlKXtjYXNlIlllYXJNb250aERheSI6cmV0dXJue3R5cGU6IlllYXJNb250aERheSIseWVhck51bWJlcjpyLnllYXJOdW1iZXIsbW9udGhOdW1iZXI6ci5tb250aE51bWJlcixkYXlOdW1iZXI6ci5kYXlOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhcldlZWsiOnJldHVybnt0eXBlOiJZZWFyV2VlayIsaXNvWWVhck51bWJlcjpyLmlzb1llYXJOdW1iZXIsaXNvV2Vla051bWJlcjpyLmlzb1dlZWtOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhck1vbnRoIjpyZXR1cm57dHlwZToiWWVhck1vbnRoIix5ZWFyTnVtYmVyOnIueWVhck51bWJlcixtb250aE51bWJlcjpyLm1vbnRoTnVtYmVyLGRhdGVTdHJpbmc6ci5kYXRlU3RyaW5nfTtjYXNlIlllYXIiOnJldHVybnt0eXBlOiJZZWFyIix5ZWFyOnIueWVhcixkYXRlU3RyaW5nOnIuZGF0ZVN0cmluZ319fWZ1bmN0aW9uIFBuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkRGF5cyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVm4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRXZWVrcyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gTG4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRNb250aHMocykpO3JldHVybiB0fWZ1bmN0aW9uIHpuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkWWVhcnMocykpO3JldHVybiB0fWZ1bmN0aW9uIFVuKHIsZSl7aWYocj09PW51bGx8fGU9PT1udWxsKXJldHVybltdO2lmKHIgaW5zdGFuY2VvZiB0ZSYmZSBpbnN0YW5jZW9mIHRlKXJldHVybiBQbihyLGUpO2lmKHIgaW5zdGFuY2VvZiByZSYmZSBpbnN0YW5jZW9mIHJlKXJldHVybiBWbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lKXJldHVybiBMbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBzZSYmZSBpbnN0YW5jZW9mIHNlKXJldHVybiB6bihyLGUpO3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHM6IHN0YXJ0IGFuZCBlbmQgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlOiAke3J9LCAke2V9YCl9ZnVuY3Rpb24gRm4ocixlKXtpZihyIGluc3RhbmNlb2YgdGUmJmUgaW5zdGFuY2VvZiB0ZXx8ciBpbnN0YW5jZW9mIHJlJiZlIGluc3RhbmNlb2YgcmV8fHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lfHxyIGluc3RhbmNlb2Ygc2UmJmUgaW5zdGFuY2VvZiBzZSlyZXR1cm4gci5taW51cyhlKTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wYXJlICR7cn0gYW5kICR7ZX1gKX1mdW5jdGlvbiBKZShyLGUpe2lmKHI9PT1udWxsKXJldHVybiAxO2lmKGU9PT1udWxsKXJldHVybi0xO2NvbnN0IHQ9Rm4ocixlKTtyZXR1cm4gdDwwPy0xOnQ+MD8xOjB9ZnVuY3Rpb24gQm4ocil7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgciluIT09bnVsbCYmKChlPT09bnVsbHx8SmUobixlKTwwKSYmKGU9biksKHQ9PT1udWxsfHxKZShuLHQpPjApJiYodD1uKSk7cmV0dXJuIGU9PT1udWxsfHx0PT09bnVsbD97bWluOm51bGwsbWF4Om51bGx9OnttaW46ZSxtYXg6dH19ZnVuY3Rpb24gV2UocixlKXtjb25zdCBuPXl0LmdldEluc3RhbmNlKCkuZ2V0WWVhck1vbnRoRGF5KHIpO3N3aXRjaChlKXtjYXNlImRheSI6cmV0dXJuIG47Y2FzZSJ3ZWVrIjpyZXR1cm4gbi53ZWVrO2Nhc2UibW9udGgiOnJldHVybiBuLm1vbnRoO2Nhc2UieWVhciI6cmV0dXJuIG4ueWVhcn19ZnVuY3Rpb24gSG4ocixlKXtyZXR1cm4gci5kYXRlUmFuZ2U9PT1udWxsPzE6ZS5kYXRlUmFuZ2U9PT1udWxsPy0xOkplKHIuZGF0ZVJhbmdlLGUuZGF0ZVJhbmdlKX1mdW5jdGlvbiBxbihyLGUpe3JldHVybntkYXRlUmFuZ2U6ci5kYXRlPT09bnVsbD9udWxsOldlKHIuZGF0ZSxlKSxjb3VudDpyLmNvdW50fX1jb25zdCBHbj0vXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSg/PHN1YnN0aXR1dGlvblZhbHVlPltBLVphLXouXSk/JC87Y2xhc3MgS2V7Y29uc3RydWN0b3IoZSx0LG4scyl7dGhpcy5zZWdtZW50PWUsdGhpcy52YWx1ZUF0UmVmZXJlbmNlPXQsdGhpcy5zdWJzdGl0dXRpb25WYWx1ZT1uLHRoaXMucG9zaXRpb249cyx0aGlzLnR5cGU9InN1YnN0aXR1dGlvbiI7Y29uc3QgYT10aGlzLnNlZ21lbnQ/YCR7dGhpcy5zZWdtZW50fTpgOiIiLGk9dGhpcy52YWx1ZUF0UmVmZXJlbmNlP2Ake3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gOiIiLG89dGhpcy5zdWJzdGl0dXRpb25WYWx1ZT9gJHt0aGlzLnN1YnN0aXR1dGlvblZhbHVlfWA6IiI7dGhpcy5jb2RlPWAke2F9JHtpfSR7dGhpcy5wb3NpdGlvbn0ke299YH1lcXVhbHMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBLZT90aGlzLnNlZ21lbnQ9PT1lLnNlZ21lbnQmJnRoaXMudmFsdWVBdFJlZmVyZW5jZT09PWUudmFsdWVBdFJlZmVyZW5jZSYmdGhpcy5zdWJzdGl0dXRpb25WYWx1ZT09PWUuc3Vic3RpdHV0aW9uVmFsdWUmJnRoaXMucG9zaXRpb249PT1lLnBvc2l0aW9uOiExfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuY29kZX1zdGF0aWMgcGFyc2UoZSl7Y29uc3QgdD1lLm1hdGNoKEduKTtyZXR1cm4gdD09PW51bGx8fHQuZ3JvdXBzPT09dm9pZCAwP251bGw6bmV3IEtlKHQuZ3JvdXBzLnNlZ21lbnQsdC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSx0Lmdyb3Vwcy5zdWJzdGl0dXRpb25WYWx1ZSxwYXJzZUludCh0Lmdyb3Vwcy5wb3NpdGlvbiwxMCkpfX1jb25zdCBKbj0vXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSgtKSQvO2NsYXNzIGdle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlZ21lbnQ9ZSx0aGlzLnZhbHVlQXRSZWZlcmVuY2U9dCx0aGlzLnBvc2l0aW9uPW4sdGhpcy50eXBlPSJkZWxldGlvbiI7Y29uc3Qgcz10aGlzLnNlZ21lbnQ/YCR7dGhpcy5zZWdtZW50fTpgOiIiLGE9dGhpcy52YWx1ZUF0UmVmZXJlbmNlP2Ake3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gOiIiO3RoaXMuY29kZT1gJHtzfSR7YX0ke3RoaXMucG9zaXRpb259LWB9ZXF1YWxzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZ2U/dGhpcy5zZWdtZW50PT09ZS5zZWdtZW50JiZ0aGlzLnZhbHVlQXRSZWZlcmVuY2U9PT1lLnZhbHVlQXRSZWZlcmVuY2UmJnRoaXMucG9zaXRpb249PT1lLnBvc2l0aW9uOiExfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuY29kZX1zdGF0aWMgcGFyc2UoZSl7Y29uc3QgdD1lLm1hdGNoKEpuKTtyZXR1cm4gdD09PW51bGx8fHQuZ3JvdXBzPT09dm9pZCAwP251bGw6bmV3IGdlKHQuZ3JvdXBzLnNlZ21lbnQsdC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSxwYXJzZUludCh0Lmdyb3Vwcy5wb3NpdGlvbiwxMCkpfX1mdW5jdGlvbiBGdChyKXtzd2l0Y2goci50eXBlKXtjYXNlInN1YnN0aXR1dGlvbiI6cmV0dXJue3R5cGU6InN1YnN0aXR1dGlvbiIsY29kZTpyLmNvZGUsc2VnbWVudDpyLnNlZ21lbnQscG9zaXRpb246ci5wb3NpdGlvbix2YWx1ZUF0UmVmZXJlbmNlOnIudmFsdWVBdFJlZmVyZW5jZSxzdWJzdGl0dXRpb25WYWx1ZTpyLnN1YnN0aXR1dGlvblZhbHVlfTtjYXNlImRlbGV0aW9uIjpyZXR1cm57dHlwZToiZGVsZXRpb24iLGNvZGU6ci5jb2RlLHNlZ21lbnQ6ci5zZWdtZW50LHBvc2l0aW9uOnIucG9zaXRpb24sdmFsdWVBdFJlZmVyZW5jZTpyLnZhbHVlQXRSZWZlcmVuY2V9fX1jbGFzcyBLbntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5maWx0ZXI9ZSx0aGlzLnNlcXVlbmNlVHlwZT10LHRoaXMubWluUHJvcG9ydGlvbj1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7cmV0dXJue2NvbnRlbnQ6KGF3YWl0IHRoaXMuZmV0Y2hNdXRhdGlvbnMoZSx0KSkubWFwKCh7Y291bnQ6YSxwcm9wb3J0aW9uOmksbXV0YXRpb25Gcm9tOm8sbXV0YXRpb25UbzpjLHBvc2l0aW9uOnUsc2VxdWVuY2VOYW1lOmx9KT0+Yz09PSItIj97dHlwZToiZGVsZXRpb24iLG11dGF0aW9uOm5ldyBnZShsPz92b2lkIDAsbyx1KSxjb3VudDphLHByb3BvcnRpb246aX06e3R5cGU6InN1YnN0aXR1dGlvbiIsbXV0YXRpb246bmV3IEtlKGw/P3ZvaWQgMCxvLGMsdSksY291bnQ6YSxwcm9wb3J0aW9uOml9KX19YXN5bmMgZmV0Y2hNdXRhdGlvbnMoZSx0KXtjb25zdCBuPXsuLi50aGlzLmZpbHRlcixtaW5Qcm9wb3J0aW9uOnRoaXMubWluUHJvcG9ydGlvbn07cmV0dXJuIGZuKGUsbix0aGlzLnNlcXVlbmNlVHlwZSx0KS50aGVuKHM9PnMuZGF0YSl9fXZhciBCdDtCdD17X19lOmZ1bmN0aW9uKHIsZSx0LG4pe2Zvcih2YXIgcyxhLGk7ZT1lLl9fOylpZigocz1lLl9fYykmJiFzLl9fKXRyeXtpZigoYT1zLmNvbnN0cnVjdG9yKSYmYS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihzLnNldFN0YXRlKGEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHIpKSxpPXMuX19kKSxzLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocy5jb21wb25lbnREaWRDYXRjaChyLG58fHt9KSxpPXMuX19kKSxpKXJldHVybiBzLl9fRT1zfWNhdGNoKG8pe3I9b310aHJvdyByfX0sdHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiImJlByb21pc2UucHJvdG90eXBlLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSk7dmFyIFYsZ3QsSHQscXQ9W10sJD1CdCxHdD0kLl9fYixKdD0kLl9fcixLdD0kLmRpZmZlZCxRdD0kLl9fYyxYdD0kLnVubW91bnQsZXI9JC5fXztmdW5jdGlvbiBRbigpe2Zvcih2YXIgcjtyPXF0LnNoaWZ0KCk7KWlmKHIuX19QJiZyLl9fSCl0cnl7ci5fX0guX19oLmZvckVhY2goUWUpLHIuX19ILl9faC5mb3JFYWNoKHZ0KSxyLl9fSC5fX2g9W119Y2F0Y2goZSl7ci5fX0guX19oPVtdLCQuX19lKGUsci5fX3YpfX0kLl9fYj1mdW5jdGlvbihyKXtWPW51bGwsR3QmJkd0KHIpfSwkLl9fPWZ1bmN0aW9uKHIsZSl7ciYmZS5fX2smJmUuX19rLl9fbSYmKHIuX19tPWUuX19rLl9fbSksZXImJmVyKHIsZSl9LCQuX19yPWZ1bmN0aW9uKHIpe0p0JiZKdChyKTt2YXIgZT0oVj1yLl9fYykuX19IO2UmJihndD09PVY/KGUuX19oPVtdLFYuX19oPVtdLGUuX18uZm9yRWFjaChmdW5jdGlvbih0KXt0Ll9fTiYmKHQuX189dC5fX04pLHQuaT10Ll9fTj12b2lkIDB9KSk6KGUuX19oLmZvckVhY2goUWUpLGUuX19oLmZvckVhY2godnQpLGUuX19oPVtdKSksZ3Q9Vn0sJC5kaWZmZWQ9ZnVuY3Rpb24ocil7S3QmJkt0KHIpO3ZhciBlPXIuX19jO2UmJmUuX19IJiYoZS5fX0guX19oLmxlbmd0aCYmKHF0LnB1c2goZSkhPT0xJiZIdD09PSQucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKEh0PSQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8WG4pKFFuKSksZS5fX0guX18uZm9yRWFjaChmdW5jdGlvbih0KXt0LmkmJih0Ll9fSD10LmkpLHQuaT12b2lkIDB9KSksZ3Q9Vj1udWxsfSwkLl9fYz1mdW5jdGlvbihyLGUpe2Uuc29tZShmdW5jdGlvbih0KXt0cnl7dC5fX2guZm9yRWFjaChRZSksdC5fX2g9dC5fX2guZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiFuLl9ffHx2dChuKX0pfWNhdGNoKG4pe2Uuc29tZShmdW5jdGlvbihzKXtzLl9faCYmKHMuX19oPVtdKX0pLGU9W10sJC5fX2Uobix0Ll9fdil9fSksUXQmJlF0KHIsZSl9LCQudW5tb3VudD1mdW5jdGlvbihyKXtYdCYmWHQocik7dmFyIGUsdD1yLl9fYzt0JiZ0Ll9fSCYmKHQuX19ILl9fLmZvckVhY2goZnVuY3Rpb24obil7dHJ5e1FlKG4pfWNhdGNoKHMpe2U9c319KSx0Ll9fSD12b2lkIDAsZSYmJC5fX2UoZSx0Ll9fdikpfTt2YXIgdHI9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBYbihyKXt2YXIgZSx0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KG4pLHRyJiZjYW5jZWxBbmltYXRpb25GcmFtZShlKSxzZXRUaW1lb3V0KHIpfSxuPXNldFRpbWVvdXQodCwxMDApO3RyJiYoZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCkpfWZ1bmN0aW9uIFFlKHIpe3ZhciBlPVYsdD1yLl9fYzt0eXBlb2YgdD09ImZ1bmN0aW9uIiYmKHIuX19jPXZvaWQgMCx0KCkpLFY9ZX1mdW5jdGlvbiB2dChyKXt2YXIgZT1WO3IuX19jPXIuX18oKSxWPWV9Y2xhc3MgcnIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKHQpLHRoaXMuaGVhZGxpbmU9ZSx0aGlzLm5hbWU9IlVzZXJGYWNpbmdFcnJvciJ9fWNsYXNzIGVze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcz1lLHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcz10LHRoaXMuZGF0YT1uZXcgTWFwLHRoaXMua2V5c0ZpcnN0QXhpcz1uZXcgTWFwLHRoaXMua2V5c1NlY29uZEF4aXM9bmV3IE1hcCxuJiYodGhpcy5rZXlzRmlyc3RBeGlzPW5ldyBNYXAobi5rZXlzRmlyc3RBeGlzKSx0aGlzLmtleXNTZWNvbmRBeGlzPW5ldyBNYXAobi5rZXlzU2Vjb25kQXhpcyksdGhpcy5kYXRhPW5ldyBNYXAobi5kYXRhKSl9Z2V0KGUsdCl7dmFyIGE7Y29uc3Qgbj10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxzPXRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyh0KTtyZXR1cm4oYT10aGlzLmRhdGEuZ2V0KG4pKT09bnVsbD92b2lkIDA6YS5nZXQocyl9Z2V0Um93KGUsdCl7Y29uc3Qgbj10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxzPXRoaXMuZGF0YS5nZXQobik7cmV0dXJuIHM9PT12b2lkIDA/W106QXJyYXkuZnJvbSh0aGlzLmtleXNTZWNvbmRBeGlzLmtleXMoKSkubWFwKGE9PnMuZ2V0KGEpPz90KX1zZXQoZSx0LG4pe2NvbnN0IHM9dGhpcy5zZXJpYWxpemVGaXJzdEF4aXMoZSksYT10aGlzLnNlcmlhbGl6ZVNlY29uZEF4aXModCk7dGhpcy5kYXRhLmhhcyhzKXx8dGhpcy5kYXRhLnNldChzLG5ldyBNYXApLHRoaXMuZGF0YS5nZXQocykuc2V0KGEsbiksdGhpcy5rZXlzRmlyc3RBeGlzLnNldChzLGUpLHRoaXMua2V5c1NlY29uZEF4aXMuc2V0KGEsdCl9ZGVsZXRlUm93KGUpe2NvbnN0IHQ9dGhpcy5zZXJpYWxpemVGaXJzdEF4aXMoZSk7dGhpcy5kYXRhLmRlbGV0ZSh0KSx0aGlzLmtleXNGaXJzdEF4aXMuZGVsZXRlKHQpfWdldEZpcnN0QXhpc0tleXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNGaXJzdEF4aXMudmFsdWVzKCkpfWdldFNlY29uZEF4aXNLZXlzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5rZXlzU2Vjb25kQXhpcy52YWx1ZXMoKSl9Z2V0QXNBcnJheShlKXtyZXR1cm4gdGhpcy5nZXRGaXJzdEF4aXNLZXlzKCkubWFwKHQ9PnRoaXMuZ2V0U2Vjb25kQXhpc0tleXMoKS5tYXAobj0+dGhpcy5nZXQodCxuKT8/ZSkpfWdldENvbnRlbnRzKCl7cmV0dXJue2tleXNGaXJzdEF4aXM6dGhpcy5rZXlzRmlyc3RBeGlzLGtleXNTZWNvbmRBeGlzOnRoaXMua2V5c1NlY29uZEF4aXMsZGF0YTp0aGlzLmRhdGF9fX1jbGFzcyB0cyBleHRlbmRzIGVze2NvbnN0cnVjdG9yKGUpe3N1cGVyKGxzLGhzLGUpfX1jb25zdCBycz0ocixlKT0+e2lmKHIuc2VnbWVudCE9PWUuc2VnbWVudClyZXR1cm4gbnMoci5zZWdtZW50LGUuc2VnbWVudCk7aWYoci5wb3NpdGlvbiE9PWUucG9zaXRpb24pcmV0dXJuIHNzKHIucG9zaXRpb24sZS5wb3NpdGlvbik7Y29uc3QgdD1yIGluc3RhbmNlb2YgZ2Usbj1lIGluc3RhbmNlb2YgZ2U7cmV0dXJuIHQhPT1uP3Q/MTotMTohdCYmIW4mJnIuc3Vic3RpdHV0aW9uVmFsdWUhPT1lLnN1YnN0aXR1dGlvblZhbHVlP2FzKHIuc3Vic3RpdHV0aW9uVmFsdWUsZS5zdWJzdGl0dXRpb25WYWx1ZSk6MH0sbnM9KHIsZSk9PnI9PT12b2lkIDA/LTE6ZT09PXZvaWQgMD8xOnIubG9jYWxlQ29tcGFyZShlKSxzcz0ocixlKT0+ci1lLGFzPShyLGUpPT5yPT09dm9pZCAwPy0xOmU9PT12b2lkIDA/MTpyLmxvY2FsZUNvbXBhcmUoZSksbnI9MjAwO2FzeW5jIGZ1bmN0aW9uIGlzKHtsYXBpc0ZpbHRlcjpyLHNlcXVlbmNlVHlwZTplLGxhcGlzOnQsZ3JhbnVsYXJpdHk6bixsYXBpc0RhdGVGaWVsZDpzLHNpZ25hbDphfSl7Y29uc3QgaT1hd2FpdCBzcihyLHQsbixzLGEpO2lmKGkubGVuZ3RoPT09MClyZXR1cm57Y29udGVudDpbXX07Y29uc3Qgbz17Li4ucixbYCR7c31Gcm9tYF06aVswXS5maXJzdERheS50b1N0cmluZygpLFtgJHtzfVRvYF06aVtpLmxlbmd0aC0xXS5sYXN0RGF5LnRvU3RyaW5nKCl9O3JldHVybiBhcihvLGUpLmV2YWx1YXRlKHQsYSl9YXN5bmMgZnVuY3Rpb24gb3Moe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxsYXBpc0RhdGVGaWVsZDpuLGdyYW51bGFyaXR5OnMsc2lnbmFsOmF9KXtjb25zdCBpPWF3YWl0IHNyKHIsdCxzLG4sYSk7aWYoaS5sZW5ndGg+bnIpdGhyb3cgbmV3IHJyKCJUb28gbWFueSBkYXRlcyIsYFRoZSBkYXRhc2V0IHdvdWxkIGNvbnRhaW4gJHtpLmxlbmd0aH0gZGF0ZSBpbnRlcnZhbHMuIFBsZWFzZSByZWR1Y2UgdGhlIG51bWJlciB0byBiZWxvdyAke25yfSB0byBkaXNwbGF5IHRoZSBkYXRhLiBZb3UgY2FuIGFjaGlldmUgdGhpcyBieSBlaXRoZXIgbmFycm93aW5nIHRoZSBkYXRlIHJhbmdlIGluIHRoZSBwcm92aWRlZCBMQVBJUyBmaWx0ZXIgb3IgYnkgc2VsZWN0aW5nIGEgbGFyZ2VyIGdyYW51bGFyaXR5LmApO2NvbnN0IG89aS5tYXAoYXN5bmMgbD0+e2NvbnN0IGs9bC5maXJzdERheS50b1N0cmluZygpLFM9bC5sYXN0RGF5LnRvU3RyaW5nKCksTT17Li4ucixbYCR7bn1Gcm9tYF06ayxbYCR7bn1Ub2BdOlN9LEY9YXdhaXQgYXIoTSxlKS5ldmFsdWF0ZSh0LGEpLGFlPWF3YWl0IG1zKE0pLmV2YWx1YXRlKHQsYSk7cmV0dXJue2RhdGU6bCxtdXRhdGlvbnM6Ri5jb250ZW50LHRvdGFsQ291bnQ6YWUuY29udGVudFswXS5jb3VudH19KSxjPWF3YWl0IFByb21pc2UuYWxsKG8pLHU9KGF3YWl0IGlzKHtsYXBpc0ZpbHRlcjpyLHNlcXVlbmNlVHlwZTplLGxhcGlzOnQsbGFwaXNEYXRlRmllbGQ6bixncmFudWxhcml0eTpzfSkpLmNvbnRlbnQ7cmV0dXJue211dGF0aW9uT3ZlclRpbWVEYXRhOmZzKGMsdSksb3ZlcmFsbE11dGF0aW9uRGF0YTp1fX1hc3luYyBmdW5jdGlvbiBzcihyLGUsdCxuLHMpe2NvbnN0e2NvbnRlbnQ6YX09YXdhaXQgdXMocixlLHQsbixzKSx7ZGF0ZUZyb206aSxkYXRlVG86b309Y3MocixuLHQpLHttaW46YyxtYXg6dX09Qm4oYSk7cmV0dXJuIFVuKGk/P2Msbz8/dSl9ZnVuY3Rpb24gY3MocixlLHQpe2NvbnN0IG49cltlXTtpZihuKXJldHVybntkYXRlRnJvbTpXZShuLHQpLGRhdGVUbzpXZShuLHQpfTtjb25zdCBzPXJbYCR7ZX1Gcm9tYF0sYT1yW2Ake2V9VG9gXTtyZXR1cm57ZGF0ZUZyb206cz9XZShzLHQpOm51bGwsZGF0ZVRvOmE/V2UoYSx0KTpudWxsfX1mdW5jdGlvbiB1cyhyLGUsdCxuLHMpe3JldHVybiBkcyhyLHQsbikuZXZhbHVhdGUoZSxzKX1mdW5jdGlvbiBkcyhyLGUsdCl7Y29uc3Qgbj1uZXcgQ3QocixbdF0pLHM9bmV3IHhuKG4sdCwiZGF0ZSIpLGE9bmV3IGR0KHMsYz0+cW4oYyxlKSksaT1uZXcgX24oYSwiZGF0ZVJhbmdlIiwiY291bnQiKSxvPW5ldyBrbihpLEhuKTtyZXR1cm4gbmV3IGR0KG8sYz0+Yy5kYXRlUmFuZ2UpfWZ1bmN0aW9uIGFyKHIsZSl7cmV0dXJuIG5ldyBLbihyLGUsLjAwMSl9ZnVuY3Rpb24gbHMocil7cmV0dXJuIHIuY29kZX1mdW5jdGlvbiBocyhyKXtyZXR1cm4gci5kYXRlU3RyaW5nfWZ1bmN0aW9uIGZzKHIsZSl7Y29uc3QgdD1uZXcgdHMsbj1yLm1hcChpPT5pLmRhdGUpLHM9ZS5zb3J0KChpLG8pPT5ycyhpLm11dGF0aW9uLG8ubXV0YXRpb24pKS5tYXAoaT0+RnQoaS5tdXRhdGlvbikpLGE9bi5zb3J0KChpLG8pPT5KZShpLG8pKS5tYXAoaT0+VXQoaSkpO3JldHVybiBzLmZvckVhY2goaT0+e2EuZm9yRWFjaChvPT57dC5zZXQoaSxvLHtjb3VudDowLHByb3BvcnRpb246MCx0b3RhbENvdW50OjB9KX0pfSksci5mb3JFYWNoKGk9PntpLm11dGF0aW9ucy5mb3JFYWNoKG89Pntjb25zdCBjPUZ0KG8ubXV0YXRpb24pLHU9VXQoaS5kYXRlKTt0LmdldChjLHUpIT09dm9pZCAwJiZ0LnNldChjLHUse2NvdW50Om8uY291bnQscHJvcG9ydGlvbjpvLnByb3BvcnRpb24sdG90YWxDb3VudDppLnRvdGFsQ291bnR9KX0pfSksdH1mdW5jdGlvbiBtcyhyKXtyZXR1cm4gbmV3IEN0KHIpfWFzeW5jIGZ1bmN0aW9uIHBzKHIpe3RyeXtwb3N0TWVzc2FnZSh7c3RhdHVzOiJsb2FkaW5nIn0pO2NvbnN0IGU9YXdhaXQgcigpO3Bvc3RNZXNzYWdlKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6ZX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKGUgaW5zdGFuY2VvZiBycj97c3RhdHVzOiJlcnJvciIsdXNlckZhY2luZzohMCxoZWFkbGluZTplLmhlYWRsaW5lLGVycm9yOmV9OntzdGF0dXM6ImVycm9yIix1c2VyRmFjaW5nOiExLGVycm9yOmUgaW5zdGFuY2VvZiBFcnJvcj9lOm5ldyBFcnJvcihgJHtlfWApfSl9fWFzeW5jIGZ1bmN0aW9uIHlzKHIpe2NvbnN0IGU9YXdhaXQgb3Moci5kYXRhKTtyZXR1cm57b3ZlcmFsbE11dGF0aW9uRGF0YTplLm92ZXJhbGxNdXRhdGlvbkRhdGEsbXV0YXRpb25PdmVyVGltZVNlcmlhbGl6ZWQ6ZS5tdXRhdGlvbk92ZXJUaW1lRGF0YS5nZXRDb250ZW50cygpfX1zZWxmLm9ubWVzc2FnZT1hc3luYyBmdW5jdGlvbihyKXthd2FpdCBwcygoKT0+eXMocikpfX0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW11dGF0aW9uT3ZlclRpbWVXb3JrZXItTVZTdDFGVncuanMubWFwCg==", xS = (n) => Uint8Array.from(atob(n), (t) => t.charCodeAt(0)), Kf = typeof self < "u" && self.Blob && new Blob([xS(rg)], { type: "text/javascript;charset=utf-8" });
23739
+ const rg = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB4OyhmdW5jdGlvbihyKXtyLmFzc2VydEVxdWFsPXM9PnM7ZnVuY3Rpb24gZShzKXt9ci5hc3NlcnRJcz1lO2Z1bmN0aW9uIHQocyl7dGhyb3cgbmV3IEVycm9yfXIuYXNzZXJ0TmV2ZXI9dCxyLmFycmF5VG9FbnVtPXM9Pntjb25zdCBhPXt9O2Zvcihjb25zdCBpIG9mIHMpYVtpXT1pO3JldHVybiBhfSxyLmdldFZhbGlkRW51bVZhbHVlcz1zPT57Y29uc3QgYT1yLm9iamVjdEtleXMocykuZmlsdGVyKG89PnR5cGVvZiBzW3Nbb11dIT0ibnVtYmVyIiksaT17fTtmb3IoY29uc3QgbyBvZiBhKWlbb109c1tvXTtyZXR1cm4gci5vYmplY3RWYWx1ZXMoaSl9LHIub2JqZWN0VmFsdWVzPXM9PnIub2JqZWN0S2V5cyhzKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHNbYV19KSxyLm9iamVjdEtleXM9dHlwZW9mIE9iamVjdC5rZXlzPT0iZnVuY3Rpb24iP3M9Pk9iamVjdC5rZXlzKHMpOnM9Pntjb25zdCBhPVtdO2Zvcihjb25zdCBpIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsaSkmJmEucHVzaChpKTtyZXR1cm4gYX0sci5maW5kPShzLGEpPT57Zm9yKGNvbnN0IGkgb2YgcylpZihhKGkpKXJldHVybiBpfSxyLmlzSW50ZWdlcj10eXBlb2YgTnVtYmVyLmlzSW50ZWdlcj09ImZ1bmN0aW9uIj9zPT5OdW1iZXIuaXNJbnRlZ2VyKHMpOnM9PnR5cGVvZiBzPT0ibnVtYmVyIiYmaXNGaW5pdGUocykmJk1hdGguZmxvb3Iocyk9PT1zO2Z1bmN0aW9uIG4ocyxhPSIgfCAiKXtyZXR1cm4gcy5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP2AnJHtpfSdgOmkpLmpvaW4oYSl9ci5qb2luVmFsdWVzPW4sci5qc29uU3RyaW5naWZ5UmVwbGFjZXI9KHMsYSk9PnR5cGVvZiBhPT0iYmlnaW50Ij9hLnRvU3RyaW5nKCk6YX0pKHh8fCh4PXt9KSk7dmFyIHJ0OyhmdW5jdGlvbihyKXtyLm1lcmdlU2hhcGVzPShlLHQpPT4oey4uLmUsLi4udH0pfSkocnR8fChydD17fSkpO2NvbnN0IGY9eC5hcnJheVRvRW51bShbInN0cmluZyIsIm5hbiIsIm51bWJlciIsImludGVnZXIiLCJmbG9hdCIsImJvb2xlYW4iLCJkYXRlIiwiYmlnaW50Iiwic3ltYm9sIiwiZnVuY3Rpb24iLCJ1bmRlZmluZWQiLCJudWxsIiwiYXJyYXkiLCJvYmplY3QiLCJ1bmtub3duIiwicHJvbWlzZSIsInZvaWQiLCJuZXZlciIsIm1hcCIsInNldCJdKSxCPXI9Pntzd2l0Y2godHlwZW9mIHIpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gZi51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBmLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKHIpP2YubmFuOmYubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGYuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZi5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIGYuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gZi5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KHIpP2YuYXJyYXk6cj09PW51bGw/Zi5udWxsOnIudGhlbiYmdHlwZW9mIHIudGhlbj09ImZ1bmN0aW9uIiYmci5jYXRjaCYmdHlwZW9mIHIuY2F0Y2g9PSJmdW5jdGlvbiI/Zi5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZyIGluc3RhbmNlb2YgTWFwP2YubWFwOnR5cGVvZiBTZXQ8InUiJiZyIGluc3RhbmNlb2YgU2V0P2Yuc2V0OnR5cGVvZiBEYXRlPCJ1IiYmciBpbnN0YW5jZW9mIERhdGU/Zi5kYXRlOmYub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIGYudW5rbm93bn19LGQ9eC5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxpcj1yPT5KU09OLnN0cmluZ2lmeShyLG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyBBIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzc3Vlcz1bXSx0aGlzLmFkZElzc3VlPW49Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsbl19LHRoaXMuYWRkSXNzdWVzPShuPVtdKT0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcywuLi5uXX07Y29uc3QgdD1uZXcudGFyZ2V0LnByb3RvdHlwZTtPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsdCk6dGhpcy5fX3Byb3RvX189dCx0aGlzLm5hbWU9IlpvZEVycm9yIix0aGlzLmlzc3Vlcz1lfWdldCBlcnJvcnMoKXtyZXR1cm4gdGhpcy5pc3N1ZXN9Zm9ybWF0KGUpe2NvbnN0IHQ9ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWVzc2FnZX0sbj17X2Vycm9yczpbXX0scz1hPT57Zm9yKGNvbnN0IGkgb2YgYS5pc3N1ZXMpaWYoaS5jb2RlPT09ImludmFsaWRfdW5pb24iKWkudW5pb25FcnJvcnMubWFwKHMpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfcmV0dXJuX3R5cGUiKXMoaS5yZXR1cm5UeXBlRXJyb3IpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfYXJndW1lbnRzIilzKGkuYXJndW1lbnRzRXJyb3IpO2Vsc2UgaWYoaS5wYXRoLmxlbmd0aD09PTApbi5fZXJyb3JzLnB1c2godChpKSk7ZWxzZXtsZXQgbz1uLGM9MDtmb3IoO2M8aS5wYXRoLmxlbmd0aDspe2NvbnN0IHU9aS5wYXRoW2NdO2M9PT1pLnBhdGgubGVuZ3RoLTE/KG9bdV09b1t1XXx8e19lcnJvcnM6W119LG9bdV0uX2Vycm9ycy5wdXNoKHQoaSkpKTpvW3VdPW9bdV18fHtfZXJyb3JzOltdfSxvPW9bdV0sYysrfX19O3JldHVybiBzKHRoaXMpLG59c3RhdGljIGFzc2VydChlKXtpZighKGUgaW5zdGFuY2VvZiBBKSl0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke2V9YCl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5tZXNzYWdlfWdldCBtZXNzYWdlKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLHguanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbihlPXQ9PnQubWVzc2FnZSl7Y29uc3QgdD17fSxuPVtdO2Zvcihjb25zdCBzIG9mIHRoaXMuaXNzdWVzKXMucGF0aC5sZW5ndGg+MD8odFtzLnBhdGhbMF1dPXRbcy5wYXRoWzBdXXx8W10sdFtzLnBhdGhbMF1dLnB1c2goZShzKSkpOm4ucHVzaChlKHMpKTtyZXR1cm57Zm9ybUVycm9yczpuLGZpZWxkRXJyb3JzOnR9fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1BLmNyZWF0ZT1yPT5uZXcgQShyKTtjb25zdCBpZT0ocixlKT0+e2xldCB0O3N3aXRjaChyLmNvZGUpe2Nhc2UgZC5pbnZhbGlkX3R5cGU6ci5yZWNlaXZlZD09PWYudW5kZWZpbmVkP3Q9IlJlcXVpcmVkIjp0PWBFeHBlY3RlZCAke3IuZXhwZWN0ZWR9LCByZWNlaXZlZCAke3IucmVjZWl2ZWR9YDticmVhaztjYXNlIGQuaW52YWxpZF9saXRlcmFsOnQ9YEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShyLmV4cGVjdGVkLHguanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgZC51bnJlY29nbml6ZWRfa2V5czp0PWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt4LmpvaW5WYWx1ZXMoci5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb246dD0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjp0PWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7eC5qb2luVmFsdWVzKHIub3B0aW9ucyl9YDticmVhaztjYXNlIGQuaW52YWxpZF9lbnVtX3ZhbHVlOnQ9YEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt4LmpvaW5WYWx1ZXMoci5vcHRpb25zKX0sIHJlY2VpdmVkICcke3IucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBkLmludmFsaWRfYXJndW1lbnRzOnQ9IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIGQuaW52YWxpZF9yZXR1cm5fdHlwZTp0PSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIGQuaW52YWxpZF9kYXRlOnQ9IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBkLmludmFsaWRfc3RyaW5nOnR5cGVvZiByLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiByLnZhbGlkYXRpb24/KHQ9YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtyLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIHIudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJih0PWAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ci52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke3IudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDp4LmFzc2VydE5ldmVyKHIudmFsaWRhdGlvbik6ci52YWxpZGF0aW9uIT09InJlZ2V4Ij90PWBJbnZhbGlkICR7ci52YWxpZGF0aW9ufWA6dD0iSW52YWxpZCI7YnJlYWs7Y2FzZSBkLnRvb19zbWFsbDpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7ci5taW5pbXVtfSBlbGVtZW50KHMpYDpyLnR5cGU9PT0ic3RyaW5nIj90PWBTdHJpbmcgbXVzdCBjb250YWluICR7ci5leGFjdD8iZXhhY3RseSI6ci5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7ci5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnIudHlwZT09PSJudW1iZXIiP3Q9YE51bWJlciBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtyLm1pbmltdW19YDpyLnR5cGU9PT0iZGF0ZSI/dD1gRGF0ZSBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIoci5taW5pbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQudG9vX2JpZzpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19IGVsZW1lbnQocylgOnIudHlwZT09PSJzdHJpbmciP3Q9YFN0cmluZyBtdXN0IGNvbnRhaW4gJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHtyLm1heGltdW19IGNoYXJhY3RlcihzKWA6ci50eXBlPT09Im51bWJlciI/dD1gTnVtYmVyIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19YDpyLnR5cGU9PT0iYmlnaW50Ij90PWBCaWdJbnQgbXVzdCBiZSAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3IubWF4aW11bX1gOnIudHlwZT09PSJkYXRlIj90PWBEYXRlIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIoci5tYXhpbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQuY3VzdG9tOnQ9IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgZC5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczp0PSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIGQubm90X211bHRpcGxlX29mOnQ9YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtyLm11bHRpcGxlT2Z9YDticmVhaztjYXNlIGQubm90X2Zpbml0ZTp0PSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6dD1lLmRlZmF1bHRFcnJvcix4LmFzc2VydE5ldmVyKHIpfXJldHVybnttZXNzYWdlOnR9fTtsZXQgX3Q9aWU7ZnVuY3Rpb24gb3Iocil7X3Q9cn1mdW5jdGlvbiBQZSgpe3JldHVybiBfdH1jb25zdCBWZT1yPT57Y29uc3R7ZGF0YTplLHBhdGg6dCxlcnJvck1hcHM6bixpc3N1ZURhdGE6c309cixhPVsuLi50LC4uLnMucGF0aHx8W11dLGk9ey4uLnMscGF0aDphfTtpZihzLm1lc3NhZ2UhPT12b2lkIDApcmV0dXJuey4uLnMscGF0aDphLG1lc3NhZ2U6cy5tZXNzYWdlfTtsZXQgbz0iIjtjb25zdCBjPW4uZmlsdGVyKHU9PiEhdSkuc2xpY2UoKS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHUgb2YgYylvPXUoaSx7ZGF0YTplLGRlZmF1bHRFcnJvcjpvfSkubWVzc2FnZTtyZXR1cm57Li4ucyxwYXRoOmEsbWVzc2FnZTpvfX0sY3I9W107ZnVuY3Rpb24gaChyLGUpe2NvbnN0IHQ9UGUoKSxuPVZlKHtpc3N1ZURhdGE6ZSxkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxlcnJvck1hcHM6W3IuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxyLnNjaGVtYUVycm9yTWFwLHQsdD09PWllP3ZvaWQgMDppZV0uZmlsdGVyKHM9PiEhcyl9KTtyLmNvbW1vbi5pc3N1ZXMucHVzaChuKX1jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT0idmFsaWQifWRpcnR5KCl7dGhpcy52YWx1ZT09PSJ2YWxpZCImJih0aGlzLnZhbHVlPSJkaXJ0eSIpfWFib3J0KCl7dGhpcy52YWx1ZSE9PSJhYm9ydGVkIiYmKHRoaXMudmFsdWU9ImFib3J0ZWQiKX1zdGF0aWMgbWVyZ2VBcnJheShlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7aWYocy5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7cy5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksbi5wdXNoKHMudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1hd2FpdCBzLmtleSxpPWF3YWl0IHMudmFsdWU7bi5wdXNoKHtrZXk6YSx2YWx1ZTppfSl9cmV0dXJuIEQubWVyZ2VPYmplY3RTeW5jKGUsbil9c3RhdGljIG1lcmdlT2JqZWN0U3luYyhlLHQpe2NvbnN0IG49e307Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3R7a2V5OmEsdmFsdWU6aX09cztpZihhLnN0YXR1cz09PSJhYm9ydGVkInx8aS5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7YS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksaS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksYS52YWx1ZSE9PSJfX3Byb3RvX18iJiYodHlwZW9mIGkudmFsdWU8InUifHxzLmFsd2F5c1NldCkmJihuW2EudmFsdWVdPWkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX19Y29uc3QgZz1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksb2U9cj0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyfSksTz1yPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOnJ9KSxudD1yPT5yLnN0YXR1cz09PSJhYm9ydGVkIixzdD1yPT5yLnN0YXR1cz09PSJkaXJ0eSIseGU9cj0+ci5zdGF0dXM9PT0idmFsaWQiLGtlPXI9PnR5cGVvZiBQcm9taXNlPCJ1IiYmciBpbnN0YW5jZW9mIFByb21pc2U7ZnVuY3Rpb24gTGUocixlLHQsbil7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiI/ciE9PWV8fCFuOiFlLmhhcyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTtyZXR1cm4gZS5nZXQocil9ZnVuY3Rpb24geHQocixlLHQsbixzKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIj9yIT09ZXx8IXM6IWUuaGFzKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7cmV0dXJuIGUuc2V0KHIsdCksdH10eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIHA7KGZ1bmN0aW9uKHIpe3IuZXJyVG9PYmo9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmV8fHt9LHIudG9TdHJpbmc9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP2U6ZT09bnVsbD92b2lkIDA6ZS5tZXNzYWdlfSkocHx8KHA9e30pKTt2YXIgYmUsd2U7Y2xhc3MgWXtjb25zdHJ1Y3RvcihlLHQsbixzKXt0aGlzLl9jYWNoZWRQYXRoPVtdLHRoaXMucGFyZW50PWUsdGhpcy5kYXRhPXQsdGhpcy5fcGF0aD1uLHRoaXMuX2tleT1zfWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RofHwodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsLi4udGhpcy5fa2V5KTp0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCx0aGlzLl9rZXkpKSx0aGlzLl9jYWNoZWRQYXRofX1jb25zdCBrdD0ocixlKT0+e2lmKHhlKGUpKXJldHVybntzdWNjZXNzOiEwLGRhdGE6ZS52YWx1ZX07aWYoIXIuY29tbW9uLmlzc3Vlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpO3JldHVybntzdWNjZXNzOiExLGdldCBlcnJvcigpe2lmKHRoaXMuX2Vycm9yKXJldHVybiB0aGlzLl9lcnJvcjtjb25zdCB0PW5ldyBBKHIuY29tbW9uLmlzc3Vlcyk7cmV0dXJuIHRoaXMuX2Vycm9yPXQsdGhpcy5fZXJyb3J9fX07ZnVuY3Rpb24gdihyKXtpZighcilyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjp0LHJlcXVpcmVkX2Vycm9yOm4sZGVzY3JpcHRpb246c309cjtpZihlJiYodHx8bikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246c306e2Vycm9yTWFwOihpLG8pPT57dmFyIGMsdTtjb25zdHttZXNzYWdlOmx9PXI7cmV0dXJuIGkuY29kZT09PSJpbnZhbGlkX2VudW1fdmFsdWUiP3ttZXNzYWdlOmw/P28uZGVmYXVsdEVycm9yfTp0eXBlb2Ygby5kYXRhPiJ1Ij97bWVzc2FnZTooYz1sPz9uKSE9PW51bGwmJmMhPT12b2lkIDA/YzpvLmRlZmF1bHRFcnJvcn06aS5jb2RlIT09ImludmFsaWRfdHlwZSI/e21lc3NhZ2U6by5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOih1PWw/P3QpIT09bnVsbCYmdSE9PXZvaWQgMD91Om8uZGVmYXVsdEVycm9yfX0sZGVzY3JpcHRpb246c319Y2xhc3MgX3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIEIoZS5kYXRhKX1fZ2V0T3JSZXR1cm5DdHgoZSx0KXtyZXR1cm4gdHx8e2NvbW1vbjplLnBhcmVudC5jb21tb24sZGF0YTplLmRhdGEscGFyc2VkVHlwZTpCKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19X3Byb2Nlc3NJbnB1dFBhcmFtcyhlKXtyZXR1cm57c3RhdHVzOm5ldyBELGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOkIoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX19X3BhcnNlU3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO2lmKGtlKHQpKXRocm93IG5ldyBFcnJvcigiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS4iKTtyZXR1cm4gdH1fcGFyc2VBc3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9cGFyc2UoZSx0KXtjb25zdCBuPXRoaXMuc2FmZVBhcnNlKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1zYWZlUGFyc2UoZSx0KXt2YXIgbjtjb25zdCBzPXtjb21tb246e2lzc3VlczpbXSxhc3luYzoobj10PT1udWxsP3ZvaWQgMDp0LmFzeW5jKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSxjb250ZXh0dWFsRXJyb3JNYXA6dD09bnVsbD92b2lkIDA6dC5lcnJvck1hcH0scGF0aDoodD09bnVsbD92b2lkIDA6dC5wYXRoKXx8W10sc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhcmVudDpudWxsLGRhdGE6ZSxwYXJzZWRUeXBlOkIoZSl9LGE9dGhpcy5fcGFyc2VTeW5jKHtkYXRhOmUscGF0aDpzLnBhdGgscGFyZW50OnN9KTtyZXR1cm4ga3QocyxhKX1hc3luYyBwYXJzZUFzeW5jKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1hc3luYyBzYWZlUGFyc2VBc3luYyhlLHQpe2NvbnN0IG49e2NvbW1vbjp7aXNzdWVzOltdLGNvbnRleHR1YWxFcnJvck1hcDp0PT1udWxsP3ZvaWQgMDp0LmVycm9yTWFwLGFzeW5jOiEwfSxwYXRoOih0PT1udWxsP3ZvaWQgMDp0LnBhdGgpfHxbXSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGFyZW50Om51bGwsZGF0YTplLHBhcnNlZFR5cGU6QihlKX0scz10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6bi5wYXRoLHBhcmVudDpufSksYT1hd2FpdChrZShzKT9zOlByb21pc2UucmVzb2x2ZShzKSk7cmV0dXJuIGt0KG4sYSl9cmVmaW5lKGUsdCl7Y29uc3Qgbj1zPT50eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PiJ1Ij97bWVzc2FnZTp0fTp0eXBlb2YgdD09ImZ1bmN0aW9uIj90KHMpOnQ7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHMsYSk9Pntjb25zdCBpPWUocyksbz0oKT0+YS5hZGRJc3N1ZSh7Y29kZTpkLmN1c3RvbSwuLi5uKHMpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGM9PmM/ITA6KG8oKSwhMSkpOmk/ITA6KG8oKSwhMSl9KX1yZWZpbmVtZW50KGUsdCl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKG4scyk9PmUobik/ITA6KHMuYWRkSXNzdWUodHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChuLHMpOnQpLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBDKHtzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJyZWZpbmVtZW50IixyZWZpbmVtZW50OmV9fSl9c3VwZXJSZWZpbmUoZSl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoZSl9b3B0aW9uYWwoKXtyZXR1cm4gUC5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIEouY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1udWxsaXNoKCl7cmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpfWFycmF5KCl7cmV0dXJuIFIuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1wcm9taXNlKCl7cmV0dXJuIGxlLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9b3IoZSl7cmV0dXJuIE1lLmNyZWF0ZShbdGhpcyxlXSx0aGlzLl9kZWYpfWFuZChlKXtyZXR1cm4gRGUuY3JlYXRlKHRoaXMsZSx0aGlzLl9kZWYpfXRyYW5zZm9ybShlKXtyZXR1cm4gbmV3IEMoey4uLnYodGhpcy5fZGVmKSxzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJ0cmFuc2Zvcm0iLHRyYW5zZm9ybTplfX0pfWRlZmF1bHQoZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgUmUoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6dCx0eXBlTmFtZTp5LlpvZERlZmF1bHR9KX1icmFuZCgpe3JldHVybiBuZXcgb3Qoe3R5cGVOYW1lOnkuWm9kQnJhbmRlZCx0eXBlOnRoaXMsLi4udih0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgQ2Uoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxjYXRjaFZhbHVlOnQsdHlwZU5hbWU6eS5ab2RDYXRjaH0pfWRlc2NyaWJlKGUpe2NvbnN0IHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IHQoey4uLnRoaXMuX2RlZixkZXNjcmlwdGlvbjplfSl9cGlwZShlKXtyZXR1cm4gWmUuY3JlYXRlKHRoaXMsZSl9cmVhZG9ubHkoKXtyZXR1cm4gSWUuY3JlYXRlKHRoaXMpfWlzT3B0aW9uYWwoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2Uodm9pZCAwKS5zdWNjZXNzfWlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc319Y29uc3QgdXI9L15jW15ccy1dezgsfSQvaSxkcj0vXlswLTlhLXpdKyQvLGxyPS9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvLGhyPS9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2ksZnI9L15bYS16MC05Xy1dezIxfSQvaSxtcj0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLHByPS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XycrXC1cLl0qKVtBLVowLTlfKy1dQChbQS1aMC05XVtBLVowLTlcLV0qXC4pK1tBLVpdezIsfSQvaSx5cj0iXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJCI7bGV0IGF0O2NvbnN0IGdyPS9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLyx2cj0vXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKSQvLF9yPS9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxidD0iKChcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXGR8MzApfCgwMiktKDBbMS05XXwxXFxkfDJbMC04XSkpKSIseHI9bmV3IFJlZ0V4cChgXiR7YnR9JGApO2Z1bmN0aW9uIHd0KHIpe2xldCBlPSIoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkIjtyZXR1cm4gci5wcmVjaXNpb24/ZT1gJHtlfVxcLlxcZHske3IucHJlY2lzaW9ufX1gOnIucHJlY2lzaW9uPT1udWxsJiYoZT1gJHtlfShcXC5cXGQrKT9gKSxlfWZ1bmN0aW9uIGtyKHIpe3JldHVybiBuZXcgUmVnRXhwKGBeJHt3dChyKX0kYCl9ZnVuY3Rpb24gU3Qocil7bGV0IGU9YCR7YnR9VCR7d3Qocil9YDtjb25zdCB0PVtdO3JldHVybiB0LnB1c2goci5sb2NhbD8iWj8iOiJaIiksci5vZmZzZXQmJnQucHVzaCgiKFsrLV1cXGR7Mn06P1xcZHsyfSkiKSxlPWAke2V9KCR7dC5qb2luKCJ8Iil9KWAsbmV3IFJlZ0V4cChgXiR7ZX0kYCl9ZnVuY3Rpb24gYnIocixlKXtyZXR1cm4hISgoZT09PSJ2NCJ8fCFlKSYmZ3IudGVzdChyKXx8KGU9PT0idjYifHwhZSkmJnZyLnRlc3QocikpfWNsYXNzIEUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5zdHJpbmcpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnN0cmluZyxyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWNvbnN0IG49bmV3IEQ7bGV0IHM7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylpZihhLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPGEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0ibWF4IillLmRhdGEubGVuZ3RoPmEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09Imxlbmd0aCIpe2NvbnN0IGk9ZS5kYXRhLmxlbmd0aD5hLnZhbHVlLG89ZS5kYXRhLmxlbmd0aDxhLnZhbHVlOyhpfHxvKSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxpP2gocyx7Y29kZTpkLnRvb19iaWcsbWF4aW11bTphLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6YS5tZXNzYWdlfSk6byYmaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMCxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSl9ZWxzZSBpZihhLmtpbmQ9PT0iZW1haWwiKXByLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImVtYWlsIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImVtb2ppIilhdHx8KGF0PW5ldyBSZWdFeHAoeXIsInUiKSksYXQudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0idXVpZCIpaHIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoidXVpZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJuYW5vaWQiKWZyLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246Im5hbm9pZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJjdWlkIil1ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImN1aWQyIilkci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJ1bGlkIilsci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1bGlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09InVybCIpdHJ5e25ldyBVUkwoZS5kYXRhKX1jYXRjaHtzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1cmwiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKX1lbHNlIGEua2luZD09PSJyZWdleCI/KGEucmVnZXgubGFzdEluZGV4PTAsYS5yZWdleC50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKSk6YS5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOmEua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKGEudmFsdWUsYS5wb3NpdGlvbil8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7aW5jbHVkZXM6YS52YWx1ZSxwb3NpdGlvbjphLnBvc2l0aW9ufSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09InRvTG93ZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvTG93ZXJDYXNlKCk6YS5raW5kPT09InRvVXBwZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvVXBwZXJDYXNlKCk6YS5raW5kPT09InN0YXJ0c1dpdGgiP2UuZGF0YS5zdGFydHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e3N0YXJ0c1dpdGg6YS52YWx1ZX0sbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJlbmRzV2l0aCI/ZS5kYXRhLmVuZHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOmEudmFsdWV9LG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTphLmtpbmQ9PT0iZGF0ZXRpbWUiP1N0KGEpLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOiJkYXRldGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkYXRlIj94ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJ0aW1lIj9rcihhKS50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoidGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkdXJhdGlvbiI/bXIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZHVyYXRpb24iLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09ImlwIj9icihlLmRhdGEsYS52ZXJzaW9uKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImlwIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJiYXNlNjQiP19yLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImJhc2U2NCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTp4LmFzc2VydE5ldmVyKGEpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLHQsbil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChzPT5lLnRlc3Qocykse3ZhbGlkYXRpb246dCxjb2RlOmQuaW52YWxpZF9zdHJpbmcsLi4ucC5lcnJUb09iaihuKX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1lbWFpbChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVtYWlsIiwuLi5wLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5wLmVyclRvT2JqKGUpfSl9ZW1vamkoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbW9qaSIsLi4ucC5lcnJUb09iaihlKX0pfXV1aWQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJ1dWlkIiwuLi5wLmVyclRvT2JqKGUpfSl9bmFub2lkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibmFub2lkIiwuLi5wLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLnAuZXJyVG9PYmooZSl9KX1jdWlkMihlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQyIiwuLi5wLmVyclRvT2JqKGUpfSl9dWxpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InVsaWQiLC4uLnAuZXJyVG9PYmooZSl9KX1iYXNlNjQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJiYXNlNjQiLC4uLnAuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5wLmVyclRvT2JqKGUpfSl9ZGF0ZXRpbWUoZSl7dmFyIHQsbjtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOm51bGwsb2Zmc2V0OiExLGxvY2FsOiExLG1lc3NhZ2U6ZX0pOnRoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sb2Zmc2V0Oih0PWU9PW51bGw/dm9pZCAwOmUub2Zmc2V0KSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSxsb2NhbDoobj1lPT1udWxsP3ZvaWQgMDplLmxvY2FsKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSwuLi5wLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1kYXRlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZGF0ZSIsbWVzc2FnZTplfSl9dGltZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJ0aW1lIixwcmVjaXNpb246bnVsbCxtZXNzYWdlOmV9KTp0aGlzLl9hZGRDaGVjayh7a2luZDoidGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sLi4ucC5lcnJUb09iaihlPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2UpfSl9ZHVyYXRpb24oZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJkdXJhdGlvbiIsLi4ucC5lcnJUb09iaihlKX0pfXJlZ2V4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJyZWdleCIscmVnZXg6ZSwuLi5wLmVyclRvT2JqKHQpfSl9aW5jbHVkZXMoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImluY2x1ZGVzIix2YWx1ZTplLHBvc2l0aW9uOnQ9PW51bGw/dm9pZCAwOnQucG9zaXRpb24sLi4ucC5lcnJUb09iaih0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9ZW5kc1dpdGgoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVuZHNXaXRoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4ucC5lcnJUb09iaih0KX0pfWxlbmd0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibGVuZ3RoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxwLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyBFKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOiJ0cmltIn1dfSl9dG9Mb3dlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvTG93ZXJDYXNlIn1dfSl9dG9VcHBlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNEYXRlKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImRhdGUiKX1nZXQgaXNUaW1lKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InRpbWUiKX1nZXQgaXNEdXJhdGlvbigpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJkdXJhdGlvbiIpfWdldCBpc0VtYWlsKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtYWlsIil9Z2V0IGlzVVJMKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InVybCIpfWdldCBpc0Vtb2ppKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtb2ppIil9Z2V0IGlzVVVJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1dWlkIil9Z2V0IGlzTkFOT0lEKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09Im5hbm9pZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgaXNCYXNlNjQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iYmFzZTY0Iil9Z2V0IG1pbkxlbmd0aCgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHx0LnZhbHVlPmUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4TGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHQudmFsdWU8ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfX1FLmNyZWF0ZT1yPT57dmFyIGU7cmV0dXJuIG5ldyBFKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2RTdHJpbmcsY29lcmNlOihlPXI9PW51bGw/dm9pZCAwOnIuY29lcmNlKSE9PW51bGwmJmUhPT12b2lkIDA/ZTohMSwuLi52KHIpfSl9O2Z1bmN0aW9uIHdyKHIsZSl7Y29uc3QgdD0oci50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscz10Pm4/dDpuLGE9cGFyc2VJbnQoci50b0ZpeGVkKHMpLnJlcGxhY2UoIi4iLCIiKSksaT1wYXJzZUludChlLnRvRml4ZWQocykucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gYSVpL01hdGgucG93KDEwLHMpfWNsYXNzIEggZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZSx0aGlzLnN0ZXA9dGhpcy5tdWx0aXBsZU9mfV9wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPU51bWJlcihlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5udW1iZXIpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLm51bWJlcixyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWxldCBuO2NvbnN0IHM9bmV3IEQ7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylhLmtpbmQ9PT0iaW50Ij94LmlzSW50ZWdlcihlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDoiaW50ZWdlciIscmVjZWl2ZWQ6ImZsb2F0IixtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1pbiI/KGEuaW5jbHVzaXZlP2UuZGF0YTxhLnZhbHVlOmUuZGF0YTw9YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTphLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1heCI/KGEuaW5jbHVzaXZlP2UuZGF0YT5hLnZhbHVlOmUuZGF0YT49YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6YS5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtdWx0aXBsZU9mIj93cihlLmRhdGEsYS52YWx1ZSkhPT0wJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOmEudmFsdWUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJmaW5pdGUiP051bWJlci5pc0Zpbml0ZShlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9maW5pdGUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOnguYXNzZXJ0TmV2ZXIoYSk7cmV0dXJue3N0YXR1czpzLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxwLnRvU3RyaW5nKHQpKX1ndChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEscC50b1N0cmluZyh0KSl9bHRlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMCxwLnRvU3RyaW5nKHQpKX1sdChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEscC50b1N0cmluZyh0KSl9c2V0TGltaXQoZSx0LG4scyl7cmV0dXJuIG5ldyBIKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOmUsdmFsdWU6dCxpbmNsdXNpdmU6bixtZXNzYWdlOnAudG9TdHJpbmcocyl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEgoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1pbnQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJpbnQiLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMSxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9bm9ucG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWZpbml0ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImZpbml0ZSIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9c2FmZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsaW5jbHVzaXZlOiEwLHZhbHVlOk51bWJlci5NSU5fU0FGRV9JTlRFR0VSLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgaXNJbnQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaW50Inx8ZS5raW5kPT09Im11bHRpcGxlT2YiJiZ4LmlzSW50ZWdlcihlLnZhbHVlKSl9Z2V0IGlzRmluaXRlKCl7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyl7aWYobi5raW5kPT09ImZpbml0ZSJ8fG4ua2luZD09PSJpbnQifHxuLmtpbmQ9PT0ibXVsdGlwbGVPZiIpcmV0dXJuITA7bi5raW5kPT09Im1pbiI/KHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTpuLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKX1yZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpJiZOdW1iZXIuaXNGaW5pdGUoZSl9fUguY3JlYXRlPXI9Pm5ldyBIKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2ROdW1iZXIsY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBxIGV4dGVuZHMgX3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5taW49dGhpcy5ndGUsdGhpcy5tYXg9dGhpcy5sdGV9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9QmlnSW50KGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJpZ2ludCl7Y29uc3QgYT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChhLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuYmlnaW50LHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9bGV0IG47Y29uc3Qgcz1uZXcgRDtmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iPyhhLmluY2x1c2l2ZT9lLmRhdGE8YS52YWx1ZTplLmRhdGE8PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06YS52YWx1ZSxpbmNsdXNpdmU6YS5pbmNsdXNpdmUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtYXgiPyhhLmluY2x1c2l2ZT9lLmRhdGE+YS52YWx1ZTplLmRhdGE+PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19iaWcsdHlwZToiYmlnaW50IixtYXhpbXVtOmEudmFsdWUsaW5jbHVzaXZlOmEuaW5jbHVzaXZlLG1lc3NhZ2U6YS5tZXNzYWdlfSkscy5kaXJ0eSgpKTphLmtpbmQ9PT0ibXVsdGlwbGVPZiI/ZS5kYXRhJWEudmFsdWUhPT1CaWdJbnQoMCkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6YS52YWx1ZSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOnMudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLHAudG9TdHJpbmcodCkpfWd0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMSxwLnRvU3RyaW5nKHQpKX1sdGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLHAudG9TdHJpbmcodCkpfWx0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxwLnRvU3RyaW5nKHQpKX1zZXRMaW1pdChlLHQsbixzKXtyZXR1cm4gbmV3IHEoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTp0LGluY2x1c2l2ZTpuLG1lc3NhZ2U6cC50b1N0cmluZyhzKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgcSh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW11bHRpcGxlT2YoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im11bHRpcGxlT2YiLHZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX19cS5jcmVhdGU9cj0+e3ZhciBlO3JldHVybiBuZXcgcSh7Y2hlY2tzOltdLHR5cGVOYW1lOnkuWm9kQmlnSW50LGNvZXJjZTooZT1yPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4udihyKX0pfTtjbGFzcyBTZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9ISFlLmRhdGEpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJvb2xlYW4pe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmJvb2xlYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1TZS5jcmVhdGU9cj0+bmV3IFNlKHt0eXBlTmFtZTp5LlpvZEJvb2xlYW4sY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBLIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5kYXRlKXtjb25zdCBhPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKGEse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5kYXRlLHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9aWYoaXNOYU4oZS5kYXRhLmdldFRpbWUoKSkpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfZGF0ZX0pLGd9Y29uc3Qgbj1uZXcgRDtsZXQgcztmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iP2UuZGF0YS5nZXRUaW1lKCk8YS52YWx1ZSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC50b29fc21hbGwsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6YS5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5hLnZhbHVlJiYocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLnRvb19iaWcsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1heGltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6bmV3IERhdGUoZS5kYXRhLmdldFRpbWUoKSl9fV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEsoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUuZ2V0VGltZSgpLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWdldCBtaW5EYXRlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlIT1udWxsP25ldyBEYXRlKGUpOm51bGx9Z2V0IG1heERhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpdC5raW5kPT09Im1heCImJihlPT09bnVsbHx8dC52YWx1ZTxlKSYmKGU9dC52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH19Sy5jcmVhdGU9cj0+bmV3IEsoe2NoZWNrczpbXSxjb2VyY2U6KHI9PW51bGw/dm9pZCAwOnIuY29lcmNlKXx8ITEsdHlwZU5hbWU6eS5ab2REYXRlLC4uLnYocil9KTtjbGFzcyB6ZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLnN5bWJvbCl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChuLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuc3ltYm9sLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19emUuY3JlYXRlPXI9Pm5ldyB6ZSh7dHlwZU5hbWU6eS5ab2RTeW1ib2wsLi4udihyKX0pO2NsYXNzIFRlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi51bmRlZmluZWQscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1UZS5jcmVhdGU9cj0+bmV3IFRlKHt0eXBlTmFtZTp5LlpvZFVuZGVmaW5lZCwuLi52KHIpfSk7Y2xhc3MgJGUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09Zi5udWxsKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5udWxsLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19JGUuY3JlYXRlPXI9Pm5ldyAkZSh7dHlwZU5hbWU6eS5ab2ROdWxsLC4uLnYocil9KTtjbGFzcyBjZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2FueT0hMH1fcGFyc2UoZSl7cmV0dXJuIE8oZS5kYXRhKX19Y2UuY3JlYXRlPXI9Pm5ldyBjZSh7dHlwZU5hbWU6eS5ab2RBbnksLi4udihyKX0pO2NsYXNzIFEgZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4gTyhlLmRhdGEpfX1RLmNyZWF0ZT1yPT5uZXcgUSh7dHlwZU5hbWU6eS5ab2RVbmtub3duLC4uLnYocil9KTtjbGFzcyBMIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYubmV2ZXIscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZ319TC5jcmVhdGU9cj0+bmV3IEwoe3R5cGVOYW1lOnkuWm9kTmV2ZXIsLi4udihyKX0pO2NsYXNzIFVlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi52b2lkLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19VWUuY3JlYXRlPXI9Pm5ldyBVZSh7dHlwZU5hbWU6eS5ab2RWb2lkLC4uLnYocil9KTtjbGFzcyBSIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnQsc3RhdHVzOm59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZjtpZih0LnBhcnNlZFR5cGUhPT1mLmFycmF5KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5hcnJheSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2lmKHMuZXhhY3RMZW5ndGghPT1udWxsKXtjb25zdCBpPXQuZGF0YS5sZW5ndGg+cy5leGFjdExlbmd0aC52YWx1ZSxvPXQuZGF0YS5sZW5ndGg8cy5leGFjdExlbmd0aC52YWx1ZTsoaXx8bykmJihoKHQse2NvZGU6aT9kLnRvb19iaWc6ZC50b29fc21hbGwsbWluaW11bTpvP3MuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06aT9zLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6cy5leGFjdExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKX1pZihzLm1pbkxlbmd0aCE9PW51bGwmJnQuZGF0YS5sZW5ndGg8cy5taW5MZW5ndGgudmFsdWUmJihoKHQse2NvZGU6ZC50b29fc21hbGwsbWluaW11bTpzLm1pbkxlbmd0aC52YWx1ZSx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5taW5MZW5ndGgubWVzc2FnZX0pLG4uZGlydHkoKSkscy5tYXhMZW5ndGghPT1udWxsJiZ0LmRhdGEubGVuZ3RoPnMubWF4TGVuZ3RoLnZhbHVlJiYoaCh0LHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnMubWF4TGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpzLm1heExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKSx0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwoWy4uLnQuZGF0YV0ubWFwKChpLG8pPT5zLnR5cGUuX3BhcnNlQXN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpKS50aGVuKGk9PkQubWVyZ2VBcnJheShuLGkpKTtjb25zdCBhPVsuLi50LmRhdGFdLm1hcCgoaSxvKT0+cy50eXBlLl9wYXJzZVN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpO3JldHVybiBELm1lcmdlQXJyYXkobixhKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSx0KXtyZXR1cm4gbmV3IFIoey4uLnRoaXMuX2RlZixtaW5MZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgUih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOnAudG9TdHJpbmcodCl9fSl9bGVuZ3RoKGUsdCl7cmV0dXJuIG5ldyBSKHsuLi50aGlzLl9kZWYsZXhhY3RMZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1SLmNyZWF0ZT0ocixlKT0+bmV3IFIoe3R5cGU6cixtaW5MZW5ndGg6bnVsbCxtYXhMZW5ndGg6bnVsbCxleGFjdExlbmd0aDpudWxsLHR5cGVOYW1lOnkuWm9kQXJyYXksLi4udihlKX0pO2Z1bmN0aW9uIHVlKHIpe2lmKHIgaW5zdGFuY2VvZiBUKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIuc2hhcGUpe2NvbnN0IG49ci5zaGFwZVt0XTtlW3RdPVAuY3JlYXRlKHVlKG4pKX1yZXR1cm4gbmV3IFQoey4uLnIuX2RlZixzaGFwZTooKT0+ZX0pfWVsc2UgcmV0dXJuIHIgaW5zdGFuY2VvZiBSP25ldyBSKHsuLi5yLl9kZWYsdHlwZTp1ZShyLmVsZW1lbnQpfSk6ciBpbnN0YW5jZW9mIFA/UC5jcmVhdGUodWUoci51bndyYXAoKSkpOnIgaW5zdGFuY2VvZiBKP0ouY3JlYXRlKHVlKHIudW53cmFwKCkpKTpyIGluc3RhbmNlb2YgVz9XLmNyZWF0ZShyLml0ZW1zLm1hcChlPT51ZShlKSkpOnJ9Y2xhc3MgVCBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2NhY2hlZD1udWxsLHRoaXMubm9uc3RyaWN0PXRoaXMucGFzc3Rocm91Z2gsdGhpcy5hdWdtZW50PXRoaXMuZXh0ZW5kfV9nZXRDYWNoZWQoKXtpZih0aGlzLl9jYWNoZWQhPT1udWxsKXJldHVybiB0aGlzLl9jYWNoZWQ7Y29uc3QgZT10aGlzLl9kZWYuc2hhcGUoKSx0PXgub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6dH19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh1LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGd9Y29uc3R7c3RhdHVzOm4sY3R4OnN9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSx7c2hhcGU6YSxrZXlzOml9PXRoaXMuX2dldENhY2hlZCgpLG89W107aWYoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBzLmRhdGEpaS5pbmNsdWRlcyh1KXx8by5wdXNoKHUpO2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgb2YgaSl7Y29uc3QgbD1hW3VdLGs9cy5kYXRhW3VdO2MucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpsLl9wYXJzZShuZXcgWShzLGsscy5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBzLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMKXtjb25zdCB1PXRoaXMuX2RlZi51bmtub3duS2V5cztpZih1PT09InBhc3N0aHJvdWdoIilmb3IoY29uc3QgbCBvZiBvKWMucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTpsfSx2YWx1ZTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6cy5kYXRhW2xdfX0pO2Vsc2UgaWYodT09PSJzdHJpY3QiKW8ubGVuZ3RoPjAmJihoKHMse2NvZGU6ZC51bnJlY29nbml6ZWRfa2V5cyxrZXlzOm99KSxuLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgbCBvZiBvKXtjb25zdCBrPXMuZGF0YVtsXTtjLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6bH0sdmFsdWU6dS5fcGFyc2UobmV3IFkocyxrLHMucGF0aCxsKSksYWx3YXlzU2V0OmwgaW4gcy5kYXRhfSl9fXJldHVybiBzLmNvbW1vbi5hc3luYz9Qcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntjb25zdCB1PVtdO2Zvcihjb25zdCBsIG9mIGMpe2NvbnN0IGs9YXdhaXQgbC5rZXksUz1hd2FpdCBsLnZhbHVlO3UucHVzaCh7a2V5OmssdmFsdWU6UyxhbHdheXNTZXQ6bC5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+RC5tZXJnZU9iamVjdFN5bmMobix1KSk6RC5tZXJnZU9iamVjdFN5bmMobixjKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KGUpe3JldHVybiBwLmVyclRvT2JqLG5ldyBUKHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InN0cmljdCIsLi4uZSE9PXZvaWQgMD97ZXJyb3JNYXA6KHQsbik9Pnt2YXIgcyxhLGksbztjb25zdCBjPShpPShhPShzPXRoaXMuX2RlZikuZXJyb3JNYXApPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS5jYWxsKHMsdCxuKS5tZXNzYWdlKSE9PW51bGwmJmkhPT12b2lkIDA/aTpuLmRlZmF1bHRFcnJvcjtyZXR1cm4gdC5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIj97bWVzc2FnZToobz1wLmVyclRvT2JqKGUpLm1lc3NhZ2UpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmN9OnttZXNzYWdlOmN9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJwYXNzdGhyb3VnaCJ9KX1leHRlbmQoZSl7cmV0dXJuIG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4uZX0pfSl9bWVyZ2UoZSl7cmV0dXJuIG5ldyBUKHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6eS5ab2RPYmplY3R9KX1zZXRLZXkoZSx0KXtyZXR1cm4gdGhpcy5hdWdtZW50KHtbZV06dH0pfWNhdGNoYWxsKGUpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOmV9KX1waWNrKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyhlKS5mb3JFYWNoKG49PntlW25dJiZ0aGlzLnNoYXBlW25dJiYodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1vbWl0KGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntlW25dfHwodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1kZWVwUGFydGlhbCgpe3JldHVybiB1ZSh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49Pntjb25zdCBzPXRoaXMuc2hhcGVbbl07ZSYmIWVbbl0/dFtuXT1zOnRbbl09cy5vcHRpb25hbCgpfSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfXJlcXVpcmVkKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntpZihlJiYhZVtuXSl0W25dPXRoaXMuc2hhcGVbbl07ZWxzZXtsZXQgYT10aGlzLnNoYXBlW25dO2Zvcig7YSBpbnN0YW5jZW9mIFA7KWE9YS5fZGVmLmlubmVyVHlwZTt0W25dPWF9fSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfWtleW9mKCl7cmV0dXJuIFR0KHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fVQuY3JlYXRlPShyLGUpPT5uZXcgVCh7c2hhcGU6KCk9PnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KSxULnN0cmljdENyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOigpPT5yLHVua25vd25LZXlzOiJzdHJpY3QiLGNhdGNoYWxsOkwuY3JlYXRlKCksdHlwZU5hbWU6eS5ab2RPYmplY3QsLi4udihlKX0pLFQubGF6eWNyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KTtjbGFzcyBNZSBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksbj10aGlzLl9kZWYub3B0aW9ucztmdW5jdGlvbiBzKGEpe2Zvcihjb25zdCBvIG9mIGEpaWYoby5yZXN1bHQuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gby5yZXN1bHQ7Zm9yKGNvbnN0IG8gb2YgYSlpZihvLnJlc3VsdC5zdGF0dXM9PT0iZGlydHkiKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5vLmN0eC5jb21tb24uaXNzdWVzKSxvLnJlc3VsdDtjb25zdCBpPWEubWFwKG89Pm5ldyBBKG8uY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczppfSksZ31pZih0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwobi5tYXAoYXN5bmMgYT0+e2NvbnN0IGk9ey4uLnQsY29tbW9uOnsuLi50LmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfTtyZXR1cm57cmVzdWx0OmF3YWl0IGEuX3BhcnNlQXN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDppfSksY3R4Oml9fSkpLnRoZW4ocyk7e2xldCBhO2NvbnN0IGk9W107Zm9yKGNvbnN0IGMgb2Ygbil7Y29uc3QgdT17Li4udCxjb21tb246ey4uLnQuY29tbW9uLGlzc3VlczpbXX0scGFyZW50Om51bGx9LGw9Yy5fcGFyc2VTeW5jKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dX0pO2lmKGwuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gbDtsLnN0YXR1cz09PSJkaXJ0eSImJiFhJiYoYT17cmVzdWx0OmwsY3R4OnV9KSx1LmNvbW1vbi5pc3N1ZXMubGVuZ3RoJiZpLnB1c2godS5jb21tb24uaXNzdWVzKX1pZihhKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5hLmN0eC5jb21tb24uaXNzdWVzKSxhLnJlc3VsdDtjb25zdCBvPWkubWFwKGM9Pm5ldyBBKGMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpvfSksZ319Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fU1lLmNyZWF0ZT0ocixlKT0+bmV3IE1lKHtvcHRpb25zOnIsdHlwZU5hbWU6eS5ab2RVbmlvbiwuLi52KGUpfSk7Y29uc3Qgej1yPT5yIGluc3RhbmNlb2YgTmU/eihyLnNjaGVtYSk6ciBpbnN0YW5jZW9mIEM/eihyLmlubmVyVHlwZSgpKTpyIGluc3RhbmNlb2YgQWU/W3IudmFsdWVdOnIgaW5zdGFuY2VvZiBHP3Iub3B0aW9uczpyIGluc3RhbmNlb2YgRWU/eC5vYmplY3RWYWx1ZXMoci5lbnVtKTpyIGluc3RhbmNlb2YgUmU/eihyLl9kZWYuaW5uZXJUeXBlKTpyIGluc3RhbmNlb2YgVGU/W3ZvaWQgMF06ciBpbnN0YW5jZW9mICRlP1tudWxsXTpyIGluc3RhbmNlb2YgUD9bdm9pZCAwLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBKP1tudWxsLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBvdHx8ciBpbnN0YW5jZW9mIEllP3ooci51bndyYXAoKSk6ciBpbnN0YW5jZW9mIENlP3ooci5fZGVmLmlubmVyVHlwZSk6W107Y2xhc3MgRmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztjb25zdCBuPXRoaXMuZGlzY3JpbWluYXRvcixzPXQuZGF0YVtuXSxhPXRoaXMub3B0aW9uc01hcC5nZXQocyk7cmV0dXJuIGE/dC5jb21tb24uYXN5bmM/YS5fcGFyc2VBc3luYyh7ZGF0YTp0LmRhdGEscGF0aDp0LnBhdGgscGFyZW50OnR9KTphLl9wYXJzZVN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDp0fSk6KGgodCx7Y29kZTpkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSkscGF0aDpbbl19KSxnKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsdCxuKXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgaT16KGEuc2hhcGVbZV0pO2lmKCFpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgbyBvZiBpKXtpZihzLmhhcyhvKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcobyl9YCk7cy5zZXQobyxhKX19cmV0dXJuIG5ldyBGZSh7dHlwZU5hbWU6eS5ab2REaXNjcmltaW5hdGVkVW5pb24sZGlzY3JpbWluYXRvcjplLG9wdGlvbnM6dCxvcHRpb25zTWFwOnMsLi4udihuKX0pfX1mdW5jdGlvbiBpdChyLGUpe2NvbnN0IHQ9QihyKSxuPUIoZSk7aWYocj09PWUpcmV0dXJue3ZhbGlkOiEwLGRhdGE6cn07aWYodD09PWYub2JqZWN0JiZuPT09Zi5vYmplY3Qpe2NvbnN0IHM9eC5vYmplY3RLZXlzKGUpLGE9eC5vYmplY3RLZXlzKHIpLmZpbHRlcihvPT5zLmluZGV4T2YobykhPT0tMSksaT17Li4uciwuLi5lfTtmb3IoY29uc3QgbyBvZiBhKXtjb25zdCBjPWl0KHJbb10sZVtvXSk7aWYoIWMudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtpW29dPWMuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTppfX1lbHNlIGlmKHQ9PT1mLmFycmF5JiZuPT09Zi5hcnJheSl7aWYoci5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IHM9W107Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2NvbnN0IGk9clthXSxvPWVbYV0sYz1pdChpLG8pO2lmKCFjLnZhbGlkKXJldHVybnt2YWxpZDohMX07cy5wdXNoKGMuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6c319ZWxzZSByZXR1cm4gdD09PWYuZGF0ZSYmbj09PWYuZGF0ZSYmK3I9PStlP3t2YWxpZDohMCxkYXRhOnJ9Ont2YWxpZDohMX19Y2xhc3MgRGUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHM9KGEsaSk9PntpZihudChhKXx8bnQoaSkpcmV0dXJuIGc7Y29uc3Qgbz1pdChhLnZhbHVlLGkudmFsdWUpO3JldHVybiBvLnZhbGlkPygoc3QoYSl8fHN0KGkpKSYmdC5kaXJ0eSgpLHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvLmRhdGF9KTooaChuLHtjb2RlOmQuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSxnKX07cmV0dXJuIG4uY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSldKS50aGVuKChbYSxpXSk9PnMoYSxpKSk6cyh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pKX19RGUuY3JlYXRlPShyLGUsdCk9Pm5ldyBEZSh7bGVmdDpyLHJpZ2h0OmUsdHlwZU5hbWU6eS5ab2RJbnRlcnNlY3Rpb24sLi4udih0KX0pO2NsYXNzIFcgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYuYXJyYXkpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmFycmF5LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGc7aWYobi5kYXRhLmxlbmd0aDx0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKXJldHVybiBoKG4se2NvZGU6ZC50b29fc21hbGwsbWluaW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxnOyF0aGlzLl9kZWYucmVzdCYmbi5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYoaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHQuZGlydHkoKSk7Y29uc3QgYT1bLi4ubi5kYXRhXS5tYXAoKGksbyk9Pntjb25zdCBjPXRoaXMuX2RlZi5pdGVtc1tvXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGM/Yy5fcGFyc2UobmV3IFkobixpLG4ucGF0aCxvKSk6bnVsbH0pLmZpbHRlcihpPT4hIWkpO3JldHVybiBuLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChhKS50aGVuKGk9PkQubWVyZ2VBcnJheSh0LGkpKTpELm1lcmdlQXJyYXkodCxhKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QoZSl7cmV0dXJuIG5ldyBXKHsuLi50aGlzLl9kZWYscmVzdDplfSl9fVcuY3JlYXRlPShyLGUpPT57aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgVyh7aXRlbXM6cix0eXBlTmFtZTp5LlpvZFR1cGxlLHJlc3Q6bnVsbCwuLi52KGUpfSl9O2NsYXNzIE9lIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPVtdLGE9dGhpcy5fZGVmLmtleVR5cGUsaT10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBvIGluIG4uZGF0YSlzLnB1c2goe2tleTphLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLG8pKSx2YWx1ZTppLl9wYXJzZShuZXcgWShuLG4uZGF0YVtvXSxuLnBhdGgsbykpLGFsd2F5c1NldDpvIGluIG4uZGF0YX0pO3JldHVybiBuLmNvbW1vbi5hc3luYz9ELm1lcmdlT2JqZWN0QXN5bmModCxzKTpELm1lcmdlT2JqZWN0U3luYyh0LHMpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLHQsbil7cmV0dXJuIHQgaW5zdGFuY2VvZiBfP25ldyBPZSh7a2V5VHlwZTplLHZhbHVlVHlwZTp0LHR5cGVOYW1lOnkuWm9kUmVjb3JkLC4uLnYobil9KTpuZXcgT2Uoe2tleVR5cGU6RS5jcmVhdGUoKSx2YWx1ZVR5cGU6ZSx0eXBlTmFtZTp5LlpvZFJlY29yZCwuLi52KHQpfSl9fWNsYXNzIEJlIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYubWFwKXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5tYXAscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPXRoaXMuX2RlZi5rZXlUeXBlLGE9dGhpcy5fZGVmLnZhbHVlVHlwZSxpPVsuLi5uLmRhdGEuZW50cmllcygpXS5tYXAoKFtvLGNdLHUpPT4oe2tleTpzLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLFt1LCJrZXkiXSkpLHZhbHVlOmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsW3UsInZhbHVlIl0pKX0pKTtpZihuLmNvbW1vbi5hc3luYyl7Y29uc3Qgbz1uZXcgTWFwO3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntmb3IoY29uc3QgYyBvZiBpKXtjb25zdCB1PWF3YWl0IGMua2V5LGw9YXdhaXQgYy52YWx1ZTtpZih1LnN0YXR1cz09PSJhYm9ydGVkInx8bC5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7KHUuc3RhdHVzPT09ImRpcnR5Inx8bC5zdGF0dXM9PT0iZGlydHkiKSYmdC5kaXJ0eSgpLG8uc2V0KHUudmFsdWUsbC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOm99fSl9ZWxzZXtjb25zdCBvPW5ldyBNYXA7Zm9yKGNvbnN0IGMgb2YgaSl7Y29uc3QgdT1jLmtleSxsPWMudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnOyh1LnN0YXR1cz09PSJkaXJ0eSJ8fGwuc3RhdHVzPT09ImRpcnR5IikmJnQuZGlydHkoKSxvLnNldCh1LnZhbHVlLGwudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX19fUJlLmNyZWF0ZT0ocixlLHQpPT5uZXcgQmUoe3ZhbHVlVHlwZTplLGtleVR5cGU6cix0eXBlTmFtZTp5LlpvZE1hcCwuLi52KHQpfSk7Y2xhc3MgWCBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e3N0YXR1czp0LGN0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09Zi5zZXQpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnNldCxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnO2NvbnN0IHM9dGhpcy5fZGVmO3MubWluU2l6ZSE9PW51bGwmJm4uZGF0YS5zaXplPHMubWluU2l6ZS52YWx1ZSYmKGgobix7Y29kZTpkLnRvb19zbWFsbCxtaW5pbXVtOnMubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOnMubWluU2l6ZS5tZXNzYWdlfSksdC5kaXJ0eSgpKSxzLm1heFNpemUhPT1udWxsJiZuLmRhdGEuc2l6ZT5zLm1heFNpemUudmFsdWUmJihoKG4se2NvZGU6ZC50b29fYmlnLG1heGltdW06cy5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5tYXhTaXplLm1lc3NhZ2V9KSx0LmRpcnR5KCkpO2NvbnN0IGE9dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBpKGMpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgbCBvZiBjKXtpZihsLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZztsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSx1LmFkZChsLnZhbHVlKX1yZXR1cm57c3RhdHVzOnQudmFsdWUsdmFsdWU6dX19Y29uc3Qgbz1bLi4ubi5kYXRhLnZhbHVlcygpXS5tYXAoKGMsdSk9PmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsdSkpKTtyZXR1cm4gbi5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihjPT5pKGMpKTppKG8pfW1pbihlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1heFNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfXNpemUoZSx0KXtyZXR1cm4gdGhpcy5taW4oZSx0KS5tYXgoZSx0KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WC5jcmVhdGU9KHIsZSk9Pm5ldyBYKHt2YWx1ZVR5cGU6cixtaW5TaXplOm51bGwsbWF4U2l6ZTpudWxsLHR5cGVOYW1lOnkuWm9kU2V0LC4uLnYoZSl9KTtjbGFzcyBkZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMudmFsaWRhdGU9dGhpcy5pbXBsZW1lbnR9X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYodC5wYXJzZWRUeXBlIT09Zi5mdW5jdGlvbilyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuZnVuY3Rpb24scmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztmdW5jdGlvbiBuKG8sYyl7cmV0dXJuIFZlKHtkYXRhOm8scGF0aDp0LnBhdGgsZXJyb3JNYXBzOlt0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsdC5zY2hlbWFFcnJvck1hcCxQZSgpLGllXS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6ZC5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjpjfX0pfWZ1bmN0aW9uIHMobyxjKXtyZXR1cm4gVmUoe2RhdGE6byxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLFBlKCksaWVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpkLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmN9fSl9Y29uc3QgYT17ZXJyb3JNYXA6dC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxpPXQuZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIGxlKXtjb25zdCBvPXRoaXM7cmV0dXJuIE8oYXN5bmMgZnVuY3Rpb24oLi4uYyl7Y29uc3QgdT1uZXcgQShbXSksbD1hd2FpdCBvLl9kZWYuYXJncy5wYXJzZUFzeW5jKGMsYSkuY2F0Y2goTT0+e3Rocm93IHUuYWRkSXNzdWUobihjLE0pKSx1fSksaz1hd2FpdCBSZWZsZWN0LmFwcGx5KGksdGhpcyxsKTtyZXR1cm4gYXdhaXQgby5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoayxhKS5jYXRjaChNPT57dGhyb3cgdS5hZGRJc3N1ZShzKGssTSkpLHV9KX0pfWVsc2V7Y29uc3Qgbz10aGlzO3JldHVybiBPKGZ1bmN0aW9uKC4uLmMpe2NvbnN0IHU9by5fZGVmLmFyZ3Muc2FmZVBhcnNlKGMsYSk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgQShbbihjLHUuZXJyb3IpXSk7Y29uc3QgbD1SZWZsZWN0LmFwcGx5KGksdGhpcyx1LmRhdGEpLGs9by5fZGVmLnJldHVybnMuc2FmZVBhcnNlKGwsYSk7aWYoIWsuc3VjY2Vzcyl0aHJvdyBuZXcgQShbcyhsLGsuZXJyb3IpXSk7cmV0dXJuIGsuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYsYXJnczpXLmNyZWF0ZShlKS5yZXN0KFEuY3JlYXRlKCkpfSl9cmV0dXJucyhlKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYscmV0dXJuczplfSl9aW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0cmljdEltcGxlbWVudChlKXtyZXR1cm4gdGhpcy5wYXJzZShlKX1zdGF0aWMgY3JlYXRlKGUsdCxuKXtyZXR1cm4gbmV3IGRlKHthcmdzOmV8fFcuY3JlYXRlKFtdKS5yZXN0KFEuY3JlYXRlKCkpLHJldHVybnM6dHx8US5jcmVhdGUoKSx0eXBlTmFtZTp5LlpvZEZ1bmN0aW9uLC4uLnYobil9KX19Y2xhc3MgTmUgZXh0ZW5kcyBfe2dldCBzY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCkuX3BhcnNlKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfX1OZS5jcmVhdGU9KHIsZSk9Pm5ldyBOZSh7Z2V0dGVyOnIsdHlwZU5hbWU6eS5ab2RMYXp5LC4uLnYoZSl9KTtjbGFzcyBBZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKGUuZGF0YSE9PXRoaXMuX2RlZi52YWx1ZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtyZWNlaXZlZDp0LmRhdGEsY29kZTpkLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSxnfXJldHVybntzdGF0dXM6InZhbGlkIix2YWx1ZTplLmRhdGF9fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWV9fUFlLmNyZWF0ZT0ocixlKT0+bmV3IEFlKHt2YWx1ZTpyLHR5cGVOYW1lOnkuWm9kTGl0ZXJhbCwuLi52KGUpfSk7ZnVuY3Rpb24gVHQocixlKXtyZXR1cm4gbmV3IEcoe3ZhbHVlczpyLHR5cGVOYW1lOnkuWm9kRW51bSwuLi52KGUpfSl9Y2xhc3MgRyBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGJlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2lmKHR5cGVvZiBlLmRhdGEhPSJzdHJpbmciKXtjb25zdCB0PXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLG49dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gaCh0LHtleHBlY3RlZDp4LmpvaW5WYWx1ZXMobikscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlLGNvZGU6ZC5pbnZhbGlkX3R5cGV9KSxnfWlmKExlKHRoaXMsYmUpfHx4dCh0aGlzLGJlLG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcykpLCFMZSh0aGlzLGJlKS5oYXMoZS5kYXRhKSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKSxuPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIGgodCx7cmVjZWl2ZWQ6dC5kYXRhLGNvZGU6ZC5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpufSksZ31yZXR1cm4gTyhlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYudmFsdWVzKWVbdF09dDtyZXR1cm4gZX1leHRyYWN0KGUsdD10aGlzLl9kZWYpe3JldHVybiBHLmNyZWF0ZShlLHsuLi50aGlzLl9kZWYsLi4udH0pfWV4Y2x1ZGUoZSx0PXRoaXMuX2RlZil7cmV0dXJuIEcuY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpLHsuLi50aGlzLl9kZWYsLi4udH0pfX1iZT1uZXcgV2Vha01hcCxHLmNyZWF0ZT1UdDtjbGFzcyBFZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHdlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2NvbnN0IHQ9eC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyksbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtpZihuLnBhcnNlZFR5cGUhPT1mLnN0cmluZyYmbi5wYXJzZWRUeXBlIT09Zi5udW1iZXIpe2NvbnN0IHM9eC5vYmplY3RWYWx1ZXModCk7cmV0dXJuIGgobix7ZXhwZWN0ZWQ6eC5qb2luVmFsdWVzKHMpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOmQuaW52YWxpZF90eXBlfSksZ31pZihMZSh0aGlzLHdlKXx8eHQodGhpcyx3ZSxuZXcgU2V0KHguZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksIUxlKHRoaXMsd2UpLmhhcyhlLmRhdGEpKXtjb25zdCBzPXgub2JqZWN0VmFsdWVzKHQpO3JldHVybiBoKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOmQuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6c30pLGd9cmV0dXJuIE8oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13ZT1uZXcgV2Vha01hcCxFZS5jcmVhdGU9KHIsZSk9Pm5ldyBFZSh7dmFsdWVzOnIsdHlwZU5hbWU6eS5ab2ROYXRpdmVFbnVtLC4uLnYoZSl9KTtjbGFzcyBsZSBleHRlbmRzIF97dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYucHJvbWlzZSYmdC5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYucHJvbWlzZSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2NvbnN0IG49dC5wYXJzZWRUeXBlPT09Zi5wcm9taXNlP3QuZGF0YTpQcm9taXNlLnJlc29sdmUodC5kYXRhKTtyZXR1cm4gTyhuLnRoZW4ocz0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhzLHtwYXRoOnQucGF0aCxlcnJvck1hcDp0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1sZS5jcmVhdGU9KHIsZSk9Pm5ldyBsZSh7dHlwZTpyLHR5cGVOYW1lOnkuWm9kUHJvbWlzZSwuLi52KGUpfSk7Y2xhc3MgQyBleHRlbmRzIF97aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT15LlpvZEVmZmVjdHM/dGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKCk6dGhpcy5fZGVmLnNjaGVtYX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOnQsY3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZi5lZmZlY3R8fG51bGwsYT17YWRkSXNzdWU6aT0+e2gobixpKSxpLmZhdGFsP3QuYWJvcnQoKTp0LmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIG4ucGF0aH19O2lmKGEuYWRkSXNzdWU9YS5hZGRJc3N1ZS5iaW5kKGEpLHMudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgaT1zLnRyYW5zZm9ybShuLmRhdGEsYSk7aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKS50aGVuKGFzeW5jIG89PntpZih0LnZhbHVlPT09ImFib3J0ZWQiKXJldHVybiBnO2NvbnN0IGM9YXdhaXQgdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpvLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGMuc3RhdHVzPT09ImFib3J0ZWQiP2c6Yy5zdGF0dXM9PT0iZGlydHkifHx0LnZhbHVlPT09ImRpcnR5Ij9vZShjLnZhbHVlKTpjfSk7e2lmKHQudmFsdWU9PT0iYWJvcnRlZCIpcmV0dXJuIGc7Y29uc3Qgbz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6aSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nOm8uc3RhdHVzPT09ImRpcnR5Inx8dC52YWx1ZT09PSJkaXJ0eSI/b2Uoby52YWx1ZSk6b319aWYocy50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBpPW89Pntjb25zdCBjPXMucmVmaW5lbWVudChvLGEpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBvfTtpZihuLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBvPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gby5zdGF0dXM9PT0iYWJvcnRlZCI/Zzooby5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksaShvLnZhbHVlKSx7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pfWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSkudGhlbihvPT5vLnN0YXR1cz09PSJhYm9ydGVkIj9nOihvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxpKG8udmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pKSkpfWlmKHMudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKG4uY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGk9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO2lmKCF4ZShpKSlyZXR1cm4gaTtjb25zdCBvPXMudHJhbnNmb3JtKGkudmFsdWUsYSk7aWYobyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLnRoZW4oaT0+eGUoaSk/UHJvbWlzZS5yZXNvbHZlKHMudHJhbnNmb3JtKGkudmFsdWUsYSkpLnRoZW4obz0+KHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfSkpOmkpO3guYXNzZXJ0TmV2ZXIocyl9fUMuY3JlYXRlPShyLGUsdCk9Pm5ldyBDKHtzY2hlbWE6cix0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4udih0KX0pLEMuY3JlYXRlV2l0aFByZXByb2Nlc3M9KHIsZSx0KT0+bmV3IEMoe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnJ9LHR5cGVOYW1lOnkuWm9kRWZmZWN0cywuLi52KHQpfSk7Y2xhc3MgUCBleHRlbmRzIF97X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09Zi51bmRlZmluZWQ/Tyh2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1QLmNyZWF0ZT0ocixlKT0+bmV3IFAoe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kT3B0aW9uYWwsLi4udihlKX0pO2NsYXNzIEogZXh0ZW5kcyBfe19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PWYubnVsbD9PKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1KLmNyZWF0ZT0ocixlKT0+bmV3IEooe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kTnVsbGFibGUsLi4udihlKX0pO2NsYXNzIFJlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtsZXQgbj10LmRhdGE7cmV0dXJuIHQucGFyc2VkVHlwZT09PWYudW5kZWZpbmVkJiYobj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOm4scGF0aDp0LnBhdGgscGFyZW50OnR9KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fVJlLmNyZWF0ZT0ocixlKT0+bmV3IFJlKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4udihlKX0pO2NsYXNzIENlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxuPXsuLi50LGNvbW1vbjp7Li4udC5jb21tb24saXNzdWVzOltdfX0scz10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnsuLi5ufX0pO3JldHVybiBrZShzKT9zLnRoZW4oYT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTphLnN0YXR1cz09PSJ2YWxpZCI/YS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTpzLnN0YXR1cz09PSJ2YWxpZCI/cy52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfX1yZW1vdmVDYXRjaCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1DZS5jcmVhdGU9KHIsZSk9Pm5ldyBDZSh7aW5uZXJUeXBlOnIsdHlwZU5hbWU6eS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiBlLmNhdGNoPT0iZnVuY3Rpb24iP2UuY2F0Y2g6KCk9PmUuY2F0Y2gsLi4udihlKX0pO2NsYXNzIEhlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYubmFuKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5uYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19SGUuY3JlYXRlPXI9Pm5ldyBIZSh7dHlwZU5hbWU6eS5ab2ROYU4sLi4udihyKX0pO2NvbnN0IFNyPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3Mgb3QgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLG49dC5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6bixwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgWmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybihhc3luYygpPT57Y29uc3QgYT1hd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGEuc3RhdHVzPT09ImFib3J0ZWQiP2c6YS5zdGF0dXM9PT0iZGlydHkiPyh0LmRpcnR5KCksb2UoYS52YWx1ZSkpOnRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe2RhdGE6YS52YWx1ZSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfSkoKTt7Y29uc3Qgcz10aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/ZzpzLnN0YXR1cz09PSJkaXJ0eSI/KHQuZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6cy52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTpzLnZhbHVlLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXN0YXRpYyBjcmVhdGUoZSx0KXtyZXR1cm4gbmV3IFplKHtpbjplLG91dDp0LHR5cGVOYW1lOnkuWm9kUGlwZWxpbmV9KX19Y2xhc3MgSWUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdCB0PXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLG49cz0+KHhlKHMpJiYocy52YWx1ZT1PYmplY3QuZnJlZXplKHMudmFsdWUpKSxzKTtyZXR1cm4ga2UodCk/dC50aGVuKHM9Pm4ocykpOm4odCl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUllLmNyZWF0ZT0ocixlKT0+bmV3IEllKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZFJlYWRvbmx5LC4uLnYoZSl9KTtmdW5jdGlvbiAkdChyLGU9e30sdCl7cmV0dXJuIHI/Y2UuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKG4scyk9Pnt2YXIgYSxpO2lmKCFyKG4pKXtjb25zdCBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmUsYz0oaT0oYT1vLmZhdGFsKSE9PW51bGwmJmEhPT12b2lkIDA/YTp0KSE9PW51bGwmJmkhPT12b2lkIDA/aTohMCx1PXR5cGVvZiBvPT0ic3RyaW5nIj97bWVzc2FnZTpvfTpvO3MuYWRkSXNzdWUoe2NvZGU6ImN1c3RvbSIsLi4udSxmYXRhbDpjfSl9fSk6Y2UuY3JlYXRlKCl9Y29uc3QgVHI9e29iamVjdDpULmxhenljcmVhdGV9O3ZhciB5OyhmdW5jdGlvbihyKXtyLlpvZFN0cmluZz0iWm9kU3RyaW5nIixyLlpvZE51bWJlcj0iWm9kTnVtYmVyIixyLlpvZE5hTj0iWm9kTmFOIixyLlpvZEJpZ0ludD0iWm9kQmlnSW50IixyLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHIuWm9kRGF0ZT0iWm9kRGF0ZSIsci5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsci5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsci5ab2ROdWxsPSJab2ROdWxsIixyLlpvZEFueT0iWm9kQW55IixyLlpvZFVua25vd249IlpvZFVua25vd24iLHIuWm9kTmV2ZXI9IlpvZE5ldmVyIixyLlpvZFZvaWQ9IlpvZFZvaWQiLHIuWm9kQXJyYXk9IlpvZEFycmF5IixyLlpvZE9iamVjdD0iWm9kT2JqZWN0IixyLlpvZFVuaW9uPSJab2RVbmlvbiIsci5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsci5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsci5ab2RUdXBsZT0iWm9kVHVwbGUiLHIuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHIuWm9kTWFwPSJab2RNYXAiLHIuWm9kU2V0PSJab2RTZXQiLHIuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixyLlpvZExhenk9IlpvZExhenkiLHIuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsci5ab2RFbnVtPSJab2RFbnVtIixyLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHIuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsci5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHIuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixyLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHIuWm9kQ2F0Y2g9IlpvZENhdGNoIixyLlpvZFByb21pc2U9IlpvZFByb21pc2UiLHIuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsci5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHIuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKHl8fCh5PXt9KSk7Y29uc3QgJHI9KHIsZT17bWVzc2FnZTpgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7ci5uYW1lfWB9KT0+JHQodD0+dCBpbnN0YW5jZW9mIHIsZSksTXQ9RS5jcmVhdGUsRHQ9SC5jcmVhdGUsTXI9SGUuY3JlYXRlLERyPXEuY3JlYXRlLE90PVNlLmNyZWF0ZSxPcj1LLmNyZWF0ZSxOcj16ZS5jcmVhdGUsQXI9VGUuY3JlYXRlLEVyPSRlLmNyZWF0ZSxScj1jZS5jcmVhdGUsQ3I9US5jcmVhdGUsWnI9TC5jcmVhdGUsSXI9VWUuY3JlYXRlLGpyPVIuY3JlYXRlLFlyPVQuY3JlYXRlLFdyPVQuc3RyaWN0Q3JlYXRlLFByPU1lLmNyZWF0ZSxWcj1GZS5jcmVhdGUsTHI9RGUuY3JlYXRlLHpyPVcuY3JlYXRlLFVyPU9lLmNyZWF0ZSxGcj1CZS5jcmVhdGUsQnI9WC5jcmVhdGUsSHI9ZGUuY3JlYXRlLHFyPU5lLmNyZWF0ZSxHcj1BZS5jcmVhdGUsSnI9Ry5jcmVhdGUsS3I9RWUuY3JlYXRlLFFyPWxlLmNyZWF0ZSxOdD1DLmNyZWF0ZSxYcj1QLmNyZWF0ZSxlbj1KLmNyZWF0ZSx0bj1DLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLHJuPVplLmNyZWF0ZTt2YXIgbT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6aWUsc2V0RXJyb3JNYXA6b3IsZ2V0RXJyb3JNYXA6UGUsbWFrZUlzc3VlOlZlLEVNUFRZX1BBVEg6Y3IsYWRkSXNzdWVUb0NvbnRleHQ6aCxQYXJzZVN0YXR1czpELElOVkFMSUQ6ZyxESVJUWTpvZSxPSzpPLGlzQWJvcnRlZDpudCxpc0RpcnR5OnN0LGlzVmFsaWQ6eGUsaXNBc3luYzprZSxnZXQgdXRpbCgpe3JldHVybiB4fSxnZXQgb2JqZWN0VXRpbCgpe3JldHVybiBydH0sWm9kUGFyc2VkVHlwZTpmLGdldFBhcnNlZFR5cGU6Qixab2RUeXBlOl8sZGF0ZXRpbWVSZWdleDpTdCxab2RTdHJpbmc6RSxab2ROdW1iZXI6SCxab2RCaWdJbnQ6cSxab2RCb29sZWFuOlNlLFpvZERhdGU6Syxab2RTeW1ib2w6emUsWm9kVW5kZWZpbmVkOlRlLFpvZE51bGw6JGUsWm9kQW55OmNlLFpvZFVua25vd246USxab2ROZXZlcjpMLFpvZFZvaWQ6VWUsWm9kQXJyYXk6Uixab2RPYmplY3Q6VCxab2RVbmlvbjpNZSxab2REaXNjcmltaW5hdGVkVW5pb246RmUsWm9kSW50ZXJzZWN0aW9uOkRlLFpvZFR1cGxlOlcsWm9kUmVjb3JkOk9lLFpvZE1hcDpCZSxab2RTZXQ6WCxab2RGdW5jdGlvbjpkZSxab2RMYXp5Ok5lLFpvZExpdGVyYWw6QWUsWm9kRW51bTpHLFpvZE5hdGl2ZUVudW06RWUsWm9kUHJvbWlzZTpsZSxab2RFZmZlY3RzOkMsWm9kVHJhbnNmb3JtZXI6Qyxab2RPcHRpb25hbDpQLFpvZE51bGxhYmxlOkosWm9kRGVmYXVsdDpSZSxab2RDYXRjaDpDZSxab2ROYU46SGUsQlJBTkQ6U3IsWm9kQnJhbmRlZDpvdCxab2RQaXBlbGluZTpaZSxab2RSZWFkb25seTpJZSxjdXN0b206JHQsU2NoZW1hOl8sWm9kU2NoZW1hOl8sbGF0ZTpUcixnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIHl9LGNvZXJjZTp7c3RyaW5nOnI9PkUuY3JlYXRlKHsuLi5yLGNvZXJjZTohMH0pLG51bWJlcjpyPT5ILmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxib29sZWFuOnI9PlNlLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxiaWdpbnQ6cj0+cS5jcmVhdGUoey4uLnIsY29lcmNlOiEwfSksZGF0ZTpyPT5LLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KX0sYW55OlJyLGFycmF5OmpyLGJpZ2ludDpEcixib29sZWFuOk90LGRhdGU6T3IsZGlzY3JpbWluYXRlZFVuaW9uOlZyLGVmZmVjdDpOdCxlbnVtOkpyLGZ1bmN0aW9uOkhyLGluc3RhbmNlb2Y6JHIsaW50ZXJzZWN0aW9uOkxyLGxhenk6cXIsbGl0ZXJhbDpHcixtYXA6RnIsbmFuOk1yLG5hdGl2ZUVudW06S3IsbmV2ZXI6WnIsbnVsbDpFcixudWxsYWJsZTplbixudW1iZXI6RHQsb2JqZWN0OllyLG9ib29sZWFuOigpPT5PdCgpLm9wdGlvbmFsKCksb251bWJlcjooKT0+RHQoKS5vcHRpb25hbCgpLG9wdGlvbmFsOlhyLG9zdHJpbmc6KCk9Pk10KCkub3B0aW9uYWwoKSxwaXBlbGluZTpybixwcmVwcm9jZXNzOnRuLHByb21pc2U6UXIscmVjb3JkOlVyLHNldDpCcixzdHJpY3RPYmplY3Q6V3Isc3RyaW5nOk10LHN5bWJvbDpOcix0cmFuc2Zvcm1lcjpOdCx0dXBsZTp6cix1bmRlZmluZWQ6QXIsdW5pb246UHIsdW5rbm93bjpDcix2b2lkOklyLE5FVkVSOmcsWm9kSXNzdWVDb2RlOmQscXVvdGVsZXNzSnNvbjppcixab2RFcnJvcjpBfSk7bS5vYmplY3Qoe251Y2xlb3RpZGVTZXF1ZW5jZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSksZ2VuZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSl9KTtjb25zdCBubj1tLmVudW0oWyJhc2NlbmRpbmciLCJkZXNjZW5kaW5nIl0pLHNuPW0ub2JqZWN0KHtmaWVsZDptLnN0cmluZygpLHR5cGU6bm59KTttLm9iamVjdCh7bGltaXQ6bS5udW1iZXIoKS5vcHRpb25hbCgpLG9mZnNldDptLm51bWJlcigpLm9wdGlvbmFsKCksZmllbGRzOm0uYXJyYXkobS5zdHJpbmcoKSkub3B0aW9uYWwoKSxvcmRlckJ5Om0uYXJyYXkoc24pLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChtLnVuaW9uKFttLmJvb2xlYW4oKSxtLnVuZGVmaW5lZCgpLG0uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKSxtLmFycmF5KG0uc3RyaW5nKCkpXSkpLmV4dGVuZCh7bWluUHJvcG9ydGlvbjptLm51bWJlcigpLm9wdGlvbmFsKCl9KTtjb25zdCBhbj1tLm9iamVjdCh7bXV0YXRpb246bS5zdHJpbmcoKSxwcm9wb3J0aW9uOm0ubnVtYmVyKCksY291bnQ6bS5udW1iZXIoKSxzZXF1ZW5jZU5hbWU6bS51bmlvbihbbS5zdHJpbmcoKSxtLm51bGwoKV0pLG11dGF0aW9uRnJvbTptLnN0cmluZygpLG11dGF0aW9uVG86bS5zdHJpbmcoKSxwb3NpdGlvbjptLm51bWJlcigpfSksb249Y3QobS5hcnJheShhbikpLGNuPW0ub2JqZWN0KHtpbnNlcnRpb246bS5zdHJpbmcoKSxjb3VudDptLm51bWJlcigpLGluc2VydGVkU3ltYm9sczptLnN0cmluZygpLHBvc2l0aW9uOm0ubnVtYmVyKCksc2VxdWVuY2VOYW1lOm0udW5pb24oW20uc3RyaW5nKCksbS5udWxsKCldKX0pO2N0KG0uYXJyYXkoY24pKTtjb25zdCB1bj1tLm9iamVjdCh7Y291bnQ6bS5udW1iZXIoKX0pLmNhdGNoYWxsKG0udW5pb24oW20uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKV0pKSxkbj1jdChtLmFycmF5KHVuKSk7ZnVuY3Rpb24gY3Qocil7cmV0dXJuIG0ub2JqZWN0KHtkYXRhOnJ9KX1jb25zdCBBdD1tLm9iamVjdCh7dGl0bGU6bS5zdHJpbmcoKS5vcHRpb25hbCgpLHN0YXR1czptLm51bWJlcigpLGRldGFpbDptLnN0cmluZygpLm9wdGlvbmFsKCksdHlwZTptLnN0cmluZygpLGluc3RhbmNlOm0uc3RyaW5nKCkub3B0aW9uYWwoKX0pLGxuPW0ub2JqZWN0KHtlcnJvcjpBdH0pO2NsYXNzIHV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUpLHRoaXMuc3RhdHVzPXQsdGhpcy5yZXF1ZXN0ZWREYXRhPW4sdGhpcy5uYW1lPSJVbmtub3duTGFwaXNFcnJvciJ9fWNsYXNzIEV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4scyl7c3VwZXIoZSksdGhpcy5zdGF0dXM9dCx0aGlzLnByb2JsZW1EZXRhaWw9bix0aGlzLnJlcXVlc3RlZERhdGE9cyx0aGlzLm5hbWU9IkxhcGlzRXJyb3IifX1hc3luYyBmdW5jdGlvbiBobihyLGUsdCl7Y29uc3Qgbj1hd2FpdCBSdChwbihyKSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOnR9LCJhZ2dyZWdhdGVkIGRhdGEiKTtyZXR1cm4gZG4ucGFyc2UoYXdhaXQgbi5qc29uKCkpfWFzeW5jIGZ1bmN0aW9uIGZuKHIsZSx0LG4pe2NvbnN0IHM9YXdhaXQgUnQoeW4ocix0KSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOm59LGAke3R9IG11dGF0aW9uc2ApO3JldHVybiBvbi5wYXJzZShhd2FpdCBzLmpzb24oKSl9YXN5bmMgZnVuY3Rpb24gUnQocixlLHQpe3RyeXtjb25zdCBuPWF3YWl0IGZldGNoKHIsZSk7cmV0dXJuIGF3YWl0IG1uKG4sdCksbn1jYXRjaChuKXtjb25zdCBzPW4gaW5zdGFuY2VvZiBFcnJvcj9uLm1lc3NhZ2U6YCR7bn1gO3Rocm93IG5ldyB1dChgRmFpbGVkIHRvIGNvbm5lY3QgdG8gTEFQSVM6ICR7c31gLDUwMCx0KX19Y29uc3QgbW49YXN5bmMocixlKT0+e2lmKCFyLm9rKXtpZihyLnN0YXR1cz49NDAwJiZyLnN0YXR1czw1MDApe2NvbnN0IHQ9YXdhaXQgci5qc29uKCksbj1sbi5zYWZlUGFyc2UodCk7aWYobi5zdWNjZXNzKXRocm93IG5ldyBFdChyLnN0YXR1c1RleHQrbi5kYXRhLmVycm9yLmRldGFpbCxyLnN0YXR1cyxuLmRhdGEuZXJyb3IsZSk7Y29uc3Qgcz1BdC5zYWZlUGFyc2UodCk7dGhyb3cgcy5zdWNjZXNzP25ldyBFdChyLnN0YXR1c1RleHQrcy5kYXRhLmRldGFpbCxyLnN0YXR1cyxzLmRhdGEsZSk6bmV3IHV0KGAke3Iuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkodCl9YCxyLnN0YXR1cyxlKX10aHJvdyBuZXcgdXQoYCR7ci5zdGF0dXNUZXh0fTogJHtyLnN0YXR1c31gLHIuc3RhdHVzLGUpfX0scG49cj0+YCR7cn0vc2FtcGxlL2FnZ3JlZ2F0ZWRgLHluPShyLGUpPT5lPT09ImFtaW5vIGFjaWQiP2Ake3J9L3NhbXBsZS9hbWlub0FjaWRNdXRhdGlvbnNgOmAke3J9L3NhbXBsZS9udWNsZW90aWRlTXV0YXRpb25zYDtjbGFzcyBDdHtjb25zdHJ1Y3RvcihlLHQ9W10pe3RoaXMuZmlsdGVyPWUsdGhpcy5maWVsZHM9dH1hc3luYyBldmFsdWF0ZShlLHQpe2NvbnN0IG49KGF3YWl0IGhuKGUsey4uLnRoaXMuZmlsdGVyLGZpZWxkczp0aGlzLmZpZWxkc30sdCkpLmRhdGE7aWYoZ24obikpcmV0dXJue2NvbnRlbnQ6bn07dGhyb3cgbmV3IEVycm9yKCJBZ2dyZWdhdGVkIHJlc3BvbnNlIGRvZXMgbm90IGhhdmUgY291bnQiKX19ZnVuY3Rpb24gZ24ocil7cmV0dXJuIHIuZXZlcnkoZT0+dHlwZW9mIGU9PSJvYmplY3QiJiYiY291bnQiaW4gZSYmdHlwZW9mIGUuY291bnQ9PSJudW1iZXIiKX1jbGFzcyB2bntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5jaGlsZD1lLHRoaXMuZmllbGQ9dCx0aGlzLmFnZ3JlZ2F0ZT1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkscz1uZXcgTWFwO2Zvcihjb25zdCBpIG9mIG4uY29udGVudCl7Y29uc3Qgbz1pW3RoaXMuZmllbGRdO3MuaGFzKG8pfHxzLnNldChvLFtdKSxzLmdldChvKS5wdXNoKGkpfWNvbnN0IGE9bmV3IEFycmF5O2Zvcihjb25zdFssaV1vZiBzKWEucHVzaCh0aGlzLmFnZ3JlZ2F0ZShpKSk7cmV0dXJue2NvbnRlbnQ6YX19fWNsYXNzIF9uIGV4dGVuZHMgdm57Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsdCxzPT57bGV0IGE9MDtmb3IoY29uc3QgaSBvZiBzKWErPWlbbl07cmV0dXJue1t0XTpzWzBdW3RdLFtuXTphfX0pfX1jbGFzcyBkdHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY2hpbGQ9ZSx0aGlzLmZ1bmM9dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQubWFwKHRoaXMuZnVuYyl9fX1jbGFzcyB4biBleHRlbmRzIGR0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHM9Pih7Li4ucyxbbl06c1t0XX0pKX19Y2xhc3Mga257Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoaWxkPWUsdGhpcy5jb21wYXJlRm49dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbil9fX12YXIgWnQ9NjAsSXQ9WnQqNjAsanQ9SXQqMjQsYm49anQqNyxoZT0xZTMsbHQ9WnQqaGUsWXQ9SXQqaGUsd249anQqaGUsU249Ym4qaGUsaHQ9Im1pbGxpc2Vjb25kIixmZT0ic2Vjb25kIixtZT0ibWludXRlIixwZT0iaG91ciIsWj0iZGF5IixqZT0id2VlayIsST0ibW9udGgiLFd0PSJxdWFydGVyIixVPSJ5ZWFyIix5ZT0iZGF0ZSIsUHQ9IllZWVktTU0tRERUSEg6bW06c3NaIixWdD0iSW52YWxpZCBEYXRlIixUbj0vXihcZHs0fSlbLS9dPyhcZHsxLDJ9KT9bLS9dPyhcZHswLDJ9KVtUdFxzXSooXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Wy46XT8oXGQrKT8kLywkbj0vXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE1uPXtuYW1lOiJlbiIsd2Vla2RheXM6IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLG1vbnRoczoiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSxvcmRpbmFsOmZ1bmN0aW9uKGUpe3ZhciB0PVsidGgiLCJzdCIsIm5kIiwicmQiXSxuPWUlMTAwO3JldHVybiJbIitlKyh0WyhuLTIwKSUxMF18fHRbbl18fHRbMF0pKyJdIn19LGZ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1TdHJpbmcoZSk7cmV0dXJuIXN8fHMubGVuZ3RoPj10P2U6IiIrQXJyYXkodCsxLXMubGVuZ3RoKS5qb2luKG4pK2V9LERuPWZ1bmN0aW9uKGUpe3ZhciB0PS1lLnV0Y09mZnNldCgpLG49TWF0aC5hYnModCkscz1NYXRoLmZsb29yKG4vNjApLGE9biU2MDtyZXR1cm4odDw9MD8iKyI6Ii0iKStmdChzLDIsIjAiKSsiOiIrZnQoYSwyLCIwIil9LE9uPWZ1bmN0aW9uIHIoZSx0KXtpZihlLmRhdGUoKTx0LmRhdGUoKSlyZXR1cm4tcih0LGUpO3ZhciBuPSh0LnllYXIoKS1lLnllYXIoKSkqMTIrKHQubW9udGgoKS1lLm1vbnRoKCkpLHM9ZS5jbG9uZSgpLmFkZChuLEkpLGE9dC1zPDAsaT1lLmNsb25lKCkuYWRkKG4rKGE/LTE6MSksSSk7cmV0dXJuKygtKG4rKHQtcykvKGE/cy1pOmktcykpfHwwKX0sTm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD9NYXRoLmNlaWwoZSl8fDA6TWF0aC5mbG9vcihlKX0sQW49ZnVuY3Rpb24oZSl7dmFyIHQ9e006SSx5OlUsdzpqZSxkOlosRDp5ZSxoOnBlLG06bWUsczpmZSxtczpodCxROld0fTtyZXR1cm4gdFtlXXx8U3RyaW5nKGV8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywiIil9LEVuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwfSxSbj17czpmdCx6OkRuLG06T24sYTpObixwOkFuLHU6RW59LFllPSJlbiIsZWU9e307ZWVbWWVdPU1uO3ZhciBMdD0iJGlzRGF5anNPYmplY3QiLG10PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2V8fCEhKGUmJmVbTHRdKX0scWU9ZnVuY3Rpb24gcihlLHQsbil7dmFyIHM7aWYoIWUpcmV0dXJuIFllO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIGE9ZS50b0xvd2VyQ2FzZSgpO2VlW2FdJiYocz1hKSx0JiYoZWVbYV09dCxzPWEpO3ZhciBpPWUuc3BsaXQoIi0iKTtpZighcyYmaS5sZW5ndGg+MSlyZXR1cm4gcihpWzBdKX1lbHNle3ZhciBvPWUubmFtZTtlZVtvXT1lLHM9b31yZXR1cm4hbiYmcyYmKFllPXMpLHN8fCFuJiZZZX0sdz1mdW5jdGlvbihlLHQpe2lmKG10KGUpKXJldHVybiBlLmNsb25lKCk7dmFyIG49dHlwZW9mIHQ9PSJvYmplY3QiP3Q6e307cmV0dXJuIG4uZGF0ZT1lLG4uYXJncz1hcmd1bWVudHMsbmV3IEdlKG4pfSxDbj1mdW5jdGlvbihlLHQpe3JldHVybiB3KGUse2xvY2FsZTp0LiRMLHV0Yzp0LiR1LHg6dC4keCwkb2Zmc2V0OnQuJG9mZnNldH0pfSxiPVJuO2IubD1xZSxiLmk9bXQsYi53PUNuO3ZhciBabj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGUsbj1lLnV0YztpZih0PT09bnVsbClyZXR1cm4gbmV3IERhdGUoTmFOKTtpZihiLnUodCkpcmV0dXJuIG5ldyBEYXRlO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0eXBlb2YgdD09InN0cmluZyImJiEvWiQvaS50ZXN0KHQpKXt2YXIgcz10Lm1hdGNoKFRuKTtpZihzKXt2YXIgYT1zWzJdLTF8fDAsaT0oc1s3XXx8IjAiKS5zdWJzdHJpbmcoMCwzKTtyZXR1cm4gbj9uZXcgRGF0ZShEYXRlLlVUQyhzWzFdLGEsc1szXXx8MSxzWzRdfHwwLHNbNV18fDAsc1s2XXx8MCxpKSk6bmV3IERhdGUoc1sxXSxhLHNbM118fDEsc1s0XXx8MCxzWzVdfHwwLHNbNl18fDAsaSl9fXJldHVybiBuZXcgRGF0ZSh0KX0sR2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQpe3RoaXMuJEw9cWUodC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KSx0aGlzLiR4PXRoaXMuJHh8fHQueHx8e30sdGhpc1tMdF09ITB9dmFyIGU9ci5wcm90b3R5cGU7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dGhpcy4kZD1abihuKSx0aGlzLmluaXQoKX0sZS5pbml0PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy4kZDt0aGlzLiR5PW4uZ2V0RnVsbFllYXIoKSx0aGlzLiRNPW4uZ2V0TW9udGgoKSx0aGlzLiREPW4uZ2V0RGF0ZSgpLHRoaXMuJFc9bi5nZXREYXkoKSx0aGlzLiRIPW4uZ2V0SG91cnMoKSx0aGlzLiRtPW4uZ2V0TWludXRlcygpLHRoaXMuJHM9bi5nZXRTZWNvbmRzKCksdGhpcy4kbXM9bi5nZXRNaWxsaXNlY29uZHMoKX0sZS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9TdHJpbmcoKSE9PVZ0fSxlLmlzU2FtZT1mdW5jdGlvbihuLHMpe3ZhciBhPXcobik7cmV0dXJuIHRoaXMuc3RhcnRPZihzKTw9YSYmYTw9dGhpcy5lbmRPZihzKX0sZS5pc0FmdGVyPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHcobik8dGhpcy5zdGFydE9mKHMpfSxlLmlzQmVmb3JlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5kT2Yocyk8dyhuKX0sZS4kZz1mdW5jdGlvbihuLHMsYSl7cmV0dXJuIGIudShuKT90aGlzW3NdOnRoaXMuc2V0KGEsbil9LGUudW5peD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9LGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLmdldFRpbWUoKX0sZS5zdGFydE9mPWZ1bmN0aW9uKG4scyl7dmFyIGE9dGhpcyxpPWIudShzKT8hMDpzLG89Yi5wKG4pLGM9ZnVuY3Rpb24odmUsail7dmFyIE49Yi53KGEuJHU/RGF0ZS5VVEMoYS4keSxqLHZlKTpuZXcgRGF0ZShhLiR5LGosdmUpLGEpO3JldHVybiBpP046Ti5lbmRPZihaKX0sdT1mdW5jdGlvbih2ZSxqKXt2YXIgTj1bMCwwLDAsMF0sX2U9WzIzLDU5LDU5LDk5OV07cmV0dXJuIGIudyhhLnRvRGF0ZSgpW3ZlXS5hcHBseShhLnRvRGF0ZSgicyIpLChpP046X2UpLnNsaWNlKGopKSxhKX0sbD10aGlzLiRXLGs9dGhpcy4kTSxTPXRoaXMuJEQsTT0ic2V0IisodGhpcy4kdT8iVVRDIjoiIik7c3dpdGNoKG8pe2Nhc2UgVTpyZXR1cm4gaT9jKDEsMCk6YygzMSwxMSk7Y2FzZSBJOnJldHVybiBpP2MoMSxrKTpjKDAsaysxKTtjYXNlIGplOnt2YXIgRj10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsYWU9KGw8Rj9sKzc6bCktRjtyZXR1cm4gYyhpP1MtYWU6UysoNi1hZSksayl9Y2FzZSBaOmNhc2UgeWU6cmV0dXJuIHUoTSsiSG91cnMiLDApO2Nhc2UgcGU6cmV0dXJuIHUoTSsiTWludXRlcyIsMSk7Y2FzZSBtZTpyZXR1cm4gdShNKyJTZWNvbmRzIiwyKTtjYXNlIGZlOnJldHVybiB1KE0rIk1pbGxpc2Vjb25kcyIsMyk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jbG9uZSgpfX0sZS5lbmRPZj1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5zdGFydE9mKG4sITEpfSxlLiRzZXQ9ZnVuY3Rpb24obixzKXt2YXIgYSxpPWIucChuKSxvPSJzZXQiKyh0aGlzLiR1PyJVVEMiOiIiKSxjPShhPXt9LGFbWl09bysiRGF0ZSIsYVt5ZV09bysiRGF0ZSIsYVtJXT1vKyJNb250aCIsYVtVXT1vKyJGdWxsWWVhciIsYVtwZV09bysiSG91cnMiLGFbbWVdPW8rIk1pbnV0ZXMiLGFbZmVdPW8rIlNlY29uZHMiLGFbaHRdPW8rIk1pbGxpc2Vjb25kcyIsYSlbaV0sdT1pPT09Wj90aGlzLiREKyhzLXRoaXMuJFcpOnM7aWYoaT09PUl8fGk9PT1VKXt2YXIgbD10aGlzLmNsb25lKCkuc2V0KHllLDEpO2wuJGRbY10odSksbC5pbml0KCksdGhpcy4kZD1sLnNldCh5ZSxNYXRoLm1pbih0aGlzLiRELGwuZGF5c0luTW9udGgoKSkpLiRkfWVsc2UgYyYmdGhpcy4kZFtjXSh1KTtyZXR1cm4gdGhpcy5pbml0KCksdGhpc30sZS5zZXQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQobixzKX0sZS5nZXQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXNbYi5wKG4pXSgpfSxlLmFkZD1mdW5jdGlvbihuLHMpe3ZhciBhPXRoaXMsaTtuPU51bWJlcihuKTt2YXIgbz1iLnAocyksYz1mdW5jdGlvbihTKXt2YXIgTT13KGEpO3JldHVybiBiLncoTS5kYXRlKE0uZGF0ZSgpK01hdGgucm91bmQoUypuKSksYSl9O2lmKG89PT1JKXJldHVybiB0aGlzLnNldChJLHRoaXMuJE0rbik7aWYobz09PVUpcmV0dXJuIHRoaXMuc2V0KFUsdGhpcy4keStuKTtpZihvPT09WilyZXR1cm4gYygxKTtpZihvPT09amUpcmV0dXJuIGMoNyk7dmFyIHU9KGk9e30saVttZV09bHQsaVtwZV09WXQsaVtmZV09aGUsaSlbb118fDEsbD10aGlzLiRkLmdldFRpbWUoKStuKnU7cmV0dXJuIGIudyhsLHRoaXMpfSxlLnN1YnRyYWN0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuYWRkKG4qLTEscyl9LGUuZm9ybWF0PWZ1bmN0aW9uKG4pe3ZhciBzPXRoaXMsYT10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIGEuaW52YWxpZERhdGV8fFZ0O3ZhciBpPW58fFB0LG89Yi56KHRoaXMpLGM9dGhpcy4kSCx1PXRoaXMuJG0sbD10aGlzLiRNLGs9YS53ZWVrZGF5cyxTPWEubW9udGhzLE09YS5tZXJpZGllbSxGPWZ1bmN0aW9uKE4sX2UsdHQsZ3Mpe3JldHVybiBOJiYoTltfZV18fE4ocyxpKSl8fHR0W19lXS5zbGljZSgwLGdzKX0sYWU9ZnVuY3Rpb24oTil7cmV0dXJuIGIucyhjJTEyfHwxMixOLCIwIil9LGV0PU18fGZ1bmN0aW9uKGosTixfZSl7dmFyIHR0PWo8MTI/IkFNIjoiUE0iO3JldHVybiBfZT90dC50b0xvd2VyQ2FzZSgpOnR0fSx2ZT1mdW5jdGlvbihOKXtzd2l0Y2goTil7Y2FzZSJZWSI6cmV0dXJuIFN0cmluZyhzLiR5KS5zbGljZSgtMik7Y2FzZSJZWVlZIjpyZXR1cm4gYi5zKHMuJHksNCwiMCIpO2Nhc2UiTSI6cmV0dXJuIGwrMTtjYXNlIk1NIjpyZXR1cm4gYi5zKGwrMSwyLCIwIik7Y2FzZSJNTU0iOnJldHVybiBGKGEubW9udGhzU2hvcnQsbCxTLDMpO2Nhc2UiTU1NTSI6cmV0dXJuIEYoUyxsKTtjYXNlIkQiOnJldHVybiBzLiREO2Nhc2UiREQiOnJldHVybiBiLnMocy4kRCwyLCIwIik7Y2FzZSJkIjpyZXR1cm4gU3RyaW5nKHMuJFcpO2Nhc2UiZGQiOnJldHVybiBGKGEud2Vla2RheXNNaW4scy4kVyxrLDIpO2Nhc2UiZGRkIjpyZXR1cm4gRihhLndlZWtkYXlzU2hvcnQscy4kVyxrLDMpO2Nhc2UiZGRkZCI6cmV0dXJuIGtbcy4kV107Y2FzZSJIIjpyZXR1cm4gU3RyaW5nKGMpO2Nhc2UiSEgiOnJldHVybiBiLnMoYywyLCIwIik7Y2FzZSJoIjpyZXR1cm4gYWUoMSk7Y2FzZSJoaCI6cmV0dXJuIGFlKDIpO2Nhc2UiYSI6cmV0dXJuIGV0KGMsdSwhMCk7Y2FzZSJBIjpyZXR1cm4gZXQoYyx1LCExKTtjYXNlIm0iOnJldHVybiBTdHJpbmcodSk7Y2FzZSJtbSI6cmV0dXJuIGIucyh1LDIsIjAiKTtjYXNlInMiOnJldHVybiBTdHJpbmcocy4kcyk7Y2FzZSJzcyI6cmV0dXJuIGIucyhzLiRzLDIsIjAiKTtjYXNlIlNTUyI6cmV0dXJuIGIucyhzLiRtcywzLCIwIik7Y2FzZSJaIjpyZXR1cm4gb31yZXR1cm4gbnVsbH07cmV0dXJuIGkucmVwbGFjZSgkbixmdW5jdGlvbihqLE4pe3JldHVybiBOfHx2ZShqKXx8by5yZXBsYWNlKCI6IiwiIil9KX0sZS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpKjE1fSxlLmRpZmY9ZnVuY3Rpb24obixzLGEpe3ZhciBpPXRoaXMsbz1iLnAocyksYz13KG4pLHU9KGMudXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqbHQsbD10aGlzLWMsaz1mdW5jdGlvbigpe3JldHVybiBiLm0oaSxjKX0sUztzd2l0Y2gobyl7Y2FzZSBVOlM9aygpLzEyO2JyZWFrO2Nhc2UgSTpTPWsoKTticmVhaztjYXNlIFd0OlM9aygpLzM7YnJlYWs7Y2FzZSBqZTpTPShsLXUpL1NuO2JyZWFrO2Nhc2UgWjpTPShsLXUpL3duO2JyZWFrO2Nhc2UgcGU6Uz1sL1l0O2JyZWFrO2Nhc2UgbWU6Uz1sL2x0O2JyZWFrO2Nhc2UgZmU6Uz1sL2hlO2JyZWFrO2RlZmF1bHQ6Uz1sO2JyZWFrfXJldHVybiBhP1M6Yi5hKFMpfSxlLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoSSkuJER9LGUuJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiBlZVt0aGlzLiRMXX0sZS5sb2NhbGU9ZnVuY3Rpb24obixzKXtpZighbilyZXR1cm4gdGhpcy4kTDt2YXIgYT10aGlzLmNsb25lKCksaT1xZShuLHMsITApO3JldHVybiBpJiYoYS4kTD1pKSxhfSxlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIudyh0aGlzLiRkLHRoaXMpfSxlLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LHJ9KCksenQ9R2UucHJvdG90eXBlO3cucHJvdG90eXBlPXp0LFtbIiRtcyIsaHRdLFsiJHMiLGZlXSxbIiRtIixtZV0sWyIkSCIscGVdLFsiJFciLFpdLFsiJE0iLEldLFsiJHkiLFVdLFsiJEQiLHllXV0uZm9yRWFjaChmdW5jdGlvbihyKXt6dFtyWzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHJbMF0sclsxXSl9fSksdy5leHRlbmQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gci4kaXx8KHIoZSxHZSx3KSxyLiRpPSEwKSx3fSx3LmxvY2FsZT1xZSx3LmlzRGF5anM9bXQsdy51bml4PWZ1bmN0aW9uKHIpe3JldHVybiB3KHIqMWUzKX0sdy5lbj1lZVtZZV0sdy5Mcz1lZSx3LnA9e307dmFyIEluPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9ZS5wcm90b3R5cGUsbj10LmZvcm1hdDt0LmZvcm1hdD1mdW5jdGlvbihzKXt2YXIgYT10aGlzLGk9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykocyk7dmFyIG89dGhpcy4kdXRpbHMoKSxjPXN8fFB0LHU9Yy5yZXBsYWNlKC9cWyhbXlxdXSspXXxRfHdvfHd3fHd8V1d8V3x6enp8enxnZ2dnfEdHR0d8RG98WHx4fGt7MSwyfXxTL2csZnVuY3Rpb24obCl7c3dpdGNoKGwpe2Nhc2UiUSI6cmV0dXJuIE1hdGguY2VpbCgoYS4kTSsxKS8zKTtjYXNlIkRvIjpyZXR1cm4gaS5vcmRpbmFsKGEuJEQpO2Nhc2UiZ2dnZyI6cmV0dXJuIGEud2Vla1llYXIoKTtjYXNlIkdHR0ciOnJldHVybiBhLmlzb1dlZWtZZWFyKCk7Y2FzZSJ3byI6cmV0dXJuIGkub3JkaW5hbChhLndlZWsoKSwiVyIpO2Nhc2UidyI6Y2FzZSJ3dyI6cmV0dXJuIG8ucyhhLndlZWsoKSxsPT09InciPzE6MiwiMCIpO2Nhc2UiVyI6Y2FzZSJXVyI6cmV0dXJuIG8ucyhhLmlzb1dlZWsoKSxsPT09IlciPzE6MiwiMCIpO2Nhc2UiayI6Y2FzZSJrayI6cmV0dXJuIG8ucyhTdHJpbmcoYS4kSD09PTA/MjQ6YS4kSCksbD09PSJrIj8xOjIsIjAiKTtjYXNlIlgiOnJldHVybiBNYXRoLmZsb29yKGEuJGQuZ2V0VGltZSgpLzFlMyk7Y2FzZSJ4IjpyZXR1cm4gYS4kZC5nZXRUaW1lKCk7Y2FzZSJ6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCkrIl0iO2Nhc2Uienp6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCJsb25nIikrIl0iO2RlZmF1bHQ6cmV0dXJuIGx9fSk7cmV0dXJuIG4uYmluZCh0aGlzKSh1KX19LGpuPSJpc293ZWVrIixZbj1mdW5jdGlvbihyLGUsdCl7dmFyIG49ZnVuY3Rpb24oYyx1KXt2YXIgbD0odT90LnV0Yzp0KSgpLnllYXIoYykuc3RhcnRPZihVKSxrPTQtbC5pc29XZWVrZGF5KCk7cmV0dXJuIGwuaXNvV2Vla2RheSgpPjQmJihrKz03KSxsLmFkZChrLFopfSxzPWZ1bmN0aW9uKGMpe3JldHVybiBjLmFkZCg0LWMuaXNvV2Vla2RheSgpLFopfSxhPWUucHJvdG90eXBlO2EuaXNvV2Vla1llYXI9ZnVuY3Rpb24oKXt2YXIgbz1zKHRoaXMpO3JldHVybiBvLnllYXIoKX0sYS5pc29XZWVrPWZ1bmN0aW9uKG8pe2lmKCF0aGlzLiR1dGlscygpLnUobykpcmV0dXJuIHRoaXMuYWRkKChvLXRoaXMuaXNvV2VlaygpKSo3LFopO3ZhciBjPXModGhpcyksdT1uKHRoaXMuaXNvV2Vla1llYXIoKSx0aGlzLiR1KTtyZXR1cm4gYy5kaWZmKHUsamUpKzF9LGEuaXNvV2Vla2RheT1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KG8pP3RoaXMuZGF5KCl8fDc6dGhpcy5kYXkodGhpcy5kYXkoKSU3P286by03KX07dmFyIGk9YS5zdGFydE9mO2Euc3RhcnRPZj1mdW5jdGlvbihvLGMpe3ZhciB1PXRoaXMuJHV0aWxzKCksbD11LnUoYyk/ITA6YyxrPXUucChvKTtyZXR1cm4gaz09PWpuP2w/dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLSh0aGlzLmlzb1dlZWtkYXkoKS0xKSkuc3RhcnRPZigiZGF5Iik6dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLTEtKHRoaXMuaXNvV2Vla2RheSgpLTEpKzcpLmVuZE9mKCJkYXkiKTppLmJpbmQodGhpcykobyxjKX19O3cuZXh0ZW5kKFluKSx3LmV4dGVuZChJbik7Y29uc3QgcHQ9IkdHR0ctW1ddV1ciLFhlPWNsYXNzIFhle2NvbnN0cnVjdG9yKCl7dGhpcy55ZWFyTW9udGhEYXlDYWNoZT1uZXcgTWFwLHRoaXMueWVhcldlZWtDYWNoZT1uZXcgTWFwLHRoaXMueWVhck1vbnRoQ2FjaGU9bmV3IE1hcCx0aGlzLnllYXJDYWNoZT1uZXcgTWFwfWdldFllYXJNb250aERheShlKXtyZXR1cm4gdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoZSl8fHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuc2V0KGUsdGUucGFyc2UoZSx0aGlzKSksdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5nZXQoZSl9Z2V0WWVhck1vbnRoKGUpe3JldHVybiB0aGlzLnllYXJNb250aENhY2hlLmhhcyhlKXx8dGhpcy55ZWFyTW9udGhDYWNoZS5zZXQoZSxuZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJNb250aENhY2hlLmdldChlKX1nZXRZZWFyV2VlayhlKXtyZXR1cm4gdGhpcy55ZWFyV2Vla0NhY2hlLmhhcyhlKXx8dGhpcy55ZWFyV2Vla0NhY2hlLnNldChlLHJlLnBhcnNlKGUsdGhpcykpLHRoaXMueWVhcldlZWtDYWNoZS5nZXQoZSl9Z2V0WWVhcihlKXtyZXR1cm4gdGhpcy55ZWFyQ2FjaGUuaGFzKGUpfHx0aGlzLnllYXJDYWNoZS5zZXQoZSxzZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJDYWNoZS5nZXQoZSl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2V9fTtYZS5pbnN0YW5jZT1uZXcgWGU7bGV0IHl0PVhlO2NsYXNzIHRle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMueWVhck51bWJlcj1lLHRoaXMubW9udGhOdW1iZXI9dCx0aGlzLmRheU51bWJlcj1uLHRoaXMuY2FjaGU9cyx0aGlzLnR5cGU9IlllYXJNb250aERheSIsdGhpcy5kYXRlPW5ldyBEYXRlKHRoaXMueWVhck51bWJlcix0aGlzLm1vbnRoTnVtYmVyLTEsdGhpcy5kYXlOdW1iZXIpLHRoaXMuZGF5anM9dyh0aGlzLmRhdGUpLHRoaXMuZGF0ZVN0cmluZz10aGlzLnRvU3RyaW5nKCl9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0tREQiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoImRkZGQsIE1NTU0gRCwgWVlZWSIpfWdldCBmaXJzdERheSgpe3JldHVybiB0aGlzfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXN9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKGAke3RoaXMueWVhck51bWJlcn1gKX1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgodGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0iKSl9Z2V0IHdlZWsoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChwdCkpfWFkZERheXMoZSl7Y29uc3Qgbj10aGlzLmRheWpzLmFkZChlLCJkYXkiKS5mb3JtYXQoIllZWVktTU0tREQiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZGF5anMuZGlmZihlLmRheWpzLCJkYXkiKX1zdGF0aWMgcGFyc2UoZSx0KXtjb25zdFtuLHMsYV09ZS5zcGxpdCgiLSIpLm1hcChpPT5wYXJzZUludChpLDEwKSk7cmV0dXJuIG5ldyB0ZShuLHMsYSx0KX19Y2xhc3MgcmV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuaXNvWWVhck51bWJlcj1lLHRoaXMuaXNvV2Vla051bWJlcj10LHRoaXMuY2FjaGU9bix0aGlzLnR5cGU9IlllYXJXZWVrIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KHB0KX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm5gV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7Y29uc3QgZT13KCkueWVhcih0aGlzLmlzb1llYXJOdW1iZXIpLm1vbnRoKDEpLmRhdGUoNCkuaXNvV2Vlayh0aGlzLmlzb1dlZWtOdW1iZXIpLnN0YXJ0T2YoImlzb1dlZWsiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZS5mb3JtYXQoIllZWVktTU0tREQiKSl9Z2V0IGxhc3REYXkoKXtjb25zdCB0PXcoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyLTEpKjcsImRheSIpLnN0YXJ0T2YoIndlZWsiKS5hZGQoMSwiZGF5IikuYWRkKDYsImRheSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheSh0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKX1nZXQgeWVhcigpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIoYCR7dGhpcy5pc29ZZWFyTnVtYmVyfWApfWFkZFdlZWtzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwid2VlayIpLmZvcm1hdChwdCk7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcldlZWsobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ3ZWVrIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbbixzXT1lLnNwbGl0KCItVyIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyByZShuLHMsdCl9fWNsYXNzIG5le2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnllYXJOdW1iZXI9ZSx0aGlzLm1vbnRoTnVtYmVyPXQsdGhpcy5jYWNoZT1uLHRoaXMudHlwZT0iWWVhck1vbnRoIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KCJZWVlZLU1NIil9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy50ZXh0fWVuZ2xpc2hOYW1lKCl7cmV0dXJuYCR7V24odGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZW5kT2YoIm1vbnRoIikuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCB5ZWFyKCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCl9YWRkTW9udGhzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwibW9udGgiKS5mb3JtYXQoIllZWVktTU0iKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJtb250aCIpfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0W24sc109ZS5zcGxpdCgiLSIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyBuZShuLHMsdCl9fWNsYXNzIHNle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy55ZWFyPWUsdGhpcy5jYWNoZT10LHRoaXMudHlwZT0iWWVhciIsdGhpcy5kYXRlU3RyaW5nPXRoaXMudG9TdHJpbmcoKX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdCgiWVlZWSIpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudGV4dH1lbmdsaXNoTmFtZSgpe3JldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKX1nZXQgZmlyc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTAxYCl9Z2V0IGxhc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTEyYCl9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheX1nZXQgbGFzdERheSgpe3JldHVybiB0aGlzLmxhc3RNb250aC5sYXN0RGF5fWFkZFllYXJzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwieWVhciIpLmZvcm1hdCgiWVlZWSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ5ZWFyIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLDEwKTtyZXR1cm4gbmV3IHNlKG4sdCl9fWZ1bmN0aW9uIFduKHIpe3JldHVybiB3KCkubW9udGgoci0xKS5mb3JtYXQoIk1NTU0iKX1mdW5jdGlvbiBVdChyKXtzd2l0Y2goci50eXBlKXtjYXNlIlllYXJNb250aERheSI6cmV0dXJue3R5cGU6IlllYXJNb250aERheSIseWVhck51bWJlcjpyLnllYXJOdW1iZXIsbW9udGhOdW1iZXI6ci5tb250aE51bWJlcixkYXlOdW1iZXI6ci5kYXlOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhcldlZWsiOnJldHVybnt0eXBlOiJZZWFyV2VlayIsaXNvWWVhck51bWJlcjpyLmlzb1llYXJOdW1iZXIsaXNvV2Vla051bWJlcjpyLmlzb1dlZWtOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhck1vbnRoIjpyZXR1cm57dHlwZToiWWVhck1vbnRoIix5ZWFyTnVtYmVyOnIueWVhck51bWJlcixtb250aE51bWJlcjpyLm1vbnRoTnVtYmVyLGRhdGVTdHJpbmc6ci5kYXRlU3RyaW5nfTtjYXNlIlllYXIiOnJldHVybnt0eXBlOiJZZWFyIix5ZWFyOnIueWVhcixkYXRlU3RyaW5nOnIuZGF0ZVN0cmluZ319fWZ1bmN0aW9uIFBuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkRGF5cyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVm4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRXZWVrcyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gTG4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRNb250aHMocykpO3JldHVybiB0fWZ1bmN0aW9uIHpuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkWWVhcnMocykpO3JldHVybiB0fWZ1bmN0aW9uIFVuKHIsZSl7aWYocj09PW51bGx8fGU9PT1udWxsKXJldHVybltdO2lmKHIgaW5zdGFuY2VvZiB0ZSYmZSBpbnN0YW5jZW9mIHRlKXJldHVybiBQbihyLGUpO2lmKHIgaW5zdGFuY2VvZiByZSYmZSBpbnN0YW5jZW9mIHJlKXJldHVybiBWbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lKXJldHVybiBMbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBzZSYmZSBpbnN0YW5jZW9mIHNlKXJldHVybiB6bihyLGUpO3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHM6IHN0YXJ0IGFuZCBlbmQgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlOiAke3J9LCAke2V9YCl9ZnVuY3Rpb24gRm4ocixlKXtpZihyIGluc3RhbmNlb2YgdGUmJmUgaW5zdGFuY2VvZiB0ZXx8ciBpbnN0YW5jZW9mIHJlJiZlIGluc3RhbmNlb2YgcmV8fHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lfHxyIGluc3RhbmNlb2Ygc2UmJmUgaW5zdGFuY2VvZiBzZSlyZXR1cm4gci5taW51cyhlKTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wYXJlICR7cn0gYW5kICR7ZX1gKX1mdW5jdGlvbiBKZShyLGUpe2lmKHI9PT1udWxsKXJldHVybiAxO2lmKGU9PT1udWxsKXJldHVybi0xO2NvbnN0IHQ9Rm4ocixlKTtyZXR1cm4gdDwwPy0xOnQ+MD8xOjB9ZnVuY3Rpb24gQm4ocil7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgciluIT09bnVsbCYmKChlPT09bnVsbHx8SmUobixlKTwwKSYmKGU9biksKHQ9PT1udWxsfHxKZShuLHQpPjApJiYodD1uKSk7cmV0dXJuIGU9PT1udWxsfHx0PT09bnVsbD97bWluOm51bGwsbWF4Om51bGx9OnttaW46ZSxtYXg6dH19ZnVuY3Rpb24gV2UocixlKXtjb25zdCBuPXl0LmdldEluc3RhbmNlKCkuZ2V0WWVhck1vbnRoRGF5KHIpO3N3aXRjaChlKXtjYXNlImRheSI6cmV0dXJuIG47Y2FzZSJ3ZWVrIjpyZXR1cm4gbi53ZWVrO2Nhc2UibW9udGgiOnJldHVybiBuLm1vbnRoO2Nhc2UieWVhciI6cmV0dXJuIG4ueWVhcn19ZnVuY3Rpb24gSG4ocixlKXtyZXR1cm4gci5kYXRlUmFuZ2U9PT1udWxsPzE6ZS5kYXRlUmFuZ2U9PT1udWxsPy0xOkplKHIuZGF0ZVJhbmdlLGUuZGF0ZVJhbmdlKX1mdW5jdGlvbiBxbihyLGUpe3JldHVybntkYXRlUmFuZ2U6ci5kYXRlPT09bnVsbD9udWxsOldlKHIuZGF0ZSxlKSxjb3VudDpyLmNvdW50fX1jb25zdCBHbj0vXigoPzxzZWdtZW50PltBLVowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aXSk/KD88cG9zaXRpb24+XGQrKSg/PHN1YnN0aXR1dGlvblZhbHVlPltBLVouXSk/JC9pO2NsYXNzIEtle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMuc2VnbWVudD1lLHRoaXMudmFsdWVBdFJlZmVyZW5jZT10LHRoaXMuc3Vic3RpdHV0aW9uVmFsdWU9bix0aGlzLnBvc2l0aW9uPXMsdGhpcy50eXBlPSJzdWJzdGl0dXRpb24iO2NvbnN0IGE9dGhpcy5zZWdtZW50P2Ake3RoaXMuc2VnbWVudH06YDoiIixpPXRoaXMudmFsdWVBdFJlZmVyZW5jZT9gJHt0aGlzLnZhbHVlQXRSZWZlcmVuY2V9YDoiIixvPXRoaXMuc3Vic3RpdHV0aW9uVmFsdWU/YCR7dGhpcy5zdWJzdGl0dXRpb25WYWx1ZX1gOiIiO3RoaXMuY29kZT1gJHthfSR7aX0ke3RoaXMucG9zaXRpb259JHtvfWB9ZXF1YWxzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgS2U/dGhpcy5zZWdtZW50PT09ZS5zZWdtZW50JiZ0aGlzLnZhbHVlQXRSZWZlcmVuY2U9PT1lLnZhbHVlQXRSZWZlcmVuY2UmJnRoaXMuc3Vic3RpdHV0aW9uVmFsdWU9PT1lLnN1YnN0aXR1dGlvblZhbHVlJiZ0aGlzLnBvc2l0aW9uPT09ZS5wb3NpdGlvbjohMX10b1N0cmluZygpe3JldHVybiB0aGlzLmNvZGV9c3RhdGljIHBhcnNlKGUpe2NvbnN0IHQ9ZS5tYXRjaChHbik7cmV0dXJuIHQ9PT1udWxsfHx0Lmdyb3Vwcz09PXZvaWQgMD9udWxsOm5ldyBLZSh0Lmdyb3Vwcy5zZWdtZW50LHQuZ3JvdXBzLnZhbHVlQXRSZWZlcmVuY2UsdC5ncm91cHMuc3Vic3RpdHV0aW9uVmFsdWUscGFyc2VJbnQodC5ncm91cHMucG9zaXRpb24sMTApKX19Y29uc3QgSm49L14oKD88c2VnbWVudD5bQS1aMC05Xy1dKykoPz06KTopPyg/PHZhbHVlQXRSZWZlcmVuY2U+W0EtWl0pPyg/PHBvc2l0aW9uPlxkKykoLSkkL2k7Y2xhc3MgZ2V7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuc2VnbWVudD1lLHRoaXMudmFsdWVBdFJlZmVyZW5jZT10LHRoaXMucG9zaXRpb249bix0aGlzLnR5cGU9ImRlbGV0aW9uIjtjb25zdCBzPXRoaXMuc2VnbWVudD9gJHt0aGlzLnNlZ21lbnR9OmA6IiIsYT10aGlzLnZhbHVlQXRSZWZlcmVuY2U/YCR7dGhpcy52YWx1ZUF0UmVmZXJlbmNlfWA6IiI7dGhpcy5jb2RlPWAke3N9JHthfSR7dGhpcy5wb3NpdGlvbn0tYH1lcXVhbHMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBnZT90aGlzLnNlZ21lbnQ9PT1lLnNlZ21lbnQmJnRoaXMudmFsdWVBdFJlZmVyZW5jZT09PWUudmFsdWVBdFJlZmVyZW5jZSYmdGhpcy5wb3NpdGlvbj09PWUucG9zaXRpb246ITF9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5jb2RlfXN0YXRpYyBwYXJzZShlKXtjb25zdCB0PWUubWF0Y2goSm4pO3JldHVybiB0PT09bnVsbHx8dC5ncm91cHM9PT12b2lkIDA/bnVsbDpuZXcgZ2UodC5ncm91cHMuc2VnbWVudCx0Lmdyb3Vwcy52YWx1ZUF0UmVmZXJlbmNlLHBhcnNlSW50KHQuZ3JvdXBzLnBvc2l0aW9uLDEwKSl9fWZ1bmN0aW9uIEZ0KHIpe3N3aXRjaChyLnR5cGUpe2Nhc2Uic3Vic3RpdHV0aW9uIjpyZXR1cm57dHlwZToic3Vic3RpdHV0aW9uIixjb2RlOnIuY29kZSxzZWdtZW50OnIuc2VnbWVudCxwb3NpdGlvbjpyLnBvc2l0aW9uLHZhbHVlQXRSZWZlcmVuY2U6ci52YWx1ZUF0UmVmZXJlbmNlLHN1YnN0aXR1dGlvblZhbHVlOnIuc3Vic3RpdHV0aW9uVmFsdWV9O2Nhc2UiZGVsZXRpb24iOnJldHVybnt0eXBlOiJkZWxldGlvbiIsY29kZTpyLmNvZGUsc2VnbWVudDpyLnNlZ21lbnQscG9zaXRpb246ci5wb3NpdGlvbix2YWx1ZUF0UmVmZXJlbmNlOnIudmFsdWVBdFJlZmVyZW5jZX19fWNsYXNzIEtue2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmZpbHRlcj1lLHRoaXMuc2VxdWVuY2VUeXBlPXQsdGhpcy5taW5Qcm9wb3J0aW9uPW59YXN5bmMgZXZhbHVhdGUoZSx0KXtyZXR1cm57Y29udGVudDooYXdhaXQgdGhpcy5mZXRjaE11dGF0aW9ucyhlLHQpKS5tYXAoKHtjb3VudDphLHByb3BvcnRpb246aSxtdXRhdGlvbkZyb206byxtdXRhdGlvblRvOmMscG9zaXRpb246dSxzZXF1ZW5jZU5hbWU6bH0pPT5jPT09Ii0iP3t0eXBlOiJkZWxldGlvbiIsbXV0YXRpb246bmV3IGdlKGw/P3ZvaWQgMCxvLHUpLGNvdW50OmEscHJvcG9ydGlvbjppfTp7dHlwZToic3Vic3RpdHV0aW9uIixtdXRhdGlvbjpuZXcgS2UobD8/dm9pZCAwLG8sYyx1KSxjb3VudDphLHByb3BvcnRpb246aX0pfX1hc3luYyBmZXRjaE11dGF0aW9ucyhlLHQpe2NvbnN0IG49ey4uLnRoaXMuZmlsdGVyLG1pblByb3BvcnRpb246dGhpcy5taW5Qcm9wb3J0aW9ufTtyZXR1cm4gZm4oZSxuLHRoaXMuc2VxdWVuY2VUeXBlLHQpLnRoZW4ocz0+cy5kYXRhKX19dmFyIEJ0O0J0PXtfX2U6ZnVuY3Rpb24ocixlLHQsbil7Zm9yKHZhciBzLGEsaTtlPWUuX187KWlmKChzPWUuX19jKSYmIXMuX18pdHJ5e2lmKChhPXMuY29uc3RydWN0b3IpJiZhLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciE9bnVsbCYmKHMuc2V0U3RhdGUoYS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IocikpLGk9cy5fX2QpLHMuY29tcG9uZW50RGlkQ2F0Y2ghPW51bGwmJihzLmNvbXBvbmVudERpZENhdGNoKHIsbnx8e30pLGk9cy5fX2QpLGkpcmV0dXJuIHMuX19FPXN9Y2F0Y2gobyl7cj1vfXRocm93IHJ9fSx0eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIiYmUHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTt2YXIgVixndCxIdCxxdD1bXSwkPUJ0LEd0PSQuX19iLEp0PSQuX19yLEt0PSQuZGlmZmVkLFF0PSQuX19jLFh0PSQudW5tb3VudCxlcj0kLl9fO2Z1bmN0aW9uIFFuKCl7Zm9yKHZhciByO3I9cXQuc2hpZnQoKTspaWYoci5fX1AmJnIuX19IKXRyeXtyLl9fSC5fX2guZm9yRWFjaChRZSksci5fX0guX19oLmZvckVhY2godnQpLHIuX19ILl9faD1bXX1jYXRjaChlKXtyLl9fSC5fX2g9W10sJC5fX2UoZSxyLl9fdil9fSQuX19iPWZ1bmN0aW9uKHIpe1Y9bnVsbCxHdCYmR3Qocil9LCQuX189ZnVuY3Rpb24ocixlKXtyJiZlLl9fayYmZS5fX2suX19tJiYoci5fX209ZS5fX2suX19tKSxlciYmZXIocixlKX0sJC5fX3I9ZnVuY3Rpb24ocil7SnQmJkp0KHIpO3ZhciBlPShWPXIuX19jKS5fX0g7ZSYmKGd0PT09Vj8oZS5fX2g9W10sVi5fX2g9W10sZS5fXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX19OJiYodC5fXz10Ll9fTiksdC5pPXQuX19OPXZvaWQgMH0pKTooZS5fX2guZm9yRWFjaChRZSksZS5fX2guZm9yRWFjaCh2dCksZS5fX2g9W10pKSxndD1WfSwkLmRpZmZlZD1mdW5jdGlvbihyKXtLdCYmS3Qocik7dmFyIGU9ci5fX2M7ZSYmZS5fX0gmJihlLl9fSC5fX2gubGVuZ3RoJiYocXQucHVzaChlKSE9PTEmJkh0PT09JC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCgoSHQ9JC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpfHxYbikoUW4pKSxlLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaSYmKHQuX19IPXQuaSksdC5pPXZvaWQgMH0pKSxndD1WPW51bGx9LCQuX19jPWZ1bmN0aW9uKHIsZSl7ZS5zb21lKGZ1bmN0aW9uKHQpe3RyeXt0Ll9faC5mb3JFYWNoKFFlKSx0Ll9faD10Ll9faC5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIW4uX198fHZ0KG4pfSl9Y2F0Y2gobil7ZS5zb21lKGZ1bmN0aW9uKHMpe3MuX19oJiYocy5fX2g9W10pfSksZT1bXSwkLl9fZShuLHQuX192KX19KSxRdCYmUXQocixlKX0sJC51bm1vdW50PWZ1bmN0aW9uKHIpe1h0JiZYdChyKTt2YXIgZSx0PXIuX19jO3QmJnQuX19IJiYodC5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuKXt0cnl7UWUobil9Y2F0Y2gocyl7ZT1zfX0pLHQuX19IPXZvaWQgMCxlJiYkLl9fZShlLHQuX192KSl9O3ZhciB0cj10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iO2Z1bmN0aW9uIFhuKHIpe3ZhciBlLHQ9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQobiksdHImJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpLHNldFRpbWVvdXQocil9LG49c2V0VGltZW91dCh0LDEwMCk7dHImJihlPXJlcXVlc3RBbmltYXRpb25GcmFtZSh0KSl9ZnVuY3Rpb24gUWUocil7dmFyIGU9Vix0PXIuX19jO3R5cGVvZiB0PT0iZnVuY3Rpb24iJiYoci5fX2M9dm9pZCAwLHQoKSksVj1lfWZ1bmN0aW9uIHZ0KHIpe3ZhciBlPVY7ci5fX2M9ci5fXygpLFY9ZX1jbGFzcyByciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIodCksdGhpcy5oZWFkbGluZT1lLHRoaXMubmFtZT0iVXNlckZhY2luZ0Vycm9yIn19Y2xhc3MgZXN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuc2VyaWFsaXplRmlyc3RBeGlzPWUsdGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzPXQsdGhpcy5kYXRhPW5ldyBNYXAsdGhpcy5rZXlzRmlyc3RBeGlzPW5ldyBNYXAsdGhpcy5rZXlzU2Vjb25kQXhpcz1uZXcgTWFwLG4mJih0aGlzLmtleXNGaXJzdEF4aXM9bmV3IE1hcChuLmtleXNGaXJzdEF4aXMpLHRoaXMua2V5c1NlY29uZEF4aXM9bmV3IE1hcChuLmtleXNTZWNvbmRBeGlzKSx0aGlzLmRhdGE9bmV3IE1hcChuLmRhdGEpKX1nZXQoZSx0KXt2YXIgYTtjb25zdCBuPXRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGUpLHM9dGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzKHQpO3JldHVybihhPXRoaXMuZGF0YS5nZXQobikpPT1udWxsP3ZvaWQgMDphLmdldChzKX1nZXRSb3coZSx0KXtjb25zdCBuPXRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGUpLHM9dGhpcy5kYXRhLmdldChuKTtyZXR1cm4gcz09PXZvaWQgMD9bXTpBcnJheS5mcm9tKHRoaXMua2V5c1NlY29uZEF4aXMua2V5cygpKS5tYXAoYT0+cy5nZXQoYSk/P3QpfXNldChlLHQsbil7Y29uc3Qgcz10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxhPXRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyh0KTt0aGlzLmRhdGEuaGFzKHMpfHx0aGlzLmRhdGEuc2V0KHMsbmV3IE1hcCksdGhpcy5kYXRhLmdldChzKS5zZXQoYSxuKSx0aGlzLmtleXNGaXJzdEF4aXMuc2V0KHMsZSksdGhpcy5rZXlzU2Vjb25kQXhpcy5zZXQoYSx0KX1kZWxldGVSb3coZSl7Y29uc3QgdD10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKTt0aGlzLmRhdGEuZGVsZXRlKHQpLHRoaXMua2V5c0ZpcnN0QXhpcy5kZWxldGUodCl9Z2V0Rmlyc3RBeGlzS2V5cygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5c0ZpcnN0QXhpcy52YWx1ZXMoKSl9Z2V0U2Vjb25kQXhpc0tleXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNTZWNvbmRBeGlzLnZhbHVlcygpKX1nZXRBc0FycmF5KGUpe3JldHVybiB0aGlzLmdldEZpcnN0QXhpc0tleXMoKS5tYXAodD0+dGhpcy5nZXRTZWNvbmRBeGlzS2V5cygpLm1hcChuPT50aGlzLmdldCh0LG4pPz9lKSl9Z2V0Q29udGVudHMoKXtyZXR1cm57a2V5c0ZpcnN0QXhpczp0aGlzLmtleXNGaXJzdEF4aXMsa2V5c1NlY29uZEF4aXM6dGhpcy5rZXlzU2Vjb25kQXhpcyxkYXRhOnRoaXMuZGF0YX19fWNsYXNzIHRzIGV4dGVuZHMgZXN7Y29uc3RydWN0b3IoZSl7c3VwZXIobHMsaHMsZSl9fWNvbnN0IHJzPShyLGUpPT57aWYoci5zZWdtZW50IT09ZS5zZWdtZW50KXJldHVybiBucyhyLnNlZ21lbnQsZS5zZWdtZW50KTtpZihyLnBvc2l0aW9uIT09ZS5wb3NpdGlvbilyZXR1cm4gc3Moci5wb3NpdGlvbixlLnBvc2l0aW9uKTtjb25zdCB0PXIgaW5zdGFuY2VvZiBnZSxuPWUgaW5zdGFuY2VvZiBnZTtyZXR1cm4gdCE9PW4/dD8xOi0xOiF0JiYhbiYmci5zdWJzdGl0dXRpb25WYWx1ZSE9PWUuc3Vic3RpdHV0aW9uVmFsdWU/YXMoci5zdWJzdGl0dXRpb25WYWx1ZSxlLnN1YnN0aXR1dGlvblZhbHVlKTowfSxucz0ocixlKT0+cj09PXZvaWQgMD8tMTplPT09dm9pZCAwPzE6ci5sb2NhbGVDb21wYXJlKGUpLHNzPShyLGUpPT5yLWUsYXM9KHIsZSk9PnI9PT12b2lkIDA/LTE6ZT09PXZvaWQgMD8xOnIubG9jYWxlQ29tcGFyZShlKSxucj0yMDA7YXN5bmMgZnVuY3Rpb24gaXMoe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxncmFudWxhcml0eTpuLGxhcGlzRGF0ZUZpZWxkOnMsc2lnbmFsOmF9KXtjb25zdCBpPWF3YWl0IHNyKHIsdCxuLHMsYSk7aWYoaS5sZW5ndGg9PT0wKXJldHVybntjb250ZW50OltdfTtjb25zdCBvPXsuLi5yLFtgJHtzfUZyb21gXTppWzBdLmZpcnN0RGF5LnRvU3RyaW5nKCksW2Ake3N9VG9gXTppW2kubGVuZ3RoLTFdLmxhc3REYXkudG9TdHJpbmcoKX07cmV0dXJuIGFyKG8sZSkuZXZhbHVhdGUodCxhKX1hc3luYyBmdW5jdGlvbiBvcyh7bGFwaXNGaWx0ZXI6cixzZXF1ZW5jZVR5cGU6ZSxsYXBpczp0LGxhcGlzRGF0ZUZpZWxkOm4sZ3JhbnVsYXJpdHk6cyxzaWduYWw6YX0pe2NvbnN0IGk9YXdhaXQgc3Iocix0LHMsbixhKTtpZihpLmxlbmd0aD5ucil0aHJvdyBuZXcgcnIoIlRvbyBtYW55IGRhdGVzIixgVGhlIGRhdGFzZXQgd291bGQgY29udGFpbiAke2kubGVuZ3RofSBkYXRlIGludGVydmFscy4gUGxlYXNlIHJlZHVjZSB0aGUgbnVtYmVyIHRvIGJlbG93ICR7bnJ9IHRvIGRpc3BsYXkgdGhlIGRhdGEuIFlvdSBjYW4gYWNoaWV2ZSB0aGlzIGJ5IGVpdGhlciBuYXJyb3dpbmcgdGhlIGRhdGUgcmFuZ2UgaW4gdGhlIHByb3ZpZGVkIExBUElTIGZpbHRlciBvciBieSBzZWxlY3RpbmcgYSBsYXJnZXIgZ3JhbnVsYXJpdHkuYCk7Y29uc3Qgbz1pLm1hcChhc3luYyBsPT57Y29uc3Qgaz1sLmZpcnN0RGF5LnRvU3RyaW5nKCksUz1sLmxhc3REYXkudG9TdHJpbmcoKSxNPXsuLi5yLFtgJHtufUZyb21gXTprLFtgJHtufVRvYF06U30sRj1hd2FpdCBhcihNLGUpLmV2YWx1YXRlKHQsYSksYWU9YXdhaXQgbXMoTSkuZXZhbHVhdGUodCxhKTtyZXR1cm57ZGF0ZTpsLG11dGF0aW9uczpGLmNvbnRlbnQsdG90YWxDb3VudDphZS5jb250ZW50WzBdLmNvdW50fX0pLGM9YXdhaXQgUHJvbWlzZS5hbGwobyksdT0oYXdhaXQgaXMoe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxsYXBpc0RhdGVGaWVsZDpuLGdyYW51bGFyaXR5OnN9KSkuY29udGVudDtyZXR1cm57bXV0YXRpb25PdmVyVGltZURhdGE6ZnMoYyx1KSxvdmVyYWxsTXV0YXRpb25EYXRhOnV9fWFzeW5jIGZ1bmN0aW9uIHNyKHIsZSx0LG4scyl7Y29uc3R7Y29udGVudDphfT1hd2FpdCB1cyhyLGUsdCxuLHMpLHtkYXRlRnJvbTppLGRhdGVUbzpvfT1jcyhyLG4sdCkse21pbjpjLG1heDp1fT1CbihhKTtyZXR1cm4gVW4oaT8/YyxvPz91KX1mdW5jdGlvbiBjcyhyLGUsdCl7Y29uc3Qgbj1yW2VdO2lmKG4pcmV0dXJue2RhdGVGcm9tOldlKG4sdCksZGF0ZVRvOldlKG4sdCl9O2NvbnN0IHM9cltgJHtlfUZyb21gXSxhPXJbYCR7ZX1Ub2BdO3JldHVybntkYXRlRnJvbTpzP1dlKHMsdCk6bnVsbCxkYXRlVG86YT9XZShhLHQpOm51bGx9fWZ1bmN0aW9uIHVzKHIsZSx0LG4scyl7cmV0dXJuIGRzKHIsdCxuKS5ldmFsdWF0ZShlLHMpfWZ1bmN0aW9uIGRzKHIsZSx0KXtjb25zdCBuPW5ldyBDdChyLFt0XSkscz1uZXcgeG4obix0LCJkYXRlIiksYT1uZXcgZHQocyxjPT5xbihjLGUpKSxpPW5ldyBfbihhLCJkYXRlUmFuZ2UiLCJjb3VudCIpLG89bmV3IGtuKGksSG4pO3JldHVybiBuZXcgZHQobyxjPT5jLmRhdGVSYW5nZSl9ZnVuY3Rpb24gYXIocixlKXtyZXR1cm4gbmV3IEtuKHIsZSwuMDAxKX1mdW5jdGlvbiBscyhyKXtyZXR1cm4gci5jb2RlfWZ1bmN0aW9uIGhzKHIpe3JldHVybiByLmRhdGVTdHJpbmd9ZnVuY3Rpb24gZnMocixlKXtjb25zdCB0PW5ldyB0cyxuPXIubWFwKGk9PmkuZGF0ZSkscz1lLnNvcnQoKGksbyk9PnJzKGkubXV0YXRpb24sby5tdXRhdGlvbikpLm1hcChpPT5GdChpLm11dGF0aW9uKSksYT1uLnNvcnQoKGksbyk9PkplKGksbykpLm1hcChpPT5VdChpKSk7cmV0dXJuIHMuZm9yRWFjaChpPT57YS5mb3JFYWNoKG89Pnt0LnNldChpLG8se2NvdW50OjAscHJvcG9ydGlvbjowLHRvdGFsQ291bnQ6MH0pfSl9KSxyLmZvckVhY2goaT0+e2kubXV0YXRpb25zLmZvckVhY2gobz0+e2NvbnN0IGM9RnQoby5tdXRhdGlvbiksdT1VdChpLmRhdGUpO3QuZ2V0KGMsdSkhPT12b2lkIDAmJnQuc2V0KGMsdSx7Y291bnQ6by5jb3VudCxwcm9wb3J0aW9uOm8ucHJvcG9ydGlvbix0b3RhbENvdW50OmkudG90YWxDb3VudH0pfSl9KSx0fWZ1bmN0aW9uIG1zKHIpe3JldHVybiBuZXcgQ3Qocil9YXN5bmMgZnVuY3Rpb24gcHMocil7dHJ5e3Bvc3RNZXNzYWdlKHtzdGF0dXM6ImxvYWRpbmcifSk7Y29uc3QgZT1hd2FpdCByKCk7cG9zdE1lc3NhZ2Uoe3N0YXR1czoic3VjY2VzcyIsZGF0YTplfSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2UoZSBpbnN0YW5jZW9mIHJyP3tzdGF0dXM6ImVycm9yIix1c2VyRmFjaW5nOiEwLGhlYWRsaW5lOmUuaGVhZGxpbmUsZXJyb3I6ZX06e3N0YXR1czoiZXJyb3IiLHVzZXJGYWNpbmc6ITEsZXJyb3I6ZSBpbnN0YW5jZW9mIEVycm9yP2U6bmV3IEVycm9yKGAke2V9YCl9KX19YXN5bmMgZnVuY3Rpb24geXMocil7Y29uc3QgZT1hd2FpdCBvcyhyLmRhdGEpO3JldHVybntvdmVyYWxsTXV0YXRpb25EYXRhOmUub3ZlcmFsbE11dGF0aW9uRGF0YSxtdXRhdGlvbk92ZXJUaW1lU2VyaWFsaXplZDplLm11dGF0aW9uT3ZlclRpbWVEYXRhLmdldENvbnRlbnRzKCl9fXNlbGYub25tZXNzYWdlPWFzeW5jIGZ1bmN0aW9uKHIpe2F3YWl0IHBzKCgpPT55cyhyKSl9fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXV0YXRpb25PdmVyVGltZVdvcmtlci1DeXBYX1BZTS5qcy5tYXAK", xS = (n) => Uint8Array.from(atob(n), (t) => t.charCodeAt(0)), Kf = typeof self < "u" && self.Blob && new Blob([xS(rg)], { type: "text/javascript;charset=utf-8" });
23736
23740
  function ZS(n) {
23737
23741
  let t;
23738
23742
  try {
@@ -23952,7 +23956,7 @@ const YS = ({ children: n, content: t, position: e = "bottom" }) => /* @__PURE__
23952
23956
  "div",
23953
23957
  {
23954
23958
  style: { gridRowStart: a + 1, gridColumnStart: 1 },
23955
- children: /* @__PURE__ */ m(zS, { mutation: o })
23959
+ children: /* @__PURE__ */ m(TS, { mutation: o })
23956
23960
  },
23957
23961
  `mutation-${o.toString()}`
23958
23962
  ),
@@ -24022,13 +24026,13 @@ const CS = ({ value: n, mutation: t, date: e, tooltipPosition: i, colorScale: r
24022
24026
  children: /* @__PURE__ */ m("span", { className: "invisible @[2rem]:visible", children: Re(n.proportion, 0) })
24023
24027
  }
24024
24028
  ) }) });
24025
- }, NS = (n) => n instanceof dn ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, zS = ({ mutation: n }) => /* @__PURE__ */ m("div", { className: "text-center", children: n.code }), TS = ({
24029
+ }, NS = (n) => n instanceof dn ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, TS = ({ mutation: n }) => /* @__PURE__ */ m("div", { className: "text-center", children: n.code }), zS = ({
24026
24030
  colorScale: n,
24027
24031
  setColorScale: t
24028
24032
  }) => /* @__PURE__ */ m("div", { className: "w-20", children: /* @__PURE__ */ m(Id, { buttonTitle: "Color scale", placement: "bottom-start", children: /* @__PURE__ */ m(SS, { colorScale: n, setColorScale: t }) }) });
24029
24033
  function FS(n, t) {
24030
24034
  const [e, i] = it(void 0), [r, s] = it(void 0), [o, a] = it(!0);
24031
- return ie(() => {
24035
+ return Qt(() => {
24032
24036
  t.onmessage = (l) => {
24033
24037
  const c = l.data, d = c.status;
24034
24038
  switch (d) {
@@ -24049,7 +24053,7 @@ function FS(n, t) {
24049
24053
  }, t.onmessageerror = (l) => {
24050
24054
  s(new Error(`Worker received a message that it cannot deserialize: ${l.data}`)), a(!1);
24051
24055
  };
24052
- }, [t]), ie(() => {
24056
+ }, [t]), Qt(() => {
24053
24057
  t.postMessage(n);
24054
24058
  }, [n, t]), { data: e, error: r, isLoading: o };
24055
24059
  }
@@ -24087,7 +24091,7 @@ const HS = (n) => {
24087
24091
  originalComponentProps: t,
24088
24092
  overallMutationData: e
24089
24093
  }) => {
24090
- const [i, r] = it({ min: 0.05, max: 0.9 }), [s, o] = it({ min: 0, max: 1, color: "indigo" }), [a, l] = zd(t.sequenceType), [c, d] = it([
24094
+ const [i, r] = it({ min: 0.05, max: 0.9 }), [s, o] = it({ min: 0, max: 1, color: "indigo" }), [a, l] = Td(t.sequenceType), [c, d] = it([
24091
24095
  { label: "Substitutions", checked: !0, type: "substitution" },
24092
24096
  { label: "Deletions", checked: !0, type: "deletion" }
24093
24097
  ]), u = Oe(() => WS(
@@ -24139,7 +24143,7 @@ const HS = (n) => {
24139
24143
  setColorScale: c,
24140
24144
  originalComponentProps: d
24141
24145
  }) => /* @__PURE__ */ m(Gt, { children: [
24142
- n === "Grid" && /* @__PURE__ */ m(TS, { colorScale: l, setColorScale: c }),
24146
+ n === "Grid" && /* @__PURE__ */ m(zS, { colorScale: l, setColorScale: c }),
24143
24147
  /* @__PURE__ */ m(Nd, { displayedSegments: t, setDisplayedSegments: e }),
24144
24148
  /* @__PURE__ */ m(
24145
24149
  Md,
@@ -24406,7 +24410,7 @@ function jf(n, t) {
24406
24410
  var Ql = function(n) {
24407
24411
  return n instanceof Array ? n : [n];
24408
24412
  };
24409
- function qt(n, t, e) {
24413
+ function te(n, t, e) {
24410
24414
  if (e === !0)
24411
24415
  return n.classList.add(t);
24412
24416
  n.classList.remove(t);
@@ -24772,9 +24776,9 @@ function qS(n, t) {
24772
24776
  e.amPM !== void 0 && (v = c(v, e.amPM.textContent));
24773
24777
  var R = e.config.minTime !== void 0 || e.config.minDate && e.minDateHasTime && e.latestSelectedDateObj && me(e.latestSelectedDateObj, e.config.minDate, !0) === 0, I = e.config.maxTime !== void 0 || e.config.maxDate && e.maxDateHasTime && e.latestSelectedDateObj && me(e.latestSelectedDateObj, e.config.maxDate, !0) === 0;
24774
24778
  if (e.config.maxTime !== void 0 && e.config.minTime !== void 0 && e.config.minTime > e.config.maxTime) {
24775
- var z = ql(e.config.minTime.getHours(), e.config.minTime.getMinutes(), e.config.minTime.getSeconds()), $ = ql(e.config.maxTime.getHours(), e.config.maxTime.getMinutes(), e.config.maxTime.getSeconds()), O = ql(v, Z, W);
24776
- if (O > $ && O < z) {
24777
- var nt = AS(z);
24779
+ var T = ql(e.config.minTime.getHours(), e.config.minTime.getMinutes(), e.config.minTime.getSeconds()), $ = ql(e.config.maxTime.getHours(), e.config.maxTime.getMinutes(), e.config.maxTime.getSeconds()), O = ql(v, Z, W);
24780
+ if (O > $ && O < T) {
24781
+ var nt = AS(T);
24778
24782
  v = nt[0], Z = nt[1], W = nt[2];
24779
24783
  }
24780
24784
  } else {
@@ -24847,8 +24851,8 @@ function qS(n, t) {
24847
24851
  var W = v !== void 0 ? e.parseDate(v) : e.latestSelectedDateObj || (e.config.minDate && e.config.minDate > e.now ? e.config.minDate : e.config.maxDate && e.config.maxDate < e.now ? e.config.maxDate : e.now), R = e.currentYear, I = e.currentMonth;
24848
24852
  try {
24849
24853
  W !== void 0 && (e.currentYear = W.getFullYear(), e.currentMonth = W.getMonth());
24850
- } catch (z) {
24851
- z.message = "Invalid date supplied: " + W, e.config.errorHandler(z);
24854
+ } catch (T) {
24855
+ T.message = "Invalid date supplied: " + W, e.config.errorHandler(T);
24852
24856
  }
24853
24857
  Z && e.currentYear !== R && (Lt("onYearChange"), ot()), Z && (e.currentYear !== R || e.currentMonth !== I) && Lt("onMonthChange"), e.redraw();
24854
24858
  }
@@ -24857,8 +24861,8 @@ function qS(n, t) {
24857
24861
  ~Z.className.indexOf("arrow") && k(v, Z.classList.contains("arrowUp") ? 1 : -1);
24858
24862
  }
24859
24863
  function k(v, Z, W) {
24860
- var R = v && pe(v), I = W || R && R.parentNode && R.parentNode.firstChild, z = vl("increment");
24861
- z.delta = Z, I && I.dispatchEvent(z);
24864
+ var R = v && pe(v), I = W || R && R.parentNode && R.parentNode.firstChild, T = vl("increment");
24865
+ T.delta = Z, I && I.dispatchEvent(T);
24862
24866
  }
24863
24867
  function X() {
24864
24868
  var v = window.document.createDocumentFragment();
@@ -24869,32 +24873,32 @@ function qS(n, t) {
24869
24873
  }
24870
24874
  e.rContainer = ht("div", "flatpickr-rContainer"), e.rContainer.appendChild(Rt()), e.daysContainer || (e.daysContainer = ht("div", "flatpickr-days"), e.daysContainer.tabIndex = -1), H(), e.rContainer.appendChild(e.daysContainer), e.innerContainer.appendChild(e.rContainer), v.appendChild(e.innerContainer);
24871
24875
  }
24872
- e.config.enableTime && v.appendChild(ft()), qt(e.calendarContainer, "rangeMode", e.config.mode === "range"), qt(e.calendarContainer, "animate", e.config.animate === !0), qt(e.calendarContainer, "multiMonth", e.config.showMonths > 1), e.calendarContainer.appendChild(v);
24876
+ e.config.enableTime && v.appendChild(ft()), te(e.calendarContainer, "rangeMode", e.config.mode === "range"), te(e.calendarContainer, "animate", e.config.animate === !0), te(e.calendarContainer, "multiMonth", e.config.showMonths > 1), e.calendarContainer.appendChild(v);
24873
24877
  var I = e.config.appendTo !== void 0 && e.config.appendTo.nodeType !== void 0;
24874
24878
  if ((e.config.inline || e.config.static) && (e.calendarContainer.classList.add(e.config.inline ? "inline" : "static"), e.config.inline && (!I && e.element.parentNode ? e.element.parentNode.insertBefore(e.calendarContainer, e._input.nextSibling) : e.config.appendTo !== void 0 && e.config.appendTo.appendChild(e.calendarContainer)), e.config.static)) {
24875
- var z = ht("div", "flatpickr-wrapper");
24876
- e.element.parentNode && e.element.parentNode.insertBefore(z, e.element), z.appendChild(e.element), e.altInput && z.appendChild(e.altInput), z.appendChild(e.calendarContainer);
24879
+ var T = ht("div", "flatpickr-wrapper");
24880
+ e.element.parentNode && e.element.parentNode.insertBefore(T, e.element), T.appendChild(e.element), e.altInput && T.appendChild(e.altInput), T.appendChild(e.calendarContainer);
24877
24881
  }
24878
24882
  !e.config.static && !e.config.inline && (e.config.appendTo !== void 0 ? e.config.appendTo : window.document.body).appendChild(e.calendarContainer);
24879
24883
  }
24880
24884
  function S(v, Z, W, R) {
24881
- var I = wi(Z, !0), z = ht("span", v, Z.getDate().toString());
24882
- return z.dateObj = Z, z.$i = R, z.setAttribute("aria-label", e.formatDate(Z, e.config.ariaDateFormat)), v.indexOf("hidden") === -1 && me(Z, e.now) === 0 && (e.todayDateElem = z, z.classList.add("today"), z.setAttribute("aria-current", "date")), I ? (z.tabIndex = -1, xl(Z) && (z.classList.add("selected"), e.selectedDateElem = z, e.config.mode === "range" && (qt(z, "startRange", e.selectedDates[0] && me(Z, e.selectedDates[0], !0) === 0), qt(z, "endRange", e.selectedDates[1] && me(Z, e.selectedDates[1], !0) === 0), v === "nextMonthDay" && z.classList.add("inRange")))) : z.classList.add("flatpickr-disabled"), e.config.mode === "range" && Zg(Z) && !xl(Z) && z.classList.add("inRange"), e.weekNumbers && e.config.showMonths === 1 && v !== "prevMonthDay" && R % 7 === 6 && e.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + e.config.getWeek(Z) + "</span>"), Lt("onDayCreate", z), z;
24885
+ var I = wi(Z, !0), T = ht("span", v, Z.getDate().toString());
24886
+ return T.dateObj = Z, T.$i = R, T.setAttribute("aria-label", e.formatDate(Z, e.config.ariaDateFormat)), v.indexOf("hidden") === -1 && me(Z, e.now) === 0 && (e.todayDateElem = T, T.classList.add("today"), T.setAttribute("aria-current", "date")), I ? (T.tabIndex = -1, xl(Z) && (T.classList.add("selected"), e.selectedDateElem = T, e.config.mode === "range" && (te(T, "startRange", e.selectedDates[0] && me(Z, e.selectedDates[0], !0) === 0), te(T, "endRange", e.selectedDates[1] && me(Z, e.selectedDates[1], !0) === 0), v === "nextMonthDay" && T.classList.add("inRange")))) : T.classList.add("flatpickr-disabled"), e.config.mode === "range" && Zg(Z) && !xl(Z) && T.classList.add("inRange"), e.weekNumbers && e.config.showMonths === 1 && v !== "prevMonthDay" && R % 7 === 6 && e.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + e.config.getWeek(Z) + "</span>"), Lt("onDayCreate", T), T;
24883
24887
  }
24884
24888
  function G(v) {
24885
24889
  v.focus(), e.config.mode === "range" && xo(v);
24886
24890
  }
24887
24891
  function _(v) {
24888
24892
  for (var Z = v > 0 ? 0 : e.config.showMonths - 1, W = v > 0 ? e.config.showMonths : -1, R = Z; R != W; R += v)
24889
- for (var I = e.daysContainer.children[R], z = v > 0 ? 0 : I.children.length - 1, $ = v > 0 ? I.children.length : -1, O = z; O != $; O += v) {
24893
+ for (var I = e.daysContainer.children[R], T = v > 0 ? 0 : I.children.length - 1, $ = v > 0 ? I.children.length : -1, O = T; O != $; O += v) {
24890
24894
  var nt = I.children[O];
24891
24895
  if (nt.className.indexOf("hidden") === -1 && wi(nt.dateObj))
24892
24896
  return nt;
24893
24897
  }
24894
24898
  }
24895
24899
  function V(v, Z) {
24896
- for (var W = v.className.indexOf("Month") === -1 ? v.dateObj.getMonth() : e.currentMonth, R = Z > 0 ? e.config.showMonths : -1, I = Z > 0 ? 1 : -1, z = W - e.currentMonth; z != R; z += I)
24897
- for (var $ = e.daysContainer.children[z], O = W - e.currentMonth === z ? v.$i + Z : Z < 0 ? $.children.length - 1 : 0, nt = $.children.length, P = O; P >= 0 && P < nt && P != (Z > 0 ? nt : -1); P += I) {
24900
+ for (var W = v.className.indexOf("Month") === -1 ? v.dateObj.getMonth() : e.currentMonth, R = Z > 0 ? e.config.showMonths : -1, I = Z > 0 ? 1 : -1, T = W - e.currentMonth; T != R; T += I)
24901
+ for (var $ = e.daysContainer.children[T], O = W - e.currentMonth === T ? v.$i + Z : Z < 0 ? $.children.length - 1 : 0, nt = $.children.length, P = O; P >= 0 && P < nt && P != (Z > 0 ? nt : -1); P += I) {
24898
24902
  var U = $.children[P];
24899
24903
  if (U.className.indexOf("hidden") === -1 && wi(U.dateObj) && Math.abs(v.$i - P) >= Math.abs(Z))
24900
24904
  return G(U);
@@ -24906,14 +24910,14 @@ function qS(n, t) {
24906
24910
  I === void 0 ? e._input.focus() : R ? V(I, Z) : G(I);
24907
24911
  }
24908
24912
  function K(v, Z) {
24909
- for (var W = (new Date(v, Z, 1).getDay() - e.l10n.firstDayOfWeek + 7) % 7, R = e.utils.getDaysInMonth((Z - 1 + 12) % 12, v), I = e.utils.getDaysInMonth(Z, v), z = window.document.createDocumentFragment(), $ = e.config.showMonths > 1, O = $ ? "prevMonthDay hidden" : "prevMonthDay", nt = $ ? "nextMonthDay hidden" : "nextMonthDay", P = R + 1 - W, U = 0; P <= R; P++, U++)
24910
- z.appendChild(S("flatpickr-day " + O, new Date(v, Z - 1, P), P, U));
24913
+ for (var W = (new Date(v, Z, 1).getDay() - e.l10n.firstDayOfWeek + 7) % 7, R = e.utils.getDaysInMonth((Z - 1 + 12) % 12, v), I = e.utils.getDaysInMonth(Z, v), T = window.document.createDocumentFragment(), $ = e.config.showMonths > 1, O = $ ? "prevMonthDay hidden" : "prevMonthDay", nt = $ ? "nextMonthDay hidden" : "nextMonthDay", P = R + 1 - W, U = 0; P <= R; P++, U++)
24914
+ T.appendChild(S("flatpickr-day " + O, new Date(v, Z - 1, P), P, U));
24911
24915
  for (P = 1; P <= I; P++, U++)
24912
- z.appendChild(S("flatpickr-day", new Date(v, Z, P), P, U));
24916
+ T.appendChild(S("flatpickr-day", new Date(v, Z, P), P, U));
24913
24917
  for (var yt = I + 1; yt <= 42 - W && (e.config.showMonths === 1 || U % 7 !== 0); yt++, U++)
24914
- z.appendChild(S("flatpickr-day " + nt, new Date(v, Z + 1, yt % I), yt, U));
24918
+ T.appendChild(S("flatpickr-day " + nt, new Date(v, Z + 1, yt % I), yt, U));
24915
24919
  var Qe = ht("div", "dayContainer");
24916
- return Qe.appendChild(z), Qe;
24920
+ return Qe.appendChild(T), Qe;
24917
24921
  }
24918
24922
  function H() {
24919
24923
  if (e.daysContainer !== void 0) {
@@ -24946,8 +24950,8 @@ function qS(n, t) {
24946
24950
  }), ot(), W = e.monthsDropdownContainer);
24947
24951
  var R = Do("cur-year", { tabindex: "-1" }), I = R.getElementsByTagName("input")[0];
24948
24952
  I.setAttribute("aria-label", e.l10n.yearAriaLabel), e.config.minDate && I.setAttribute("min", e.config.minDate.getFullYear().toString()), e.config.maxDate && (I.setAttribute("max", e.config.maxDate.getFullYear().toString()), I.disabled = !!e.config.minDate && e.config.minDate.getFullYear() === e.config.maxDate.getFullYear());
24949
- var z = ht("div", "flatpickr-current-month");
24950
- return z.appendChild(W), z.appendChild(R), Z.appendChild(z), v.appendChild(Z), {
24953
+ var T = ht("div", "flatpickr-current-month");
24954
+ return T.appendChild(W), T.appendChild(R), Z.appendChild(T), v.appendChild(Z), {
24951
24955
  container: v,
24952
24956
  yearElement: I,
24953
24957
  monthElement: W
@@ -24967,14 +24971,14 @@ function qS(n, t) {
24967
24971
  return e.__hidePrevMonthArrow;
24968
24972
  },
24969
24973
  set: function(v) {
24970
- e.__hidePrevMonthArrow !== v && (qt(e.prevMonthNav, "flatpickr-disabled", v), e.__hidePrevMonthArrow = v);
24974
+ e.__hidePrevMonthArrow !== v && (te(e.prevMonthNav, "flatpickr-disabled", v), e.__hidePrevMonthArrow = v);
24971
24975
  }
24972
24976
  }), Object.defineProperty(e, "_hideNextMonthArrow", {
24973
24977
  get: function() {
24974
24978
  return e.__hideNextMonthArrow;
24975
24979
  },
24976
24980
  set: function(v) {
24977
- e.__hideNextMonthArrow !== v && (qt(e.nextMonthNav, "flatpickr-disabled", v), e.__hideNextMonthArrow = v);
24981
+ e.__hideNextMonthArrow !== v && (te(e.nextMonthNav, "flatpickr-disabled", v), e.__hideNextMonthArrow = v);
24978
24982
  }
24979
24983
  }), e.currentYearElement = e.yearElements[0], ko(), e.monthNav;
24980
24984
  }
@@ -25033,8 +25037,8 @@ function qS(n, t) {
25033
25037
  }
25034
25038
  function Hn(v, Z) {
25035
25039
  if (v === void 0 && (v = !0), Z === void 0 && (Z = !0), e.input.value = "", e.altInput !== void 0 && (e.altInput.value = ""), e.mobileInput !== void 0 && (e.mobileInput.value = ""), e.selectedDates = [], e.latestSelectedDateObj = void 0, Z === !0 && (e.currentYear = e._initialDate.getFullYear(), e.currentMonth = e._initialDate.getMonth()), e.config.enableTime === !0) {
25036
- var W = tc(e.config), R = W.hours, I = W.minutes, z = W.seconds;
25037
- f(R, I, z);
25040
+ var W = tc(e.config), R = W.hours, I = W.minutes, T = W.seconds;
25041
+ f(R, I, T);
25038
25042
  }
25039
25043
  e.redraw(), v && Lt("onChange");
25040
25044
  }
@@ -25099,10 +25103,10 @@ function qS(n, t) {
25099
25103
  }
25100
25104
  function Ne(v) {
25101
25105
  if (e.isOpen && !e.config.inline) {
25102
- var Z = pe(v), W = Ce(Z), R = Z === e.input || Z === e.altInput || e.element.contains(Z) || v.path && v.path.indexOf && (~v.path.indexOf(e.input) || ~v.path.indexOf(e.altInput)), I = !R && !W && !Ce(v.relatedTarget), z = !e.config.ignoredFocusElements.some(function($) {
25106
+ var Z = pe(v), W = Ce(Z), R = Z === e.input || Z === e.altInput || e.element.contains(Z) || v.path && v.path.indexOf && (~v.path.indexOf(e.input) || ~v.path.indexOf(e.altInput)), I = !R && !W && !Ce(v.relatedTarget), T = !e.config.ignoredFocusElements.some(function($) {
25103
25107
  return $.contains(Z);
25104
25108
  });
25105
- I && z && (e.config.allowInput && e.setDate(e._input.value, !1, e.config.altInput ? e.config.altFormat : e.config.dateFormat), e.timeContainer !== void 0 && e.minuteElement !== void 0 && e.hourElement !== void 0 && e.input.value !== "" && e.input.value !== void 0 && l(), e.close(), e.config && e.config.mode === "range" && e.selectedDates.length === 1 && e.clear(!1));
25109
+ I && T && (e.config.allowInput && e.setDate(e._input.value, !1, e.config.altInput ? e.config.altFormat : e.config.dateFormat), e.timeContainer !== void 0 && e.minuteElement !== void 0 && e.hourElement !== void 0 && e.input.value !== "" && e.input.value !== void 0 && l(), e.close(), e.config && e.config.mode === "range" && e.selectedDates.length === 1 && e.clear(!1));
25106
25110
  }
25107
25111
  }
25108
25112
  function yo(v) {
@@ -25121,8 +25125,8 @@ function qS(n, t) {
25121
25125
  return !0;
25122
25126
  if (R === void 0)
25123
25127
  return !1;
25124
- for (var I = !!e.config.enable, z = (W = e.config.enable) !== null && W !== void 0 ? W : e.config.disable, $ = 0, O = void 0; $ < z.length; $++) {
25125
- if (O = z[$], typeof O == "function" && O(R))
25128
+ for (var I = !!e.config.enable, T = (W = e.config.enable) !== null && W !== void 0 ? W : e.config.disable, $ = 0, O = void 0; $ < T.length; $++) {
25129
+ if (O = T[$], typeof O == "function" && O(R))
25126
25130
  return I;
25127
25131
  if (O instanceof Date && R !== void 0 && O.getTime() === R.getTime())
25128
25132
  return I;
@@ -25142,12 +25146,12 @@ function qS(n, t) {
25142
25146
  Z && W && !(v.relatedTarget && Ce(v.relatedTarget)) && e.setDate(e._input.value, !0, v.target === e.altInput ? e.config.altFormat : e.config.dateFormat);
25143
25147
  }
25144
25148
  function qd(v) {
25145
- var Z = pe(v), W = e.config.wrap ? n.contains(Z) : Z === e._input, R = e.config.allowInput, I = e.isOpen && (!R || !W), z = e.config.inline && W && !R;
25149
+ var Z = pe(v), W = e.config.wrap ? n.contains(Z) : Z === e._input, R = e.config.allowInput, I = e.isOpen && (!R || !W), T = e.config.inline && W && !R;
25146
25150
  if (v.keyCode === 13 && W) {
25147
25151
  if (R)
25148
25152
  return e.setDate(e._input.value, !0, Z === e.altInput ? e.config.altFormat : e.config.dateFormat), e.close(), Z.blur();
25149
25153
  e.open();
25150
- } else if (Ce(Z) || I || z) {
25154
+ } else if (Ce(Z) || I || T) {
25151
25155
  var $ = !!e.timeContainer && e.timeContainer.contains(Z);
25152
25156
  switch (v.keyCode) {
25153
25157
  case 13:
@@ -25210,8 +25214,8 @@ function qS(n, t) {
25210
25214
  }
25211
25215
  function xo(v, Z) {
25212
25216
  if (Z === void 0 && (Z = "flatpickr-day"), !(e.selectedDates.length !== 1 || v && (!v.classList.contains(Z) || v.classList.contains("flatpickr-disabled")))) {
25213
- for (var W = v ? v.dateObj.getTime() : e.days.firstElementChild.dateObj.getTime(), R = e.parseDate(e.selectedDates[0], void 0, !0).getTime(), I = Math.min(W, e.selectedDates[0].getTime()), z = Math.max(W, e.selectedDates[0].getTime()), $ = !1, O = 0, nt = 0, P = I; P < z; P += QS.DAY)
25214
- wi(new Date(P), !0) || ($ = $ || P > I && P < z, P < R && (!O || P > O) ? O = P : P > R && (!nt || P < nt) && (nt = P));
25217
+ for (var W = v ? v.dateObj.getTime() : e.days.firstElementChild.dateObj.getTime(), R = e.parseDate(e.selectedDates[0], void 0, !0).getTime(), I = Math.min(W, e.selectedDates[0].getTime()), T = Math.max(W, e.selectedDates[0].getTime()), $ = !1, O = 0, nt = 0, P = I; P < T; P += QS.DAY)
25218
+ wi(new Date(P), !0) || ($ = $ || P > I && P < T, P < R && (!O || P > O) ? O = P : P > R && (!nt || P < nt) && (nt = P));
25215
25219
  var U = Array.from(e.rContainer.querySelectorAll("*:nth-child(-n+" + e.config.showMonths + ") > ." + Z));
25216
25220
  U.forEach(function(yt) {
25217
25221
  var Qe = yt.dateObj, fe = Qe.getTime(), es = O > 0 && fe < O || nt > 0 && fe > nt;
@@ -25293,8 +25297,8 @@ function qS(n, t) {
25293
25297
  W.dateFormat = Z.noCalendar || R ? "H:i" + (Z.enableSeconds ? ":S" : "") : I + " H:i" + (Z.enableSeconds ? ":S" : "");
25294
25298
  }
25295
25299
  if (Z.altInput && (Z.enableTime || R) && !Z.altFormat) {
25296
- var z = Nt.defaultConfig.altFormat || Rr.altFormat;
25297
- W.altFormat = Z.noCalendar || R ? "h:i" + (Z.enableSeconds ? ":S K" : " K") : z + (" h:i" + (Z.enableSeconds ? ":S" : "") + " K");
25300
+ var T = Nt.defaultConfig.altFormat || Rr.altFormat;
25301
+ W.altFormat = Z.noCalendar || R ? "h:i" + (Z.enableSeconds ? ":S K" : " K") : T + (" h:i" + (Z.enableSeconds ? ":S" : "") + " K");
25298
25302
  }
25299
25303
  Object.defineProperty(e.config, "minDate", {
25300
25304
  get: function() {
@@ -25352,12 +25356,12 @@ function qS(n, t) {
25352
25356
  Lt("onPreCalendarPosition");
25353
25357
  var Z = v || e._positionElement, W = Array.prototype.reduce.call(e.calendarContainer.children, function(Yg, Vg) {
25354
25358
  return Yg + Vg.offsetHeight;
25355
- }, 0), R = e.calendarContainer.offsetWidth, I = e.config.position.split(" "), z = I[0], $ = I.length > 1 ? I[1] : null, O = Z.getBoundingClientRect(), nt = window.innerHeight - O.bottom, P = z === "above" || z !== "below" && nt < W && O.top > W, U = window.pageYOffset + O.top + (P ? -W - 2 : Z.offsetHeight + 2);
25356
- if (qt(e.calendarContainer, "arrowTop", !P), qt(e.calendarContainer, "arrowBottom", P), !e.config.inline) {
25359
+ }, 0), R = e.calendarContainer.offsetWidth, I = e.config.position.split(" "), T = I[0], $ = I.length > 1 ? I[1] : null, O = Z.getBoundingClientRect(), nt = window.innerHeight - O.bottom, P = T === "above" || T !== "below" && nt < W && O.top > W, U = window.pageYOffset + O.top + (P ? -W - 2 : Z.offsetHeight + 2);
25360
+ if (te(e.calendarContainer, "arrowTop", !P), te(e.calendarContainer, "arrowBottom", P), !e.config.inline) {
25357
25361
  var yt = window.pageXOffset + O.left, Qe = !1, fe = !1;
25358
- $ === "center" ? (yt -= (R - O.width) / 2, Qe = !0) : $ === "right" && (yt -= R - O.width, fe = !0), qt(e.calendarContainer, "arrowLeft", !Qe && !fe), qt(e.calendarContainer, "arrowCenter", Qe), qt(e.calendarContainer, "arrowRight", fe);
25362
+ $ === "center" ? (yt -= (R - O.width) / 2, Qe = !0) : $ === "right" && (yt -= R - O.width, fe = !0), te(e.calendarContainer, "arrowLeft", !Qe && !fe), te(e.calendarContainer, "arrowCenter", Qe), te(e.calendarContainer, "arrowRight", fe);
25359
25363
  var es = window.document.body.offsetWidth - (window.pageXOffset + O.right), hr = yt + R > window.document.body.offsetWidth, Xg = es + R > window.document.body.offsetWidth;
25360
- if (qt(e.calendarContainer, "rightMost", hr), !e.config.static)
25364
+ if (te(e.calendarContainer, "rightMost", hr), !e.config.static)
25361
25365
  if (e.calendarContainer.style.top = U + "px", !hr)
25362
25366
  e.calendarContainer.style.left = yt + "px", e.calendarContainer.style.right = "auto";
25363
25367
  else if (!Xg)
@@ -25367,7 +25371,7 @@ function qS(n, t) {
25367
25371
  if (wl === void 0)
25368
25372
  return;
25369
25373
  var _g = window.document.body.offsetWidth, Wg = Math.max(0, _g / 2 - R / 2), Sg = ".flatpickr-calendar.centerMost:before", Gg = ".flatpickr-calendar.centerMost:after", Rg = wl.cssRules.length, Lg = "{left:" + O.left + "px;right:auto;}";
25370
- qt(e.calendarContainer, "rightMost", !1), qt(e.calendarContainer, "centerMost", !0), wl.insertRule(Sg + "," + Gg + Lg, Rg), e.calendarContainer.style.left = Wg + "px", e.calendarContainer.style.right = "auto";
25374
+ te(e.calendarContainer, "rightMost", !1), te(e.calendarContainer, "centerMost", !0), wl.insertRule(Sg + "," + Gg + Lg, Rg), e.calendarContainer.style.left = Wg + "px", e.calendarContainer.style.right = "auto";
25371
25375
  }
25372
25376
  }
25373
25377
  }
@@ -25403,7 +25407,7 @@ function qS(n, t) {
25403
25407
  return U.classList && U.classList.contains("flatpickr-day") && !U.classList.contains("flatpickr-disabled") && !U.classList.contains("notAllowed");
25404
25408
  }, W = sg(pe(v), Z);
25405
25409
  if (W !== void 0) {
25406
- var R = W, I = e.latestSelectedDateObj = new Date(R.dateObj.getTime()), z = (I.getMonth() < e.currentMonth || I.getMonth() > e.currentMonth + e.config.showMonths - 1) && e.config.mode !== "range";
25410
+ var R = W, I = e.latestSelectedDateObj = new Date(R.dateObj.getTime()), T = (I.getMonth() < e.currentMonth || I.getMonth() > e.currentMonth + e.config.showMonths - 1) && e.config.mode !== "range";
25407
25411
  if (e.selectedDateElem = R, e.config.mode === "single")
25408
25412
  e.selectedDates = [I];
25409
25413
  else if (e.config.mode === "multiple") {
@@ -25412,11 +25416,11 @@ function qS(n, t) {
25412
25416
  } else e.config.mode === "range" && (e.selectedDates.length === 2 && e.clear(!1, !1), e.latestSelectedDateObj = I, e.selectedDates.push(I), me(I, e.selectedDates[0], !0) !== 0 && e.selectedDates.sort(function(U, yt) {
25413
25417
  return U.getTime() - yt.getTime();
25414
25418
  }));
25415
- if (u(), z) {
25419
+ if (u(), T) {
25416
25420
  var O = e.currentYear !== I.getFullYear();
25417
25421
  e.currentYear = I.getFullYear(), e.currentMonth = I.getMonth(), O && (Lt("onYearChange"), ot()), Lt("onMonthChange");
25418
25422
  }
25419
- if (ko(), H(), yn(), !z && e.config.mode !== "range" && e.config.showMonths === 1 ? G(R) : e.selectedDateElem !== void 0 && e.hourElement === void 0 && e.selectedDateElem && e.selectedDateElem.focus(), e.hourElement !== void 0 && e.hourElement !== void 0 && e.hourElement.focus(), e.config.closeOnSelect) {
25423
+ if (ko(), H(), yn(), !T && e.config.mode !== "range" && e.config.showMonths === 1 ? G(R) : e.selectedDateElem !== void 0 && e.hourElement === void 0 && e.selectedDateElem && e.selectedDateElem.focus(), e.hourElement !== void 0 && e.hourElement !== void 0 && e.hourElement.focus(), e.config.closeOnSelect) {
25420
25424
  var nt = e.config.mode === "single" && !e.config.enableTime, P = e.config.mode === "range" && e.selectedDates.length === 2 && !e.config.enableTime;
25421
25425
  (nt || P) && yl();
25422
25426
  }
@@ -25576,10 +25580,10 @@ function qS(n, t) {
25576
25580
  v.preventDefault();
25577
25581
  var Z = v.type === "keydown", W = pe(v), R = W;
25578
25582
  e.amPM !== void 0 && W === e.amPM && (e.amPM.textContent = e.l10n.amPM[We(e.amPM.textContent === e.l10n.amPM[0])]);
25579
- var I = parseFloat(R.getAttribute("min")), z = parseFloat(R.getAttribute("max")), $ = parseFloat(R.getAttribute("step")), O = parseInt(R.value, 10), nt = v.delta || (Z ? v.which === 38 ? 1 : -1 : 0), P = O + $ * nt;
25583
+ var I = parseFloat(R.getAttribute("min")), T = parseFloat(R.getAttribute("max")), $ = parseFloat(R.getAttribute("step")), O = parseInt(R.value, 10), nt = v.delta || (Z ? v.which === 38 ? 1 : -1 : 0), P = O + $ * nt;
25580
25584
  if (typeof R.value < "u" && R.value.length === 2) {
25581
25585
  var U = R === e.hourElement, yt = R === e.minuteElement;
25582
- P < I ? (P = z + P + We(!U) + (We(U) && We(!e.amPM)), yt && k(void 0, -1, e.hourElement)) : P > z && (P = R === e.hourElement ? P - z - We(!e.amPM) : I, yt && k(void 0, 1, e.hourElement)), e.amPM && U && ($ === 1 ? P + O === 23 : Math.abs(P - O) > $) && (e.amPM.textContent = e.l10n.amPM[We(e.amPM.textContent === e.l10n.amPM[0])]), R.value = ae(P);
25586
+ P < I ? (P = T + P + We(!U) + (We(U) && We(!e.amPM)), yt && k(void 0, -1, e.hourElement)) : P > T && (P = R === e.hourElement ? P - T - We(!e.amPM) : I, yt && k(void 0, 1, e.hourElement)), e.amPM && U && ($ === 1 ? P + O === 23 : Math.abs(P - O) > $) && (e.amPM.textContent = e.l10n.amPM[We(e.amPM.textContent === e.l10n.amPM[0])]), R.value = ae(P);
25583
25587
  }
25584
25588
  }
25585
25589
  return r(), e;
@@ -25638,7 +25642,7 @@ const ag = (n) => n.map((t) => ({ label: t.label, value: t.label })), lg = (n, t
25638
25642
  dateTo: new Date(s.dateTo ?? i)
25639
25643
  } : r;
25640
25644
  };
25641
- function tG(n, t, e, i, r) {
25645
+ function t5(n, t, e, i, r) {
25642
25646
  var a;
25643
25647
  if (Oo(t) && Oo(e)) {
25644
25648
  const l = ag(r), c = (a = l.find((h) => h.value === n)) == null ? void 0 : a.value;
@@ -25675,7 +25679,7 @@ function tG(n, t, e, i, r) {
25675
25679
  function Oo(n) {
25676
25680
  return n === void 0 || n === "";
25677
25681
  }
25678
- const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size: { width: n, height: "3rem" }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: { width: n }, children: /* @__PURE__ */ m(nG, { ...t }) }) }), nG = ({
25682
+ const ls = "Custom", e5 = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size: { width: n, height: "3rem" }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: { width: n }, children: /* @__PURE__ */ m(n5, { ...t }) }) }), n5 = ({
25679
25683
  dateRangeOptions: n,
25680
25684
  earliestDate: t = "1900-01-01",
25681
25685
  initialValue: e,
@@ -25683,7 +25687,7 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
25683
25687
  initialDateFrom: r,
25684
25688
  initialDateTo: s
25685
25689
  }) => {
25686
- const o = tG(
25690
+ const o = t5(
25687
25691
  e,
25688
25692
  r,
25689
25693
  s,
@@ -25695,7 +25699,7 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
25695
25699
  dateFrom: o.initialSelectedDateFrom,
25696
25700
  dateTo: o.initialSelectedDateTo
25697
25701
  });
25698
- ie(() => {
25702
+ Qt(() => {
25699
25703
  const G = {
25700
25704
  allowInput: !0,
25701
25705
  dateFormat: "Y-m-d"
@@ -25797,10 +25801,10 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
25797
25801
  ] })
25798
25802
  ] });
25799
25803
  };
25800
- var iG = Object.defineProperty, rG = Object.getOwnPropertyDescriptor, xi = (n, t, e, i) => {
25801
- for (var r = i > 1 ? void 0 : i ? rG(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25804
+ var i5 = Object.defineProperty, r5 = Object.getOwnPropertyDescriptor, xi = (n, t, e, i) => {
25805
+ for (var r = i > 1 ? void 0 : i ? r5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25802
25806
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
25803
- return i && r && iG(t, e, r), r;
25807
+ return i && r && i5(t, e, r), r;
25804
25808
  };
25805
25809
  let Cn = class extends Ye {
25806
25810
  constructor() {
@@ -25808,7 +25812,7 @@ let Cn = class extends Ye {
25808
25812
  }
25809
25813
  render() {
25810
25814
  return /* @__PURE__ */ m(
25811
- eG,
25815
+ e5,
25812
25816
  {
25813
25817
  dateRangeOptions: this.dateRangeOptions,
25814
25818
  earliestDate: this.earliestDate,
@@ -25845,13 +25849,13 @@ xi([
25845
25849
  Cn = xi([
25846
25850
  ke("gs-date-range-selector")
25847
25851
  ], Cn);
25848
- async function sG(n, t, e) {
25852
+ async function s5(n, t, e) {
25849
25853
  const i = Array(n.length - 1).fill(0).map((a, l) => l + 1).map((a) => n.slice(a).reduce((l, c) => ({ ...l, [c]: null }), {}));
25850
25854
  return [...(await new er({}, n).evaluate(t, e)).content.map((a) => n.reduce((l, c) => ({ ...l, [c]: a[c] }), {})).reduce((a, l) => (a.add(JSON.stringify(l)), i.forEach((c) => {
25851
25855
  a.add(JSON.stringify({ ...l, ...c }));
25852
- }), a), /* @__PURE__ */ new Set())].map((a) => JSON.parse(a)).sort(oG(n));
25856
+ }), a), /* @__PURE__ */ new Set())].map((a) => JSON.parse(a)).sort(o5(n));
25853
25857
  }
25854
- function oG(n) {
25858
+ function o5(n) {
25855
25859
  return (t, e) => {
25856
25860
  for (const i of n) {
25857
25861
  const r = t[i], s = e[i];
@@ -25861,11 +25865,11 @@ function oG(n) {
25861
25865
  return 0;
25862
25866
  };
25863
25867
  }
25864
- const aG = ({ width: n, ...t }) => {
25868
+ const a5 = ({ width: n, ...t }) => {
25865
25869
  const e = { width: n, height: "3rem" };
25866
- return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(lG, { ...t }) }) });
25867
- }, lG = ({ initialValue: n, fields: t, placeholderText: e }) => {
25868
- const i = Ct(jt), [r, s] = it(n ?? ""), [o, a] = it(!1), l = Mt(null), { data: c, error: d, isLoading: u } = Nn(() => sG(t, i), [t, i]);
25870
+ return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(l5, { ...t }) }) });
25871
+ }, l5 = ({ initialValue: n, fields: t, placeholderText: e }) => {
25872
+ const i = Ct(jt), [r, s] = it(n ?? ""), [o, a] = it(!1), l = Mt(null), { data: c, error: d, isLoading: u } = Nn(() => s5(t, i), [t, i]);
25869
25873
  if (u)
25870
25874
  return /* @__PURE__ */ m(Ue, {});
25871
25875
  if (d)
@@ -25882,8 +25886,8 @@ const aG = ({ width: n, ...t }) => {
25882
25886
  const p = f.currentTarget.value;
25883
25887
  if (s(p), p.trim() === r.trim() && p !== "")
25884
25888
  return;
25885
- const b = cG(p, t);
25886
- dG(b) || uG(c, b) ? ((g = l.current) == null || g.dispatchEvent(
25889
+ const b = c5(p, t);
25890
+ d5(b) || u5(c, b) ? ((g = l.current) == null || g.dispatchEvent(
25887
25891
  new CustomEvent("gs-location-changed", {
25888
25892
  detail: b,
25889
25893
  bubbles: !0,
@@ -25900,16 +25904,16 @@ const aG = ({ width: n, ...t }) => {
25900
25904
  return /* @__PURE__ */ m("option", { value: p }, p);
25901
25905
  }) })
25902
25906
  ] });
25903
- }, cG = (n, t) => {
25907
+ }, c5 = (n, t) => {
25904
25908
  if (n === "")
25905
25909
  return t.reduce((i, r) => ({ ...i, [r]: void 0 }), {});
25906
25910
  const e = n.split("/").map((i) => i.trim());
25907
25911
  return t.reduce((i, r, s) => ({ ...i, [r]: e[s] }), {});
25908
- }, dG = (n) => Object.values(n).every((t) => t === void 0), uG = (n, t) => n === null ? !1 : Object.entries(t).filter(([, i]) => i !== void 0).reduce((i, [r, s]) => i.filter((o) => o[r] === s), n).length > 0;
25909
- var hG = Object.defineProperty, fG = Object.getOwnPropertyDescriptor, mo = (n, t, e, i) => {
25910
- for (var r = i > 1 ? void 0 : i ? fG(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25912
+ }, d5 = (n) => Object.values(n).every((t) => t === void 0), u5 = (n, t) => n === null ? !1 : Object.entries(t).filter(([, i]) => i !== void 0).reduce((i, [r, s]) => i.filter((o) => o[r] === s), n).length > 0;
25913
+ var h5 = Object.defineProperty, f5 = Object.getOwnPropertyDescriptor, mo = (n, t, e, i) => {
25914
+ for (var r = i > 1 ? void 0 : i ? f5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25911
25915
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
25912
- return i && r && hG(t, e, r), r;
25916
+ return i && r && h5(t, e, r), r;
25913
25917
  };
25914
25918
  let Kr = class extends Ye {
25915
25919
  constructor() {
@@ -25917,7 +25921,7 @@ let Kr = class extends Ye {
25917
25921
  }
25918
25922
  render() {
25919
25923
  return /* @__PURE__ */ m(
25920
- aG,
25924
+ a5,
25921
25925
  {
25922
25926
  initialValue: this.initialValue,
25923
25927
  fields: this.fields,
@@ -25942,14 +25946,14 @@ mo([
25942
25946
  Kr = mo([
25943
25947
  ke("gs-location-filter")
25944
25948
  ], Kr);
25945
- async function pG(n, t, e) {
25949
+ async function p5(n, t, e) {
25946
25950
  return (await new er({}, [t]).evaluate(n, e)).content.map((s) => s[t]);
25947
25951
  }
25948
- const mG = ({ width: n, ...t }) => {
25952
+ const m5 = ({ width: n, ...t }) => {
25949
25953
  const e = { width: n, height: "3rem" };
25950
- return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(bG, { ...t }) }) });
25951
- }, bG = ({ lapisField: n, placeholderText: t, initialValue: e }) => {
25952
- const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(() => pG(i, n), [n, i]);
25954
+ return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(b5, { ...t }) }) });
25955
+ }, b5 = ({ lapisField: n, placeholderText: t, initialValue: e }) => {
25956
+ const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(() => p5(i, n), [n, i]);
25953
25957
  if (a)
25954
25958
  return /* @__PURE__ */ m(Ue, {});
25955
25959
  if (o !== null)
@@ -25983,10 +25987,10 @@ const mG = ({ width: n, ...t }) => {
25983
25987
  /* @__PURE__ */ m("datalist", { id: n, children: s.map((d) => /* @__PURE__ */ m("option", { value: d }, d)) })
25984
25988
  ] });
25985
25989
  };
25986
- var gG = Object.defineProperty, yG = Object.getOwnPropertyDescriptor, bo = (n, t, e, i) => {
25987
- for (var r = i > 1 ? void 0 : i ? yG(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25990
+ var g5 = Object.defineProperty, y5 = Object.getOwnPropertyDescriptor, bo = (n, t, e, i) => {
25991
+ for (var r = i > 1 ? void 0 : i ? y5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
25988
25992
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
25989
- return i && r && gG(t, e, r), r;
25993
+ return i && r && g5(t, e, r), r;
25990
25994
  };
25991
25995
  let jr = class extends Ye {
25992
25996
  constructor() {
@@ -25994,7 +25998,7 @@ let jr = class extends Ye {
25994
25998
  }
25995
25999
  render() {
25996
26000
  return /* @__PURE__ */ m(
25997
- mG,
26001
+ m5,
25998
26002
  {
25999
26003
  lapisField: this.lapisField,
26000
26004
  placeholderText: this.placeholderText,
@@ -26019,20 +26023,20 @@ bo([
26019
26023
  jr = bo([
26020
26024
  ke("gs-text-input")
26021
26025
  ], jr);
26022
- const vG = ({ children: n }) => {
26026
+ const v5 = ({ children: n }) => {
26023
26027
  const t = Ct(Ur);
26024
- return xG(t) ? /* @__PURE__ */ m("div", { className: "laoding loading-spinner loading-md", children: "Loading..." }) : /* @__PURE__ */ m(Gt, { children: n });
26028
+ return x5(t) ? /* @__PURE__ */ m("div", { className: "laoding loading-spinner loading-md", children: "Loading..." }) : /* @__PURE__ */ m(Gt, { children: n });
26025
26029
  };
26026
- function xG(n) {
26030
+ function x5(n) {
26027
26031
  return n.nucleotideSequences.length === 0 && n.genes.length === 0;
26028
26032
  }
26029
- const ZG = () => {
26033
+ const Z5 = () => {
26030
26034
  const n = Ct(Ur), t = n.genes[0].name;
26031
26035
  return /* @__PURE__ */ m(bi, { children: [
26032
26036
  /* @__PURE__ */ m(gi, { children: " Mutation Filter" }),
26033
26037
  /* @__PURE__ */ m(pt, { children: "This component allows you to filter for mutations at specific positions." }),
26034
26038
  /* @__PURE__ */ m(qe, { children: " Nucleotide Mutations and Insertions" }),
26035
- wp(n) ? /* @__PURE__ */ m(wG, {}) : /* @__PURE__ */ m(kG, {}),
26039
+ wp(n) ? /* @__PURE__ */ m(w5, {}) : /* @__PURE__ */ m(k5, {}),
26036
26040
  /* @__PURE__ */ m(qe, { children: "Amino Acid Mutations and Insertions" }),
26037
26041
  /* @__PURE__ */ m(pt, { children: [
26038
26042
  "An amino acid mutation has the format ",
@@ -26126,7 +26130,7 @@ const ZG = () => {
26126
26130
  " to filter for sequences for which it is confirmed that no mutation occurred, i.e. has the same base as the reference genome at the specified position."
26127
26131
  ] })
26128
26132
  ] });
26129
- }, wG = () => /* @__PURE__ */ m(Gt, { children: [
26133
+ }, w5 = () => /* @__PURE__ */ m(Gt, { children: [
26130
26134
  /* @__PURE__ */ m(pt, { children: [
26131
26135
  "This organism is single-segmented. Thus, nucleotide mutations have the format",
26132
26136
  " ",
@@ -26168,7 +26172,7 @@ const ZG = () => {
26168
26172
  /* @__PURE__ */ m("b", { children: "ins_1046:A" }),
26169
26173
  " would filter for sequences with an insertion of A between the positions 1046 and 1047 in the nucleotide sequence."
26170
26174
  ] })
26171
- ] }), kG = () => {
26175
+ ] }), k5 = () => {
26172
26176
  const n = Ct(Ur), t = n.nucleotideSequences[0].name;
26173
26177
  return /* @__PURE__ */ m(Gt, { children: [
26174
26178
  /* @__PURE__ */ m(pt, { children: [
@@ -26234,9 +26238,10 @@ const ZG = () => {
26234
26238
  }, ec = (n, t) => {
26235
26239
  if (n === void 0)
26236
26240
  return wp(t) ? "nucleotide" : void 0;
26237
- if (t.nucleotideSequences.some((e) => e.name === n))
26241
+ const e = n.toLowerCase();
26242
+ if (t.nucleotideSequences.some((i) => i.name.toLowerCase() === e))
26238
26243
  return "nucleotide";
26239
- if (t.genes.some((e) => e.name === n))
26244
+ if (t.genes.some((i) => i.name.toLowerCase() === e))
26240
26245
  return "amino acid";
26241
26246
  }, Ac = (n, t) => {
26242
26247
  const e = Bs.parse(n);
@@ -26270,9 +26275,9 @@ const ZG = () => {
26270
26275
  return null;
26271
26276
  }
26272
26277
  return null;
26273
- }, XG = ({ initialValue: n, width: t }) => /* @__PURE__ */ m(Me, { size: { height: "3.375rem", width: t }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: t, children: /* @__PURE__ */ m(_G, { initialValue: n }) }) }), _G = ({ initialValue: n }) => {
26278
+ }, X5 = ({ initialValue: n, width: t }) => /* @__PURE__ */ m(Me, { size: { height: "3.375rem", width: t }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: t, children: /* @__PURE__ */ m(_5, { initialValue: n }) }) }), _5 = ({ initialValue: n }) => {
26274
26279
  const t = Ct(Ur), [e, i] = it(
26275
- WG(n, t)
26280
+ W5(n, t)
26276
26281
  ), r = Mt(null), s = (a) => {
26277
26282
  const l = {
26278
26283
  ...e,
@@ -26281,7 +26286,7 @@ const ZG = () => {
26281
26286
  i(l), o(l);
26282
26287
  }, o = (a) => {
26283
26288
  var c;
26284
- const l = VG(a);
26289
+ const l = V5(a);
26285
26290
  (c = r.current) == null || c.dispatchEvent(
26286
26291
  new CustomEvent("gs-mutation-filter-changed", {
26287
26292
  detail: l,
@@ -26291,10 +26296,10 @@ const ZG = () => {
26291
26296
  );
26292
26297
  };
26293
26298
  return /* @__PURE__ */ m("div", { className: "w-full border border-gray-300 rounded-md relative", ref: r, children: [
26294
- /* @__PURE__ */ m("div", { className: "absolute -top-3 -right-3 z-10", children: /* @__PURE__ */ m(ZG, {}) }),
26299
+ /* @__PURE__ */ m("div", { className: "absolute -top-3 -right-3 z-10", children: /* @__PURE__ */ m(Z5, {}) }),
26295
26300
  /* @__PURE__ */ m("div", { className: "relative w-full p-1", children: [
26296
26301
  /* @__PURE__ */ m(
26297
- SG,
26302
+ S5,
26298
26303
  {
26299
26304
  referenceGenome: t,
26300
26305
  setSelectedFilters: (a) => {
@@ -26304,7 +26309,7 @@ const ZG = () => {
26304
26309
  }
26305
26310
  ),
26306
26311
  /* @__PURE__ */ m(
26307
- YG,
26312
+ Y5,
26308
26313
  {
26309
26314
  selectedFilters: e,
26310
26315
  handleRemoveValue: s
@@ -26313,7 +26318,7 @@ const ZG = () => {
26313
26318
  ] })
26314
26319
  ] });
26315
26320
  };
26316
- function WG(n, t) {
26321
+ function W5(n, t) {
26317
26322
  return n === void 0 ? {
26318
26323
  nucleotideMutations: [],
26319
26324
  aminoAcidMutations: [],
@@ -26335,7 +26340,7 @@ function WG(n, t) {
26335
26340
  }
26336
26341
  );
26337
26342
  }
26338
- const SG = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) => {
26343
+ const S5 = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) => {
26339
26344
  const [i, r] = it(null), [s, o] = it(""), a = Mt(null), l = (f) => {
26340
26345
  if (f.includes(",") || f.includes(";"))
26341
26346
  c(f);
@@ -26384,7 +26389,7 @@ const SG = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) =
26384
26389
  {
26385
26390
  type: "text",
26386
26391
  className: "w-full p-2 border-gray-300 border rounded-md",
26387
- placeholder: GG(n),
26392
+ placeholder: G5(n),
26388
26393
  value: s,
26389
26394
  onInput: (f) => {
26390
26395
  l(f.target.value);
@@ -26405,16 +26410,16 @@ const SG = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) =
26405
26410
  )
26406
26411
  ] });
26407
26412
  };
26408
- function GG(n) {
26413
+ function G5(n) {
26409
26414
  const t = n.nucleotideSequences.length > 1 ? `${n.nucleotideSequences[0].name}:` : "", e = n.genes[0].name;
26410
26415
  return `Enter a mutation (e.g. ${t}A123T, ins_${t}123:AT, ${e}:M123E, ins_${e}:123:ME)`;
26411
26416
  }
26412
- const RG = {
26417
+ const R5 = {
26413
26418
  aminoAcidMutations: ye("teal", 0.4),
26414
26419
  nucleotideMutations: ye("green", 0.4),
26415
26420
  aminoAcidInsertions: ye("purple", 0.4),
26416
26421
  nucleotideInsertions: ye("indigo", 0.4)
26417
- }, LG = (n) => RG[n.type] || "lightgray", YG = ({ selectedFilters: n, handleRemoveValue: t }) => /* @__PURE__ */ m("div", { className: "flex flex-wrap", children: [
26422
+ }, L5 = (n) => R5[n.type] || "lightgray", Y5 = ({ selectedFilters: n, handleRemoveValue: t }) => /* @__PURE__ */ m("div", { className: "flex flex-wrap", children: [
26418
26423
  n.nucleotideMutations.map((e) => /* @__PURE__ */ m(
26419
26424
  Ko,
26420
26425
  {
@@ -26453,7 +26458,7 @@ const RG = {
26453
26458
  name: t.value.toString(),
26454
26459
  className: "center p-2 m-1 inline-flex text-black rounded-md",
26455
26460
  style: {
26456
- backgroundColor: LG(t)
26461
+ backgroundColor: L5(t)
26457
26462
  },
26458
26463
  children: [
26459
26464
  t.value.toString(),
@@ -26462,7 +26467,7 @@ const RG = {
26462
26467
  },
26463
26468
  t.value.toString()
26464
26469
  );
26465
- function VG(n) {
26470
+ function V5(n) {
26466
26471
  return {
26467
26472
  aminoAcidMutations: n.aminoAcidMutations.map((t) => t.toString()),
26468
26473
  nucleotideMutations: n.nucleotideMutations.map((t) => t.toString()),
@@ -26470,17 +26475,17 @@ function VG(n) {
26470
26475
  nucleotideInsertions: n.nucleotideInsertions.map((t) => t.toString())
26471
26476
  };
26472
26477
  }
26473
- var IG = Object.defineProperty, MG = Object.getOwnPropertyDescriptor, Ud = (n, t, e, i) => {
26474
- for (var r = i > 1 ? void 0 : i ? MG(t, e) : t, s = n.length - 1, o; s >= 0; s--)
26478
+ var I5 = Object.defineProperty, M5 = Object.getOwnPropertyDescriptor, Ud = (n, t, e, i) => {
26479
+ for (var r = i > 1 ? void 0 : i ? M5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
26475
26480
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
26476
- return i && r && IG(t, e, r), r;
26481
+ return i && r && I5(t, e, r), r;
26477
26482
  };
26478
26483
  let Na = class extends Ye {
26479
26484
  constructor() {
26480
26485
  super(...arguments), this.initialValue = void 0, this.width = "100%";
26481
26486
  }
26482
26487
  render() {
26483
- return /* @__PURE__ */ m(vG, { children: /* @__PURE__ */ m(XG, { initialValue: this.initialValue, width: this.width }) });
26488
+ return /* @__PURE__ */ m(v5, { children: /* @__PURE__ */ m(X5, { initialValue: this.initialValue, width: this.width }) });
26484
26489
  }
26485
26490
  };
26486
26491
  Ud([
@@ -26492,19 +26497,19 @@ Ud([
26492
26497
  Na = Ud([
26493
26498
  ke("gs-mutation-filter")
26494
26499
  ], Na);
26495
- async function CG(n, t, e) {
26500
+ async function C5(n, t, e) {
26496
26501
  return (await new er({}, [t]).evaluate(n, e)).content.flatMap((s) => [s[t], `${s[t]}*`]).sort();
26497
26502
  }
26498
- const NG = ({ width: n, ...t }) => {
26503
+ const N5 = ({ width: n, ...t }) => {
26499
26504
  const e = { width: n, height: "3rem" };
26500
- return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(zG, { ...t }) }) });
26501
- }, zG = ({
26505
+ return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(T5, { ...t }) }) });
26506
+ }, T5 = ({
26502
26507
  lapisField: n,
26503
26508
  placeholderText: t,
26504
26509
  initialValue: e
26505
26510
  }) => {
26506
26511
  const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(
26507
- () => CG(i, n),
26512
+ () => C5(i, n),
26508
26513
  [n, i]
26509
26514
  );
26510
26515
  if (a)
@@ -26540,10 +26545,10 @@ const NG = ({ width: n, ...t }) => {
26540
26545
  /* @__PURE__ */ m("datalist", { id: n, children: s.map((d) => /* @__PURE__ */ m("option", { value: d }, d)) })
26541
26546
  ] });
26542
26547
  };
26543
- var TG = Object.defineProperty, FG = Object.getOwnPropertyDescriptor, go = (n, t, e, i) => {
26544
- for (var r = i > 1 ? void 0 : i ? FG(t, e) : t, s = n.length - 1, o; s >= 0; s--)
26548
+ var z5 = Object.defineProperty, F5 = Object.getOwnPropertyDescriptor, go = (n, t, e, i) => {
26549
+ for (var r = i > 1 ? void 0 : i ? F5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
26545
26550
  (o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
26546
- return i && r && TG(t, e, r), r;
26551
+ return i && r && z5(t, e, r), r;
26547
26552
  };
26548
26553
  let Jr = class extends Ye {
26549
26554
  constructor() {
@@ -26551,7 +26556,7 @@ let Jr = class extends Ye {
26551
26556
  }
26552
26557
  render() {
26553
26558
  return /* @__PURE__ */ m(
26554
- NG,
26559
+ N5,
26555
26560
  {
26556
26561
  lapisField: this.lapisField,
26557
26562
  placeholderText: this.placeholderText,
@@ -26592,6 +26597,6 @@ export {
26592
26597
  Je as RelativeGrowthAdvantageComponent,
26593
26598
  jr as TextInputComponent,
26594
26599
  Sr as UserFacingError,
26595
- PG as dateRangeOptionPresets
26600
+ P5 as dateRangeOptionPresets
26596
26601
  };
26597
26602
  //# sourceMappingURL=dashboard-components.js.map