webcodecs-utils 0.1.9 → 0.2.1

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.
Files changed (3) hide show
  1. package/dist/index.cjs +21 -21
  2. package/dist/index.js +683 -651
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ function G1(t, e, i = 30, n = "good") {
9
9
  }, m = o[n] || o.good;
10
10
  return d * i * m;
11
11
  }
12
- function S1(t, e, i, n) {
12
+ function v1(t, e, i, n) {
13
13
  const d = [
14
14
  { maxMacroblocks: 99, maxBitrate: 64e3, level: 10 },
15
15
  // Level 1
@@ -171,18 +171,18 @@ function S1(t, e, i, n) {
171
171
  { maxPictureSize: 35651584, maxBitrate: 8e8, tier: "H", level: 19 }
172
172
  // Level 6.3 (High Tier)
173
173
  ];
174
- function G(W) {
174
+ function S(W) {
175
175
  return W ? W[W.length - 1] : void 0;
176
176
  }
177
177
  if (t === "avc") {
178
178
  const v = Math.ceil(e / 16) * Math.ceil(i / 16), Z = d.find(
179
179
  (U) => v <= U.maxMacroblocks && n <= U.maxBitrate
180
- ) ?? G(d), O = Z ? Z.level : 0, w = "64".padStart(2, "0"), N = "00", J = O.toString(16).padStart(2, "0");
180
+ ) ?? S(d), O = Z ? Z.level : 0, w = "64".padStart(2, "0"), N = "00", J = O.toString(16).padStart(2, "0");
181
181
  return `avc1.${w}${N}${J}`;
182
182
  } else if (t === "hevc") {
183
183
  const W = "", Z = "6", O = e * i, w = o.find(
184
184
  (J) => O <= J.maxPictureSize && n <= J.maxBitrate
185
- ) ?? G(o);
185
+ ) ?? S(o);
186
186
  return `hev1.${W}1.${Z}.${w.tier}${w.level}.B0`;
187
187
  } else {
188
188
  if (t === "vp8")
@@ -190,18 +190,18 @@ function S1(t, e, i, n) {
190
190
  if (t === "vp9") {
191
191
  const W = "00", v = e * i, Z = m.find(
192
192
  (w) => v <= w.maxPictureSize && n <= w.maxBitrate
193
- ) ?? G(m);
193
+ ) ?? S(m);
194
194
  return `vp09.${W}.${Z.level.toString().padStart(2, "0")}.08`;
195
195
  } else if (t === "av1") {
196
196
  const v = e * i, Z = h.find(
197
197
  (N) => v <= N.maxPictureSize && n <= N.maxBitrate
198
- ) ?? G(h);
198
+ ) ?? S(h);
199
199
  return `av01.0.${Z.level.toString().padStart(2, "0")}${Z.tier}.08`;
200
200
  }
201
201
  }
202
202
  throw new TypeError(`Unhandled codec '${t}'.`);
203
203
  }
204
- class v1 {
204
+ class I1 {
205
205
  /**
206
206
  * Create a new GPUFrameRenderer.
207
207
  *
@@ -420,7 +420,7 @@ class v1 {
420
420
  const o = this.device.createBindGroup({
421
421
  layout: i.getBindGroupLayout(0),
422
422
  entries: d
423
- }), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(), G = m.beginRenderPass({
423
+ }), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(), S = m.beginRenderPass({
424
424
  colorAttachments: [{
425
425
  view: h,
426
426
  clearValue: { r: 0, g: 0, b: 0, a: 1 },
@@ -428,7 +428,7 @@ class v1 {
428
428
  storeOp: "store"
429
429
  }]
430
430
  });
431
- G.setPipeline(i), G.setBindGroup(0, o), G.draw(6), G.end(), this.device.queue.submit([m.finish()]);
431
+ S.setPipeline(i), S.setBindGroup(0, o), S.draw(6), S.end(), this.device.queue.submit([m.finish()]);
432
432
  }
433
433
  async drawImageBitmap(e) {
434
434
  const i = await createImageBitmap(e);
@@ -929,7 +929,7 @@ function An() {
929
929
  9.000838926174497,
930
930
  -29.20218120805369
931
931
  /* 2.384e-06/2.384e-06 */
932
- ], G = [
932
+ ], S = [
933
933
  [
934
934
  2382191739347913e-28,
935
935
  6423305872147834e-28,
@@ -1087,7 +1087,7 @@ function An() {
1087
1087
  -6423305872147841e-28,
1088
1088
  -2382191739347918e-28
1089
1089
  ]
1090
- ], W = G[o.SHORT_TYPE], v = G[o.SHORT_TYPE], Z = G[o.SHORT_TYPE], O = G[o.SHORT_TYPE], w = [
1090
+ ], W = S[o.SHORT_TYPE], v = S[o.SHORT_TYPE], Z = S[o.SHORT_TYPE], O = S[o.SHORT_TYPE], w = [
1091
1091
  0,
1092
1092
  1,
1093
1093
  16,
@@ -1138,7 +1138,7 @@ function An() {
1138
1138
  function J(k, I) {
1139
1139
  for (var r = 0; r < 3; r++) {
1140
1140
  var K, X, A, T, H, p;
1141
- T = k[I + 2 * 3] * G[o.SHORT_TYPE][0] - k[I + 5 * 3], K = k[I + 0 * 3] * G[o.SHORT_TYPE][2] - k[I + 3 * 3], X = T + K, A = T - K, T = k[I + 5 * 3] * G[o.SHORT_TYPE][0] + k[I + 2 * 3], K = k[I + 3 * 3] * G[o.SHORT_TYPE][2] + k[I + 0 * 3], H = T + K, p = -T + K, K = (k[I + 1 * 3] * G[o.SHORT_TYPE][1] - k[I + 4 * 3]) * 2069978111953089e-26, T = (k[I + 4 * 3] * G[o.SHORT_TYPE][1] + k[I + 1 * 3]) * 2069978111953089e-26, k[I + 3 * 0] = X * 190752519173728e-25 + K, k[I + 3 * 5] = -H * 190752519173728e-25 + T, A = A * 0.8660254037844387 * 1907525191737281e-26, H = H * 0.5 * 1907525191737281e-26 + T, k[I + 3 * 1] = A - H, k[I + 3 * 2] = A + H, X = X * 0.5 * 1907525191737281e-26 - K, p = p * 0.8660254037844387 * 1907525191737281e-26, k[I + 3 * 3] = X + p, k[I + 3 * 4] = X - p, I++;
1141
+ T = k[I + 2 * 3] * S[o.SHORT_TYPE][0] - k[I + 5 * 3], K = k[I + 0 * 3] * S[o.SHORT_TYPE][2] - k[I + 3 * 3], X = T + K, A = T - K, T = k[I + 5 * 3] * S[o.SHORT_TYPE][0] + k[I + 2 * 3], K = k[I + 3 * 3] * S[o.SHORT_TYPE][2] + k[I + 0 * 3], H = T + K, p = -T + K, K = (k[I + 1 * 3] * S[o.SHORT_TYPE][1] - k[I + 4 * 3]) * 2069978111953089e-26, T = (k[I + 4 * 3] * S[o.SHORT_TYPE][1] + k[I + 1 * 3]) * 2069978111953089e-26, k[I + 3 * 0] = X * 190752519173728e-25 + K, k[I + 3 * 5] = -H * 190752519173728e-25 + T, A = A * 0.8660254037844387 * 1907525191737281e-26, H = H * 0.5 * 1907525191737281e-26 + T, k[I + 3 * 1] = A - H, k[I + 3 * 2] = A + H, X = X * 0.5 * 1907525191737281e-26 - K, p = p * 0.8660254037844387 * 1907525191737281e-26, k[I + 3 * 3] = X + p, k[I + 3 * 4] = X - p, I++;
1142
1142
  }
1143
1143
  }
1144
1144
  function U(k, I, r) {
@@ -1173,14 +1173,14 @@ function An() {
1173
1173
  j[_][w[H]] *= k.amp_filter[H];
1174
1174
  if (R == o.SHORT_TYPE) {
1175
1175
  for (var _ = -12 / 4; _ < 0; _++) {
1176
- var g = G[o.SHORT_TYPE][_ + 3];
1176
+ var g = S[o.SHORT_TYPE][_ + 3];
1177
1177
  u[l + _ * 3 + 9] = f[9 + _][w[H]] * g - f[8 - _][w[H]], u[l + _ * 3 + 18] = f[14 - _][w[H]] * g + f[15 + _][w[H]], u[l + _ * 3 + 10] = f[15 + _][w[H]] * g - f[14 - _][w[H]], u[l + _ * 3 + 19] = j[2 - _][w[H]] * g + j[3 + _][w[H]], u[l + _ * 3 + 11] = j[3 + _][w[H]] * g - j[2 - _][w[H]], u[l + _ * 3 + 20] = j[8 - _][w[H]] * g + j[9 + _][w[H]];
1178
1178
  }
1179
1179
  J(u, l);
1180
1180
  } else {
1181
1181
  for (var P = d(18), _ = -36 / 4; _ < 0; _++) {
1182
1182
  var a, c;
1183
- a = G[R][_ + 27] * j[_ + 9][w[H]] + G[R][_ + 36] * j[8 - _][w[H]], c = G[R][_ + 9] * f[_ + 9][w[H]] - G[R][_ + 18] * f[8 - _][w[H]], P[_ + 9] = a - c * W[3 + _ + 9], P[_ + 18] = a * W[3 + _ + 9] + c;
1183
+ a = S[R][_ + 27] * j[_ + 9][w[H]] + S[R][_ + 36] * j[8 - _][w[H]], c = S[R][_ + 9] * f[_ + 9][w[H]] - S[R][_ + 18] * f[8 - _][w[H]], P[_ + 9] = a - c * W[3 + _ + 9], P[_ + 18] = a * W[3 + _ + 9] + c;
1184
1184
  }
1185
1185
  U(u, l, P);
1186
1186
  }
@@ -1219,9 +1219,9 @@ function sn() {
1219
1219
  var m = this;
1220
1220
  this.assign = function(h) {
1221
1221
  i.arraycopy(h.l, 0, m.l, 0, t.SBMAX_l);
1222
- for (var G = 0; G < t.SBMAX_s; G++)
1222
+ for (var S = 0; S < t.SBMAX_s; S++)
1223
1223
  for (var W = 0; W < 3; W++)
1224
- m.s[G][W] = h.s[G][W];
1224
+ m.s[S][W] = h.s[S][W];
1225
1225
  };
1226
1226
  }
1227
1227
  return Li = o, Li;
@@ -1247,7 +1247,7 @@ function bt() {
1247
1247
  var d = t.new_float, o = t.new_float_n, m = t.new_int;
1248
1248
  t.new_int_n;
1249
1249
  var h = t.assert;
1250
- G.ENCDELAY = 576, G.POSTDELAY = 1152, G.MDCTDELAY = 48, G.FFTOFFSET = 224 + G.MDCTDELAY, G.DECDELAY = 528, G.SBLIMIT = 32, G.CBANDS = 64, G.SBPSY_l = 21, G.SBPSY_s = 12, G.SBMAX_l = 22, G.SBMAX_s = 13, G.PSFB21 = 6, G.PSFB12 = 6, G.BLKSIZE = 1024, G.HBLKSIZE = G.BLKSIZE / 2 + 1, G.BLKSIZE_s = 256, G.HBLKSIZE_s = G.BLKSIZE_s / 2 + 1, G.NORM_TYPE = 0, G.START_TYPE = 1, G.SHORT_TYPE = 2, G.STOP_TYPE = 3, G.MPG_MD_LR_LR = 0, G.MPG_MD_LR_I = 1, G.MPG_MD_MS_LR = 2, G.MPG_MD_MS_I = 3, G.fircoef = [
1250
+ S.ENCDELAY = 576, S.POSTDELAY = 1152, S.MDCTDELAY = 48, S.FFTOFFSET = 224 + S.MDCTDELAY, S.DECDELAY = 528, S.SBLIMIT = 32, S.CBANDS = 64, S.SBPSY_l = 21, S.SBPSY_s = 12, S.SBMAX_l = 22, S.SBMAX_s = 13, S.PSFB21 = 6, S.PSFB12 = 6, S.BLKSIZE = 1024, S.HBLKSIZE = S.BLKSIZE / 2 + 1, S.BLKSIZE_s = 256, S.HBLKSIZE_s = S.BLKSIZE_s / 2 + 1, S.NORM_TYPE = 0, S.START_TYPE = 1, S.SHORT_TYPE = 2, S.STOP_TYPE = 3, S.MPG_MD_LR_LR = 0, S.MPG_MD_LR_I = 1, S.MPG_MD_MS_LR = 2, S.MPG_MD_MS_I = 3, S.fircoef = [
1251
1251
  -0.0207887 * 5,
1252
1252
  -0.0378413 * 5,
1253
1253
  -0.0432472 * 5,
@@ -1258,8 +1258,8 @@ function bt() {
1258
1258
  0.151365 * 5,
1259
1259
  0.187098 * 5
1260
1260
  ];
1261
- function G() {
1262
- var W = An(), v = On(), Z = G.FFTOFFSET, O = G.MPG_MD_MS_LR, w = null;
1261
+ function S() {
1262
+ var W = An(), v = On(), Z = S.FFTOFFSET, O = S.MPG_MD_MS_LR, w = null;
1263
1263
  this.psy = null;
1264
1264
  var N = null, J = null, U = null;
1265
1265
  this.setModules = function(X, A, T, H) {
@@ -1295,8 +1295,8 @@ function bt() {
1295
1295
  u < 576 * T.mode_gr ? (s[u] = 0, T.channels_out == 2 && (V[u] = 0)) : (s[u] = A[0][l], T.channels_out == 2 && (V[u] = A[1][l]), ++l);
1296
1296
  for (p = 0; p < T.mode_gr; p++)
1297
1297
  for (H = 0; H < T.channels_out; H++)
1298
- T.l3_side.tt[p][H].block_type = G.SHORT_TYPE;
1299
- k.mdct_sub48(T, s, V), h(576 >= G.FFTOFFSET), h(T.mf_size >= G.BLKSIZE + X.framesize - G.FFTOFFSET), h(T.mf_size >= 512 + X.framesize - 32);
1298
+ T.l3_side.tt[p][H].block_type = S.SHORT_TYPE;
1299
+ k.mdct_sub48(T, s, V), h(576 >= S.FFTOFFSET), h(T.mf_size >= S.BLKSIZE + X.framesize - S.FFTOFFSET), h(T.mf_size >= 512 + X.framesize - 32);
1300
1300
  }
1301
1301
  }
1302
1302
  this.lame_encode_mp3_frame = function(X, A, T, H, p, u) {
@@ -1309,7 +1309,7 @@ function bt() {
1309
1309
  var ee, ae = [null, null], le = 0, re = m(2);
1310
1310
  for (L = 0; L < f.mode_gr; L++) {
1311
1311
  for (M = 0; M < f.channels_out; M++)
1312
- ae[M] = R[M], le = 576 + L * 576 - G.FFTOFFSET;
1312
+ ae[M] = R[M], le = 576 + L * 576 - S.FFTOFFSET;
1313
1313
  if (X.VBR == i.vbr_mtrh || X.VBR == i.vbr_mt ? ee = N.L3psycho_anal_vbr(
1314
1314
  X,
1315
1315
  ae,
@@ -1342,9 +1342,9 @@ function bt() {
1342
1342
  } else
1343
1343
  for (L = 0; L < f.mode_gr; L++)
1344
1344
  for (M = 0; M < f.channels_out; M++)
1345
- f.l3_side.tt[L][M].block_type = G.NORM_TYPE, f.l3_side.tt[L][M].mixed_block_flag = 0, a[L][M] = P[L][M] = 700;
1346
- if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext = G.MPG_MD_LR_LR, X.force_ms)
1347
- f.mode_ext = G.MPG_MD_MS_LR;
1345
+ f.l3_side.tt[L][M].block_type = S.NORM_TYPE, f.l3_side.tt[L][M].mixed_block_flag = 0, a[L][M] = P[L][M] = 700;
1346
+ if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext = S.MPG_MD_LR_LR, X.force_ms)
1347
+ f.mode_ext = S.MPG_MD_MS_LR;
1348
1348
  else if (X.mode == MPEGMode.JOINT_STEREO) {
1349
1349
  var he = 0, oe = 0;
1350
1350
  for (L = 0; L < f.mode_gr; L++)
@@ -1352,7 +1352,7 @@ function bt() {
1352
1352
  he += a[L][M], oe += P[L][M];
1353
1353
  if (he <= 1 * oe) {
1354
1354
  var Le = f.l3_side.tt[0], ze = f.l3_side.tt[f.mode_gr - 1];
1355
- Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext = G.MPG_MD_MS_LR);
1355
+ Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext = S.MPG_MD_MS_LR);
1356
1356
  }
1357
1357
  }
1358
1358
  if (f.mode_ext == O ? (_ = V, c = a) : (_ = s, c = P), X.analysis && f.pinfo != null)
@@ -1379,7 +1379,7 @@ function bt() {
1379
1379
  for (M = 0; M < f.channels_out; M++)
1380
1380
  we += c[L][M];
1381
1381
  for (f.nsPsy.pefirbuf[18] = we, we = f.nsPsy.pefirbuf[9], We = 0; We < 9; We++)
1382
- we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) * G.fircoef[We];
1382
+ we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) * S.fircoef[We];
1383
1383
  for (we = 670 * 5 * f.mode_gr * f.channels_out / we, L = 0; L < f.mode_gr; L++)
1384
1384
  for (M = 0; M < f.channels_out; M++)
1385
1385
  c[L][M] *= we;
@@ -1397,7 +1397,7 @@ function bt() {
1397
1397
  return r(f), l;
1398
1398
  };
1399
1399
  }
1400
- return Hi = G, Hi;
1400
+ return Hi = S, Hi;
1401
1401
  }
1402
1402
  var pt = it;
1403
1403
  pt.System;
@@ -1427,7 +1427,7 @@ function jn() {
1427
1427
  0.006135884649154475
1428
1428
  ];
1429
1429
  function n(o, m, h) {
1430
- var G = 0, W, v, Z;
1430
+ var S = 0, W, v, Z;
1431
1431
  h <<= 1;
1432
1432
  var O = m + h;
1433
1433
  W = 4;
@@ -1438,16 +1438,16 @@ function jn() {
1438
1438
  var K, X, A, T;
1439
1439
  X = o[v + 0] - o[v + U], K = o[v + 0] + o[v + U], T = o[v + k] - o[v + I], A = o[v + k] + o[v + I], o[v + k] = K - A, o[v + 0] = K + A, o[v + I] = X - T, o[v + U] = X + T, X = o[Z + 0] - o[Z + U], K = o[Z + 0] + o[Z + U], T = Xs.SQRT2 * o[Z + I], A = Xs.SQRT2 * o[Z + k], o[Z + k] = K - A, o[Z + 0] = K + A, o[Z + I] = X - T, o[Z + U] = X + T, Z += W, v += W;
1440
1440
  } while (v < O);
1441
- for (N = i[G + 0], w = i[G + 1], J = 1; J < r; J++) {
1441
+ for (N = i[S + 0], w = i[S + 1], J = 1; J < r; J++) {
1442
1442
  var H, p;
1443
1443
  H = 1 - 2 * w * w, p = 2 * w * N, v = m + J, Z = m + U - J;
1444
1444
  do {
1445
1445
  var u, l, s, K, X, V, A, _, T, R;
1446
1446
  l = p * o[v + U] - H * o[Z + U], u = H * o[v + U] + p * o[Z + U], X = o[v + 0] - u, K = o[v + 0] + u, V = o[Z + 0] - l, s = o[Z + 0] + l, l = p * o[v + I] - H * o[Z + I], u = H * o[v + I] + p * o[Z + I], T = o[v + k] - u, A = o[v + k] + u, R = o[Z + k] - l, _ = o[Z + k] + l, l = w * A - N * R, u = N * A + w * R, o[v + k] = K - u, o[v + 0] = K + u, o[Z + I] = V - l, o[Z + U] = V + l, l = N * _ - w * T, u = w * _ + N * T, o[Z + k] = s - u, o[Z + 0] = s + u, o[v + I] = X - l, o[v + U] = X + l, Z += W, v += W;
1447
1447
  } while (v < O);
1448
- H = N, N = H * i[G + 0] - w * i[G + 1], w = H * i[G + 1] + w * i[G + 0];
1448
+ H = N, N = H * i[S + 0] - w * i[S + 1], w = H * i[S + 1] + w * i[S + 0];
1449
1449
  }
1450
- G += 2;
1450
+ S += 2;
1451
1451
  } while (W < h);
1452
1452
  }
1453
1453
  var d = [
@@ -1580,20 +1580,20 @@ function jn() {
1580
1580
  126,
1581
1581
  254
1582
1582
  ];
1583
- this.fft_short = function(o, m, h, G, W) {
1583
+ this.fft_short = function(o, m, h, S, W) {
1584
1584
  for (var v = 0; v < 3; v++) {
1585
1585
  var Z = Oe.BLKSIZE_s / 2, O = 65535 & 576 / 3 * (v + 1), w = Oe.BLKSIZE_s / 8 - 1;
1586
1586
  do {
1587
1587
  var N, J, U, k, I, r = d[w << 2] & 255;
1588
- N = e[r] * G[h][W + r + O], I = e[127 - r] * G[h][W + r + O + 128], J = N - I, N = N + I, U = e[r + 64] * G[h][W + r + O + 64], I = e[63 - r] * G[h][W + r + O + 192], k = U - I, U = U + I, Z -= 4, m[v][Z + 0] = N + U, m[v][Z + 2] = N - U, m[v][Z + 1] = J + k, m[v][Z + 3] = J - k, N = e[r + 1] * G[h][W + r + O + 1], I = e[126 - r] * G[h][W + r + O + 129], J = N - I, N = N + I, U = e[r + 65] * G[h][W + r + O + 65], I = e[62 - r] * G[h][W + r + O + 193], k = U - I, U = U + I, m[v][Z + Oe.BLKSIZE_s / 2 + 0] = N + U, m[v][Z + Oe.BLKSIZE_s / 2 + 2] = N - U, m[v][Z + Oe.BLKSIZE_s / 2 + 1] = J + k, m[v][Z + Oe.BLKSIZE_s / 2 + 3] = J - k;
1588
+ N = e[r] * S[h][W + r + O], I = e[127 - r] * S[h][W + r + O + 128], J = N - I, N = N + I, U = e[r + 64] * S[h][W + r + O + 64], I = e[63 - r] * S[h][W + r + O + 192], k = U - I, U = U + I, Z -= 4, m[v][Z + 0] = N + U, m[v][Z + 2] = N - U, m[v][Z + 1] = J + k, m[v][Z + 3] = J - k, N = e[r + 1] * S[h][W + r + O + 1], I = e[126 - r] * S[h][W + r + O + 129], J = N - I, N = N + I, U = e[r + 65] * S[h][W + r + O + 65], I = e[62 - r] * S[h][W + r + O + 193], k = U - I, U = U + I, m[v][Z + Oe.BLKSIZE_s / 2 + 0] = N + U, m[v][Z + Oe.BLKSIZE_s / 2 + 2] = N - U, m[v][Z + Oe.BLKSIZE_s / 2 + 1] = J + k, m[v][Z + Oe.BLKSIZE_s / 2 + 3] = J - k;
1589
1589
  } while (--w >= 0);
1590
1590
  n(m[v], Z, Oe.BLKSIZE_s / 2);
1591
1591
  }
1592
- }, this.fft_long = function(o, m, h, G, W) {
1592
+ }, this.fft_long = function(o, m, h, S, W) {
1593
1593
  var v = Oe.BLKSIZE / 8 - 1, Z = Oe.BLKSIZE / 2;
1594
1594
  do {
1595
1595
  var O, w, N, J, U, k = d[v] & 255;
1596
- O = t[k] * G[h][W + k], U = t[k + 512] * G[h][W + k + 512], w = O - U, O = O + U, N = t[k + 256] * G[h][W + k + 256], U = t[k + 768] * G[h][W + k + 768], J = N - U, N = N + U, Z -= 4, m[Z + 0] = O + N, m[Z + 2] = O - N, m[Z + 1] = w + J, m[Z + 3] = w - J, O = t[k + 1] * G[h][W + k + 1], U = t[k + 513] * G[h][W + k + 513], w = O - U, O = O + U, N = t[k + 257] * G[h][W + k + 257], U = t[k + 769] * G[h][W + k + 769], J = N - U, N = N + U, m[Z + Oe.BLKSIZE / 2 + 0] = O + N, m[Z + Oe.BLKSIZE / 2 + 2] = O - N, m[Z + Oe.BLKSIZE / 2 + 1] = w + J, m[Z + Oe.BLKSIZE / 2 + 3] = w - J;
1596
+ O = t[k] * S[h][W + k], U = t[k + 512] * S[h][W + k + 512], w = O - U, O = O + U, N = t[k + 256] * S[h][W + k + 256], U = t[k + 768] * S[h][W + k + 768], J = N - U, N = N + U, Z -= 4, m[Z + 0] = O + N, m[Z + 2] = O - N, m[Z + 1] = w + J, m[Z + 3] = w - J, O = t[k + 1] * S[h][W + k + 1], U = t[k + 513] * S[h][W + k + 513], w = O - U, O = O + U, N = t[k + 257] * S[h][W + k + 257], U = t[k + 769] * S[h][W + k + 769], J = N - U, N = N + U, m[Z + Oe.BLKSIZE / 2 + 0] = O + N, m[Z + Oe.BLKSIZE / 2 + 2] = O - N, m[Z + Oe.BLKSIZE / 2 + 1] = w + J, m[Z + Oe.BLKSIZE / 2 + 3] = w - J;
1597
1597
  } while (--v >= 0);
1598
1598
  n(m, Z, Oe.BLKSIZE / 2);
1599
1599
  }, this.init_fft = function(o) {
@@ -1605,7 +1605,7 @@ function jn() {
1605
1605
  }
1606
1606
  var Qn = jn, yt = it;
1607
1607
  yt.System;
1608
- var W0 = yt.VbrMode, Gs = yt.Float, L0 = yt.ShortBlock, mt = yt.Util, Dn = yt.Arrays;
1608
+ var W0 = yt.VbrMode, Ss = yt.Float, L0 = yt.ShortBlock, mt = yt.Util, Dn = yt.Arrays;
1609
1609
  yt.new_array_n;
1610
1610
  yt.new_byte;
1611
1611
  yt.new_double;
@@ -1613,7 +1613,7 @@ var je = yt.new_float, kt = yt.new_float_n, h0 = yt.new_int;
1613
1613
  yt.new_int_n;
1614
1614
  var ue = yt.assert, $n = Qn, D = bt();
1615
1615
  function qn() {
1616
- var t = new $n(), e = 2.302585092994046, i = 2, n = 16, d = 2, o = 16, m = 0.34, h = 1 / (14752 * 14752) / (D.BLKSIZE / 2), G = 0.01, W = 0.8, v = 0.6, Z = 0.3, O = 3.5, w = 21, N = 0.2302585093;
1616
+ var t = new $n(), e = 2.302585092994046, i = 2, n = 16, d = 2, o = 16, m = 0.34, h = 1 / (14752 * 14752) / (D.BLKSIZE / 2), S = 0.01, W = 0.8, v = 0.6, Z = 0.3, O = 3.5, w = 21, N = 0.2302585093;
1617
1617
  function J(b) {
1618
1618
  return b;
1619
1619
  }
@@ -1622,10 +1622,10 @@ function qn() {
1622
1622
  x += b[Y] * y.ATH.eql_w[Y];
1623
1623
  return x *= h, x;
1624
1624
  }
1625
- function k(b, y, x, Y, F, S, C, E, B, $, z) {
1625
+ function k(b, y, x, Y, F, G, C, E, B, $, z) {
1626
1626
  var q = b.internal_flags;
1627
1627
  if (B < 2)
1628
- t.fft_long(q, Y[F], B, $, z), t.fft_short(q, S[C], B, $, z);
1628
+ t.fft_long(q, Y[F], B, $, z), t.fft_short(q, G[C], B, $, z);
1629
1629
  else if (B == 2) {
1630
1630
  for (var ce = D.BLKSIZE - 1; ce >= 0; --ce) {
1631
1631
  var Ze = Y[F + 0][ce], ie = Y[F + 1][ce];
@@ -1633,8 +1633,8 @@ function qn() {
1633
1633
  }
1634
1634
  for (var fe = 2; fe >= 0; --fe)
1635
1635
  for (var ce = D.BLKSIZE_s - 1; ce >= 0; --ce) {
1636
- var Ze = S[C + 0][fe][ce], ie = S[C + 1][fe][ce];
1637
- S[C + 0][fe][ce] = (Ze + ie) * mt.SQRT2 * 0.5, S[C + 1][fe][ce] = (Ze - ie) * mt.SQRT2 * 0.5;
1636
+ var Ze = G[C + 0][fe][ce], ie = G[C + 1][fe][ce];
1637
+ G[C + 0][fe][ce] = (Ze + ie) * mt.SQRT2 * 0.5, G[C + 1][fe][ce] = (Ze - ie) * mt.SQRT2 * 0.5;
1638
1638
  }
1639
1639
  }
1640
1640
  y[0] = Y[F + 0][0], y[0] *= y[0];
@@ -1643,9 +1643,9 @@ function qn() {
1643
1643
  y[D.BLKSIZE / 2 - ce] = (Q * Q + be * be) * 0.5;
1644
1644
  }
1645
1645
  for (var fe = 2; fe >= 0; --fe) {
1646
- x[fe][0] = S[C + 0][fe][0], x[fe][0] *= x[fe][0];
1646
+ x[fe][0] = G[C + 0][fe][0], x[fe][0] *= x[fe][0];
1647
1647
  for (var ce = D.BLKSIZE_s / 2 - 1; ce >= 0; --ce) {
1648
- var Q = S[C + 0][fe][D.BLKSIZE_s / 2 - ce], be = S[C + 0][fe][D.BLKSIZE_s / 2 + ce];
1648
+ var Q = G[C + 0][fe][D.BLKSIZE_s / 2 - ce], be = G[C + 0][fe][D.BLKSIZE_s / 2 + ce];
1649
1649
  x[fe][D.BLKSIZE_s / 2 - ce] = (Q * Q + be * be) * 0.5;
1650
1650
  }
1651
1651
  }
@@ -1728,7 +1728,7 @@ function qn() {
1728
1728
  1.11084 * 1.11084,
1729
1729
  1.03826 * 1.03826
1730
1730
  ];
1731
- function V(b, y, x, Y, F, S) {
1731
+ function V(b, y, x, Y, F, G) {
1732
1732
  var C;
1733
1733
  if (y > b)
1734
1734
  if (y < b * A)
@@ -1786,13 +1786,13 @@ function qn() {
1786
1786
  var x = b.internal_flags;
1787
1787
  if (x.channels_out > 1) {
1788
1788
  for (var Y = 0; Y < D.SBMAX_l; Y++) {
1789
- var F = x.thm[0].l[Y], S = x.thm[1].l[Y];
1790
- x.thm[0].l[Y] += S * y, x.thm[1].l[Y] += F * y;
1789
+ var F = x.thm[0].l[Y], G = x.thm[1].l[Y];
1790
+ x.thm[0].l[Y] += G * y, x.thm[1].l[Y] += F * y;
1791
1791
  }
1792
1792
  for (var Y = 0; Y < D.SBMAX_s; Y++)
1793
1793
  for (var C = 0; C < 3; C++) {
1794
- var F = x.thm[0].s[Y][C], S = x.thm[1].s[Y][C];
1795
- x.thm[0].s[Y][C] += S * y, x.thm[1].s[Y][C] += F * y;
1794
+ var F = x.thm[0].s[Y][C], G = x.thm[1].s[Y][C];
1795
+ x.thm[0].s[Y][C] += G * y, x.thm[1].s[Y][C] += F * y;
1796
1796
  }
1797
1797
  }
1798
1798
  }
@@ -1811,95 +1811,95 @@ function qn() {
1811
1811
  b.thm[2].l[y] = Y, b.thm[3].l[y] = F;
1812
1812
  }
1813
1813
  for (var y = 0; y < D.SBMAX_s; y++)
1814
- for (var S = 0; S < 3; S++)
1815
- if (!(b.thm[0].s[y][S] > 1.58 * b.thm[1].s[y][S] || b.thm[1].s[y][S] > 1.58 * b.thm[0].s[y][S])) {
1816
- var x = b.mld_s[y] * b.en[3].s[y][S], Y = Math.max(
1817
- b.thm[2].s[y][S],
1818
- Math.min(b.thm[3].s[y][S], x)
1814
+ for (var G = 0; G < 3; G++)
1815
+ if (!(b.thm[0].s[y][G] > 1.58 * b.thm[1].s[y][G] || b.thm[1].s[y][G] > 1.58 * b.thm[0].s[y][G])) {
1816
+ var x = b.mld_s[y] * b.en[3].s[y][G], Y = Math.max(
1817
+ b.thm[2].s[y][G],
1818
+ Math.min(b.thm[3].s[y][G], x)
1819
1819
  );
1820
- x = b.mld_s[y] * b.en[2].s[y][S];
1820
+ x = b.mld_s[y] * b.en[2].s[y][G];
1821
1821
  var F = Math.max(
1822
- b.thm[3].s[y][S],
1823
- Math.min(b.thm[2].s[y][S], x)
1822
+ b.thm[3].s[y][G],
1823
+ Math.min(b.thm[2].s[y][G], x)
1824
1824
  );
1825
- b.thm[2].s[y][S] = Y, b.thm[3].s[y][S] = F;
1825
+ b.thm[2].s[y][G] = Y, b.thm[3].s[y][G] = F;
1826
1826
  }
1827
1827
  }
1828
1828
  function g(b, y, x) {
1829
1829
  var Y = y, F = Math.pow(10, x);
1830
1830
  y *= 2, Y *= 2;
1831
- for (var S = 0; S < D.SBMAX_l; S++) {
1831
+ for (var G = 0; G < D.SBMAX_l; G++) {
1832
1832
  var C, E, B, $;
1833
- if ($ = b.ATH.cb_l[b.bm_l[S]] * F, C = Math.min(
1834
- Math.max(b.thm[0].l[S], $),
1835
- Math.max(b.thm[1].l[S], $)
1836
- ), E = Math.max(b.thm[2].l[S], $), B = Math.max(b.thm[3].l[S], $), C * y < E + B) {
1833
+ if ($ = b.ATH.cb_l[b.bm_l[G]] * F, C = Math.min(
1834
+ Math.max(b.thm[0].l[G], $),
1835
+ Math.max(b.thm[1].l[G], $)
1836
+ ), E = Math.max(b.thm[2].l[G], $), B = Math.max(b.thm[3].l[G], $), C * y < E + B) {
1837
1837
  var z = C * Y / (E + B);
1838
1838
  E *= z, B *= z, ue(E + B > 0);
1839
1839
  }
1840
- b.thm[2].l[S] = Math.min(E, b.thm[2].l[S]), b.thm[3].l[S] = Math.min(B, b.thm[3].l[S]);
1840
+ b.thm[2].l[G] = Math.min(E, b.thm[2].l[G]), b.thm[3].l[G] = Math.min(B, b.thm[3].l[G]);
1841
1841
  }
1842
1842
  F *= D.BLKSIZE_s / D.BLKSIZE;
1843
- for (var S = 0; S < D.SBMAX_s; S++)
1843
+ for (var G = 0; G < D.SBMAX_s; G++)
1844
1844
  for (var q = 0; q < 3; q++) {
1845
1845
  var C, E, B, $;
1846
- if ($ = b.ATH.cb_s[b.bm_s[S]] * F, C = Math.min(
1847
- Math.max(b.thm[0].s[S][q], $),
1848
- Math.max(b.thm[1].s[S][q], $)
1849
- ), E = Math.max(b.thm[2].s[S][q], $), B = Math.max(b.thm[3].s[S][q], $), C * y < E + B) {
1846
+ if ($ = b.ATH.cb_s[b.bm_s[G]] * F, C = Math.min(
1847
+ Math.max(b.thm[0].s[G][q], $),
1848
+ Math.max(b.thm[1].s[G][q], $)
1849
+ ), E = Math.max(b.thm[2].s[G][q], $), B = Math.max(b.thm[3].s[G][q], $), C * y < E + B) {
1850
1850
  var z = C * y / (E + B);
1851
1851
  E *= z, B *= z, ue(E + B > 0);
1852
1852
  }
1853
- b.thm[2].s[S][q] = Math.min(
1854
- b.thm[2].s[S][q],
1853
+ b.thm[2].s[G][q] = Math.min(
1854
+ b.thm[2].s[G][q],
1855
1855
  E
1856
- ), b.thm[3].s[S][q] = Math.min(
1857
- b.thm[3].s[S][q],
1856
+ ), b.thm[3].s[G][q] = Math.min(
1857
+ b.thm[3].s[G][q],
1858
1858
  B
1859
1859
  );
1860
1860
  }
1861
1861
  }
1862
1862
  function P(b, y, x, Y, F) {
1863
- var S, C, E = 0, B = 0;
1864
- for (S = C = 0; S < D.SBMAX_s; ++C, ++S) {
1865
- for (var $ = b.bo_s[S], z = b.npart_s, q = $ < z ? $ : z; C < q; )
1863
+ var G, C, E = 0, B = 0;
1864
+ for (G = C = 0; G < D.SBMAX_s; ++C, ++G) {
1865
+ for (var $ = b.bo_s[G], z = b.npart_s, q = $ < z ? $ : z; C < q; )
1866
1866
  ue(y[C] >= 0), ue(x[C] >= 0), E += y[C], B += x[C], C++;
1867
- if (b.en[Y].s[S][F] = E, b.thm[Y].s[S][F] = B, C >= z) {
1868
- ++S;
1867
+ if (b.en[Y].s[G][F] = E, b.thm[Y].s[G][F] = B, C >= z) {
1868
+ ++G;
1869
1869
  break;
1870
1870
  }
1871
1871
  ue(y[C] >= 0), ue(x[C] >= 0);
1872
1872
  {
1873
- var ce = b.PSY.bo_s_weight[S], Ze = 1 - ce;
1874
- E = ce * y[C], B = ce * x[C], b.en[Y].s[S][F] += E, b.thm[Y].s[S][F] += B, E = Ze * y[C], B = Ze * x[C];
1873
+ var ce = b.PSY.bo_s_weight[G], Ze = 1 - ce;
1874
+ E = ce * y[C], B = ce * x[C], b.en[Y].s[G][F] += E, b.thm[Y].s[G][F] += B, E = Ze * y[C], B = Ze * x[C];
1875
1875
  }
1876
1876
  }
1877
- for (; S < D.SBMAX_s; ++S)
1878
- b.en[Y].s[S][F] = 0, b.thm[Y].s[S][F] = 0;
1877
+ for (; G < D.SBMAX_s; ++G)
1878
+ b.en[Y].s[G][F] = 0, b.thm[Y].s[G][F] = 0;
1879
1879
  }
1880
1880
  function a(b, y, x, Y) {
1881
- var F, S, C = 0, E = 0;
1882
- for (F = S = 0; F < D.SBMAX_l; ++S, ++F) {
1883
- for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $; S < z; )
1884
- ue(y[S] >= 0), ue(x[S] >= 0), C += y[S], E += x[S], S++;
1885
- if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E, S >= $) {
1881
+ var F, G, C = 0, E = 0;
1882
+ for (F = G = 0; F < D.SBMAX_l; ++G, ++F) {
1883
+ for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $; G < z; )
1884
+ ue(y[G] >= 0), ue(x[G] >= 0), C += y[G], E += x[G], G++;
1885
+ if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E, G >= $) {
1886
1886
  ++F;
1887
1887
  break;
1888
1888
  }
1889
- ue(y[S] >= 0), ue(x[S] >= 0);
1889
+ ue(y[G] >= 0), ue(x[G] >= 0);
1890
1890
  {
1891
1891
  var q = b.PSY.bo_l_weight[F], ce = 1 - q;
1892
- C = q * y[S], E = q * x[S], b.en[Y].l[F] += C, b.thm[Y].l[F] += E, C = ce * y[S], E = ce * x[S];
1892
+ C = q * y[G], E = q * x[G], b.en[Y].l[F] += C, b.thm[Y].l[F] += E, C = ce * y[G], E = ce * x[G];
1893
1893
  }
1894
1894
  }
1895
1895
  for (; F < D.SBMAX_l; ++F)
1896
1896
  b.en[Y].l[F] = 0, b.thm[Y].l[F] = 0;
1897
1897
  }
1898
- function c(b, y, x, Y, F, S) {
1898
+ function c(b, y, x, Y, F, G) {
1899
1899
  var C = b.internal_flags, E, B;
1900
1900
  for (B = E = 0; B < C.npart_s; ++B) {
1901
1901
  for (var $ = 0, z = C.numlines_s[B], q = 0; q < z; ++q, ++E) {
1902
- var ce = y[S][E];
1902
+ var ce = y[G][E];
1903
1903
  $ += ce;
1904
1904
  }
1905
1905
  x[B] = $;
@@ -1924,8 +1924,8 @@ function qn() {
1924
1924
  function M(b, y, x, Y) {
1925
1925
  var F = b.internal_flags;
1926
1926
  b.short_blocks == L0.short_block_coupled && !(y[0] != 0 && y[1] != 0) && (y[0] = y[1] = 0);
1927
- for (var S = 0; S < F.channels_out; S++)
1928
- Y[S] = D.NORM_TYPE, b.short_blocks == L0.short_block_dispensed && (y[S] = 1), b.short_blocks == L0.short_block_forced && (y[S] = 0), y[S] != 0 ? (ue(F.blocktype_old[S] != D.START_TYPE), F.blocktype_old[S] == D.SHORT_TYPE && (Y[S] = D.STOP_TYPE)) : (Y[S] = D.SHORT_TYPE, F.blocktype_old[S] == D.NORM_TYPE && (F.blocktype_old[S] = D.START_TYPE), F.blocktype_old[S] == D.STOP_TYPE && (F.blocktype_old[S] = D.SHORT_TYPE)), x[S] = F.blocktype_old[S], F.blocktype_old[S] = Y[S];
1927
+ for (var G = 0; G < F.channels_out; G++)
1928
+ Y[G] = D.NORM_TYPE, b.short_blocks == L0.short_block_dispensed && (y[G] = 1), b.short_blocks == L0.short_block_forced && (y[G] = 0), y[G] != 0 ? (ue(F.blocktype_old[G] != D.START_TYPE), F.blocktype_old[G] == D.SHORT_TYPE && (Y[G] = D.STOP_TYPE)) : (Y[G] = D.SHORT_TYPE, F.blocktype_old[G] == D.NORM_TYPE && (F.blocktype_old[G] = D.START_TYPE), F.blocktype_old[G] == D.STOP_TYPE && (F.blocktype_old[G] = D.SHORT_TYPE)), x[G] = F.blocktype_old[G], F.blocktype_old[G] = Y[G];
1929
1929
  }
1930
1930
  function L(b, y, x) {
1931
1931
  return x >= 1 ? b : x <= 0 ? y : y > 0 ? Math.pow(b / y, x) * y : 0;
@@ -1948,9 +1948,9 @@ function qn() {
1948
1948
  function ae(b, y) {
1949
1949
  for (var x = 309.07, Y = 0; Y < D.SBMAX_s - 1; Y++)
1950
1950
  for (var F = 0; F < 3; F++) {
1951
- var S = b.thm.s[Y][F];
1952
- if (ue(Y < ee.length), S > 0) {
1953
- var C = S * y, E = b.en.s[Y][F];
1951
+ var G = b.thm.s[Y][F];
1952
+ if (ue(Y < ee.length), G > 0) {
1953
+ var C = G * y, E = b.en.s[Y][F];
1954
1954
  E > C && (E > C * 1e10 ? x += ee[Y] * (10 * e) : (ue(C > 0), x += ee[Y] * mt.FAST_LOG10(E / C)));
1955
1955
  }
1956
1956
  }
@@ -1984,48 +1984,48 @@ function qn() {
1984
1984
  for (var x = 281.0575, Y = 0; Y < D.SBMAX_l - 1; Y++) {
1985
1985
  var F = b.thm.l[Y];
1986
1986
  if (ue(Y < le.length), F > 0) {
1987
- var S = F * y, C = b.en.l[Y];
1988
- C > S && (C > S * 1e10 ? x += le[Y] * (10 * e) : (ue(S > 0), x += le[Y] * mt.FAST_LOG10(C / S)));
1987
+ var G = F * y, C = b.en.l[Y];
1988
+ C > G && (C > G * 1e10 ? x += le[Y] * (10 * e) : (ue(G > 0), x += le[Y] * mt.FAST_LOG10(C / G)));
1989
1989
  }
1990
1990
  }
1991
1991
  return x;
1992
1992
  }
1993
1993
  function _e(b, y, x, Y, F) {
1994
- var S, C;
1995
- for (S = C = 0; S < b.npart_l; ++S) {
1994
+ var G, C;
1995
+ for (G = C = 0; G < b.npart_l; ++G) {
1996
1996
  var E = 0, B = 0, $;
1997
- for ($ = 0; $ < b.numlines_l[S]; ++$, ++C) {
1997
+ for ($ = 0; $ < b.numlines_l[G]; ++$, ++C) {
1998
1998
  var z = y[C];
1999
1999
  ue(z >= 0), E += z, B < z && (B = z);
2000
2000
  }
2001
- x[S] = E, Y[S] = B, F[S] = E * b.rnumlines_l[S], ue(b.rnumlines_l[S] >= 0), ue(E >= 0), ue(x[S] >= 0), ue(Y[S] >= 0), ue(F[S] >= 0);
2001
+ x[G] = E, Y[G] = B, F[G] = E * b.rnumlines_l[G], ue(b.rnumlines_l[G] >= 0), ue(E >= 0), ue(x[G] >= 0), ue(Y[G] >= 0), ue(F[G] >= 0);
2002
2002
  }
2003
2003
  }
2004
2004
  function he(b, y, x, Y) {
2005
- var F = H.length - 1, S = 0, C = x[S] + x[S + 1];
2005
+ var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
2006
2006
  if (ue(C >= 0), C > 0) {
2007
- var E = y[S];
2008
- E < y[S + 1] && (E = y[S + 1]), ue(b.numlines_l[S] + b.numlines_l[S + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[S] + b.numlines_l[S + 1] - 1));
2007
+ var E = y[G];
2008
+ E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G] + b.numlines_l[G + 1] - 1));
2009
2009
  var B = 0 | C;
2010
- B > F && (B = F), Y[S] = B;
2010
+ B > F && (B = F), Y[G] = B;
2011
2011
  } else
2012
- Y[S] = 0;
2013
- for (S = 1; S < b.npart_l - 1; S++)
2014
- if (C = x[S - 1] + x[S] + x[S + 1], ue(C >= 0), C > 0) {
2015
- var E = y[S - 1];
2016
- E < y[S] && (E = y[S]), E < y[S + 1] && (E = y[S + 1]), ue(b.numlines_l[S - 1] + b.numlines_l[S] + b.numlines_l[S + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_l[S - 1] + b.numlines_l[S] + b.numlines_l[S + 1] - 1));
2012
+ Y[G] = 0;
2013
+ for (G = 1; G < b.npart_l - 1; G++)
2014
+ if (C = x[G - 1] + x[G] + x[G + 1], ue(C >= 0), C > 0) {
2015
+ var E = y[G - 1];
2016
+ E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1));
2017
2017
  var B = 0 | C;
2018
- B > F && (B = F), Y[S] = B;
2018
+ B > F && (B = F), Y[G] = B;
2019
2019
  } else
2020
- Y[S] = 0;
2021
- if (ue(S > 0), ue(S == b.npart_l - 1), C = x[S - 1] + x[S], ue(C >= 0), C > 0) {
2022
- var E = y[S - 1];
2023
- E < y[S] && (E = y[S]), ue(b.numlines_l[S - 1] + b.numlines_l[S] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[S - 1] + b.numlines_l[S] - 1));
2020
+ Y[G] = 0;
2021
+ if (ue(G > 0), ue(G == b.npart_l - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
2022
+ var E = y[G - 1];
2023
+ E < y[G] && (E = y[G]), ue(b.numlines_l[G - 1] + b.numlines_l[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] - 1));
2024
2024
  var B = 0 | C;
2025
- B > F && (B = F), Y[S] = B;
2025
+ B > F && (B = F), Y[G] = B;
2026
2026
  } else
2027
- Y[S] = 0;
2028
- ue(S == b.npart_l - 1);
2027
+ Y[G] = 0;
2028
+ ue(G == b.npart_l - 1);
2029
2029
  }
2030
2030
  var oe = [
2031
2031
  -865163e-23 * 2,
@@ -2039,7 +2039,7 @@ function qn() {
2039
2039
  -552212e-22 * 2,
2040
2040
  -0.313819 * 2
2041
2041
  ];
2042
- this.L3psycho_anal_ns = function(b, y, x, Y, F, S, C, E, B, $) {
2042
+ this.L3psycho_anal_ns = function(b, y, x, Y, F, G, C, E, B, $) {
2043
2043
  var z = b.internal_flags, q = kt([2, D.BLKSIZE]), ce = kt([2, 3, D.BLKSIZE_s]), Ze = je(D.CBANDS + 1), ie = je(D.CBANDS + 1), fe = je(D.CBANDS + 2), Q = h0(2), be = h0(2), Re, se, pe, te, Xe, ke, de, Ie, Te = kt([2, 576]), ge, Lt = h0(D.CBANDS + 2), Ae = h0(D.CBANDS + 2);
2044
2044
  for (Dn.fill(Ae, 0), Re = z.channels_out, b.mode == MPEGMode.JOINT_STEREO && (Re = 4), b.VBR == W0.vbr_off ? ge = z.ResvMax == 0 ? 0 : z.ResvSize / z.ResvMax * 0.5 : b.VBR == W0.vbr_rh || b.VBR == W0.vbr_mtrh || b.VBR == W0.vbr_mt ? ge = 0.6 : ge = 1, se = 0; se < z.channels_out; se++) {
2045
2045
  var Be = y[se], ct = x + 576 - 350 - w + 192;
@@ -2049,7 +2049,7 @@ function qn() {
2049
2049
  xt += oe[Xe] * (Be[ct + te + Xe] + Be[ct + te + w - Xe]), Ht += oe[Xe + 1] * (Be[ct + te + Xe + 1] + Be[ct + te + w - Xe - 1]);
2050
2050
  Te[se][te] = xt + Ht;
2051
2051
  }
2052
- F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (S[Y][se].en.assign(z.en[se + 2]), S[Y][se].thm.assign(z.thm[se + 2]));
2052
+ F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (G[Y][se].en.assign(z.en[se + 2]), G[Y][se].thm.assign(z.thm[se + 2]));
2053
2053
  }
2054
2054
  for (se = 0; se < Re; se++) {
2055
2055
  var Jt, Et, nt = je(12), zt = [0, 0, 0, 0], T0 = je(12), _i = 1, os, cs = je(D.CBANDS), ds = je(D.CBANDS), Fe = [0, 0, 0, 0], ms = je(D.HBLKSIZE), us = kt([3, D.HBLKSIZE_s]);
@@ -2057,8 +2057,8 @@ function qn() {
2057
2057
  nt[te] = z.nsPsy.last_en_subshort[se][te + 6], ue(z.nsPsy.last_en_subshort[se][te + 4] > 0), T0[te] = nt[te] / z.nsPsy.last_en_subshort[se][te + 4], zt[0] += nt[te];
2058
2058
  if (se == 2)
2059
2059
  for (te = 0; te < 576; te++) {
2060
- var Gi, Si;
2061
- Gi = Te[0][te], Si = Te[1][te], Te[0][te] = Gi + Si, Te[1][te] = Gi - Si;
2060
+ var Si, Gi;
2061
+ Si = Te[0][te], Gi = Te[1][te], Te[0][te] = Si + Gi, Te[1][te] = Si - Gi;
2062
2062
  }
2063
2063
  {
2064
2064
  var hs = Te[se & 1], g0 = 0;
@@ -2146,11 +2146,11 @@ function qn() {
2146
2146
  }
2147
2147
  for (M(b, be, $, Q), se = 0; se < Re; se++) {
2148
2148
  var J0, E0 = 0, ei, ti;
2149
- se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti = S[Y][se - 2]) : (J0 = C, E0 = 0, ei = $[se], ti = F[Y][se]), ei == D.SHORT_TYPE ? J0[E0 + se] = ae(ti, z.masking_lower) : J0[E0 + se] = re(ti, z.masking_lower), b.analysis && (z.pinfo.pe[Y][se] = J0[E0 + se]);
2149
+ se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti = G[Y][se - 2]) : (J0 = C, E0 = 0, ei = $[se], ti = F[Y][se]), ei == D.SHORT_TYPE ? J0[E0 + se] = ae(ti, z.masking_lower) : J0[E0 + se] = re(ti, z.masking_lower), b.analysis && (z.pinfo.pe[Y][se] = J0[E0 + se]);
2150
2150
  }
2151
2151
  return 0;
2152
2152
  };
2153
- function Le(b, y, x, Y, F, S, C, E) {
2153
+ function Le(b, y, x, Y, F, G, C, E) {
2154
2154
  var B = b.internal_flags;
2155
2155
  if (Y < 2)
2156
2156
  t.fft_long(B, C[E], Y, y, x);
@@ -2159,33 +2159,33 @@ function qn() {
2159
2159
  var z = C[E + 0][$], q = C[E + 1][$];
2160
2160
  C[E + 0][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][$] = (z - q) * mt.SQRT2 * 0.5;
2161
2161
  }
2162
- S[0] = C[E + 0][0], S[0] *= S[0];
2162
+ G[0] = C[E + 0][0], G[0] *= G[0];
2163
2163
  for (var $ = D.BLKSIZE / 2 - 1; $ >= 0; --$) {
2164
2164
  var ce = C[E + 0][D.BLKSIZE / 2 - $], Ze = C[E + 0][D.BLKSIZE / 2 + $];
2165
- S[D.BLKSIZE / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
2165
+ G[D.BLKSIZE / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
2166
2166
  }
2167
2167
  {
2168
2168
  for (var ie = 0, $ = 11; $ < D.HBLKSIZE; $++)
2169
- ie += S[$];
2169
+ ie += G[$];
2170
2170
  B.tot_ener[Y] = ie;
2171
2171
  }
2172
2172
  if (b.analysis) {
2173
2173
  for (var $ = 0; $ < D.HBLKSIZE; $++)
2174
- B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] = S[$];
2174
+ B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] = G[$];
2175
2175
  B.pinfo.pe[F][Y] = B.pe[Y];
2176
2176
  }
2177
2177
  }
2178
- function ze(b, y, x, Y, F, S, C, E) {
2178
+ function ze(b, y, x, Y, F, G, C, E) {
2179
2179
  var B = b.internal_flags;
2180
2180
  if (F == 0 && Y < 2 && t.fft_short(B, C[E], Y, y, x), Y == 2)
2181
2181
  for (var $ = D.BLKSIZE_s - 1; $ >= 0; --$) {
2182
2182
  var z = C[E + 0][F][$], q = C[E + 1][F][$];
2183
2183
  C[E + 0][F][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][F][$] = (z - q) * mt.SQRT2 * 0.5;
2184
2184
  }
2185
- S[F][0] = C[E + 0][F][0], S[F][0] *= S[F][0];
2185
+ G[F][0] = C[E + 0][F][0], G[F][0] *= G[F][0];
2186
2186
  for (var $ = D.BLKSIZE_s / 2 - 1; $ >= 0; --$) {
2187
2187
  var ce = C[E + 0][F][D.BLKSIZE_s / 2 - $], Ze = C[E + 0][F][D.BLKSIZE_s / 2 + $];
2188
- S[F][D.BLKSIZE_s / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
2188
+ G[F][D.BLKSIZE_s / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
2189
2189
  }
2190
2190
  }
2191
2191
  function We(b, y, x, Y) {
@@ -2204,7 +2204,7 @@ function qn() {
2204
2204
  -552212e-22 * 2,
2205
2205
  -0.313819 * 2
2206
2206
  ];
2207
- function Ke(b, y, x, Y, F, S, C, E, B, $) {
2207
+ function Ke(b, y, x, Y, F, G, C, E, B, $) {
2208
2208
  for (var z = kt([2, 576]), q = b.internal_flags, ce = q.channels_out, Ze = b.mode == MPEGMode.JOINT_STEREO ? 4 : ce, ie = 0; ie < ce; ie++) {
2209
2209
  firbuf = y[ie];
2210
2210
  var fe = x + 576 - 350 - w + 192;
@@ -2216,7 +2216,7 @@ function qn() {
2216
2216
  be += we[se] * (firbuf[fe + Q + se] + firbuf[fe + Q + w - se]), Re += we[se + 1] * (firbuf[fe + Q + se + 1] + firbuf[fe + Q + w - se - 1]);
2217
2217
  z[ie][Q] = be + Re;
2218
2218
  }
2219
- F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (S[Y][ie].en.assign(q.en[ie + 2]), S[Y][ie].thm.assign(q.thm[ie + 2]));
2219
+ F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (G[Y][ie].en.assign(q.en[ie + 2]), G[Y][ie].thm.assign(q.thm[ie + 2]));
2220
2220
  }
2221
2221
  for (var ie = 0; ie < Ze; ie++) {
2222
2222
  var pe = je(12), te = je(12), Xe = [0, 0, 0, 0], ke = z[ie & 1], de = 0, Ie = ie == 3 ? q.nsPsy.attackthre_s : q.nsPsy.attackthre, Te = 1;
@@ -2260,37 +2260,37 @@ function qn() {
2260
2260
  b.nb_2[y][x] = b.nb_1[y][x], b.nb_1[y][x] = 0;
2261
2261
  }
2262
2262
  function a0(b, y, x, Y) {
2263
- var F = H.length - 1, S = 0, C = x[S] + x[S + 1];
2263
+ var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
2264
2264
  if (ue(C >= 0), C > 0) {
2265
- var E = y[S];
2266
- E < y[S + 1] && (E = y[S + 1]), ue(b.numlines_s[S] + b.numlines_s[S + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[S] + b.numlines_s[S + 1] - 1));
2265
+ var E = y[G];
2266
+ E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G] + b.numlines_s[G + 1] - 1));
2267
2267
  var B = 0 | C;
2268
- B > F && (B = F), Y[S] = B;
2268
+ B > F && (B = F), Y[G] = B;
2269
2269
  } else
2270
- Y[S] = 0;
2271
- for (S = 1; S < b.npart_s - 1; S++)
2272
- if (C = x[S - 1] + x[S] + x[S + 1], ue(S + 1 < b.npart_s), ue(C >= 0), C > 0) {
2273
- var E = y[S - 1];
2274
- E < y[S] && (E = y[S]), E < y[S + 1] && (E = y[S + 1]), ue(b.numlines_s[S - 1] + b.numlines_s[S] + b.numlines_s[S + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_s[S - 1] + b.numlines_s[S] + b.numlines_s[S + 1] - 1));
2270
+ Y[G] = 0;
2271
+ for (G = 1; G < b.npart_s - 1; G++)
2272
+ if (C = x[G - 1] + x[G] + x[G + 1], ue(G + 1 < b.npart_s), ue(C >= 0), C > 0) {
2273
+ var E = y[G - 1];
2274
+ E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1));
2275
2275
  var B = 0 | C;
2276
- B > F && (B = F), Y[S] = B;
2276
+ B > F && (B = F), Y[G] = B;
2277
2277
  } else
2278
- Y[S] = 0;
2279
- if (ue(S > 0), ue(S == b.npart_s - 1), C = x[S - 1] + x[S], ue(C >= 0), C > 0) {
2280
- var E = y[S - 1];
2281
- E < y[S] && (E = y[S]), ue(b.numlines_s[S - 1] + b.numlines_s[S] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[S - 1] + b.numlines_s[S] - 1));
2278
+ Y[G] = 0;
2279
+ if (ue(G > 0), ue(G == b.npart_s - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
2280
+ var E = y[G - 1];
2281
+ E < y[G] && (E = y[G]), ue(b.numlines_s[G - 1] + b.numlines_s[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] - 1));
2282
2282
  var B = 0 | C;
2283
- B > F && (B = F), Y[S] = B;
2283
+ B > F && (B = F), Y[G] = B;
2284
2284
  } else
2285
- Y[S] = 0;
2286
- ue(S == b.npart_s - 1);
2285
+ Y[G] = 0;
2286
+ ue(G == b.npart_s - 1);
2287
2287
  }
2288
- function gt(b, y, x, Y, F, S) {
2288
+ function gt(b, y, x, Y, F, G) {
2289
2289
  var C = b.internal_flags, E = new float[D.CBANDS](), B = je(D.CBANDS), $, z, q, ce = new int[D.CBANDS]();
2290
2290
  for (q = z = 0; q < C.npart_s; ++q) {
2291
2291
  var Ze = 0, ie = 0, fe = C.numlines_s[q];
2292
2292
  for ($ = 0; $ < fe; ++$, ++z) {
2293
- var Q = y[S][z];
2293
+ var Q = y[G][z];
2294
2294
  Ze += Q, ie < Q && (ie = Q);
2295
2295
  }
2296
2296
  x[q] = Ze, ue(Ze >= 0), E[q] = ie, ue(fe > 0), B[q] = Ze / fe, ue(B[q] >= 0);
@@ -2307,8 +2307,8 @@ function qn() {
2307
2307
  x[q] = 0, Y[q] = 0;
2308
2308
  }
2309
2309
  function Ft(b, y, x, Y, F) {
2310
- var S = je(D.CBANDS), C = je(D.CBANDS), E = h0(D.CBANDS + 2), B;
2311
- _e(b, y, x, S, C), he(b, S, C, E);
2310
+ var G = je(D.CBANDS), C = je(D.CBANDS), E = h0(D.CBANDS + 2), B;
2311
+ _e(b, y, x, G, C), he(b, G, C, E);
2312
2312
  var $ = 0;
2313
2313
  for (B = 0; B < b.npart_l; B++) {
2314
2314
  var z, q, ce, Ze, ie = b.s3ind[B][0], fe = b.s3ind[B][1], Q = 0, be = 0;
@@ -2321,7 +2321,7 @@ function qn() {
2321
2321
  var se = n * b.nb_2[F][B], pe = i * b.nb_1[F][B], Re;
2322
2322
  se <= 0 && (se = q), pe <= 0 && (pe = q), b.blocktype_old[F & 1] == D.NORM_TYPE ? Re = Math.min(pe, se) : Re = pe, Y[B] = Math.min(q, Re);
2323
2323
  }
2324
- b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z = S[B], z *= b.minval_l[B], z *= ce, Y[B] > z && (Y[B] = z), b.masking_lower > 1 && (Y[B] *= b.masking_lower), Y[B] > x[B] && (Y[B] = x[B]), b.masking_lower < 1 && (Y[B] *= b.masking_lower), ue(Y[B] >= 0);
2324
+ b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z = G[B], z *= b.minval_l[B], z *= ce, Y[B] > z && (Y[B] = z), b.masking_lower > 1 && (Y[B] *= b.masking_lower), Y[B] > x[B] && (Y[B] = x[B]), b.masking_lower < 1 && (Y[B] *= b.masking_lower), ue(Y[B] >= 0);
2325
2325
  }
2326
2326
  for (; B < D.CBANDS; ++B)
2327
2327
  x[B] = 0, Y[B] = 0;
@@ -2334,19 +2334,19 @@ function qn() {
2334
2334
  }
2335
2335
  function $0(b, y, x) {
2336
2336
  for (var Y = b.internal_flags, F = 0; F < Y.channels_out; F++) {
2337
- var S = D.NORM_TYPE;
2338
- y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (S = D.STOP_TYPE)) : (S = D.SHORT_TYPE, Y.blocktype_old[F] == D.NORM_TYPE && (Y.blocktype_old[F] = D.START_TYPE), Y.blocktype_old[F] == D.STOP_TYPE && (Y.blocktype_old[F] = D.SHORT_TYPE)), x[F] = Y.blocktype_old[F], Y.blocktype_old[F] = S;
2337
+ var G = D.NORM_TYPE;
2338
+ y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (G = D.STOP_TYPE)) : (G = D.SHORT_TYPE, Y.blocktype_old[F] == D.NORM_TYPE && (Y.blocktype_old[F] = D.START_TYPE), Y.blocktype_old[F] == D.STOP_TYPE && (Y.blocktype_old[F] = D.SHORT_TYPE)), x[F] = Y.blocktype_old[F], Y.blocktype_old[F] = G;
2339
2339
  }
2340
2340
  }
2341
- function C0(b, y, x, Y, F, S, C) {
2342
- for (var E = S * 2, B = S > 0 ? Math.pow(10, F) : 1, $, z, q = 0; q < C; ++q) {
2341
+ function C0(b, y, x, Y, F, G, C) {
2342
+ for (var E = G * 2, B = G > 0 ? Math.pow(10, F) : 1, $, z, q = 0; q < C; ++q) {
2343
2343
  var ce = b[2][q], Ze = b[3][q], ie = y[0][q], fe = y[1][q], Q = y[2][q], be = y[3][q];
2344
2344
  if (ie <= 1.58 * fe && fe <= 1.58 * ie) {
2345
2345
  var Re = x[q] * Ze, se = x[q] * ce;
2346
2346
  z = Math.max(Q, Math.min(be, Re)), $ = Math.max(be, Math.min(Q, se));
2347
2347
  } else
2348
2348
  z = Q, $ = be;
2349
- if (S > 0) {
2349
+ if (G > 0) {
2350
2350
  var pe, te, Xe = Y[q] * B;
2351
2351
  if (pe = Math.min(Math.max(ie, Xe), Math.max(fe, Xe)), Q = Math.max(z, Xe), be = Math.max($, Xe), te = Q + be, te > 0 && pe * E < te) {
2352
2352
  var ke = pe * E / te;
@@ -2357,7 +2357,7 @@ function qn() {
2357
2357
  z > ce && (z = ce), $ > Ze && ($ = Ze), y[2][q] = z, y[3][q] = $;
2358
2358
  }
2359
2359
  }
2360
- this.L3psycho_anal_vbr = function(b, y, x, Y, F, S, C, E, B, $) {
2360
+ this.L3psycho_anal_vbr = function(b, y, x, Y, F, G, C, E, B, $) {
2361
2361
  var z = b.internal_flags, q, ce, Ze = je(D.HBLKSIZE), ie = kt([3, D.HBLKSIZE_s]), fe = kt([2, D.BLKSIZE]), Q = kt([2, 3, D.BLKSIZE_s]), be = kt([4, D.CBANDS]), Re = kt([4, D.CBANDS]), se = kt([4, 3]), pe = 0.6, te = [
2362
2362
  [0, 0, 0, 0],
2363
2363
  [0, 0, 0, 0],
@@ -2370,7 +2370,7 @@ function qn() {
2370
2370
  x,
2371
2371
  Y,
2372
2372
  F,
2373
- S,
2373
+ G,
2374
2374
  B,
2375
2375
  se,
2376
2376
  te,
@@ -2497,7 +2497,7 @@ function qn() {
2497
2497
  $0(b, Xe, $);
2498
2498
  for (var de = 0; de < ke; de++) {
2499
2499
  var xt, Ht, Jt, Et;
2500
- de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et = S[Y][de - 2]) : (xt = C, Ht = 0, Jt = $[de], Et = F[Y][de]), Jt == D.SHORT_TYPE ? xt[Ht + de] = ae(Et, z.masking_lower) : xt[Ht + de] = re(Et, z.masking_lower), b.analysis && (z.pinfo.pe[Y][de] = xt[Ht + de]);
2500
+ de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et = G[Y][de - 2]) : (xt = C, Ht = 0, Jt = $[de], Et = F[Y][de]), Jt == D.SHORT_TYPE ? xt[Ht + de] = ae(Et, z.masking_lower) : xt[Ht + de] = re(Et, z.masking_lower), b.analysis && (z.pinfo.pe[Y][de] = xt[Ht + de]);
2501
2501
  }
2502
2502
  return 0;
2503
2503
  };
@@ -2508,20 +2508,20 @@ function qn() {
2508
2508
  function q0(b) {
2509
2509
  var y = 0, x = 0;
2510
2510
  {
2511
- var Y = 0, F, S;
2511
+ var Y = 0, F, G;
2512
2512
  for (Y = 0; Mt(Y, b) > 1e-20; Y -= 1)
2513
2513
  ;
2514
- for (F = Y, S = 0; Math.abs(S - F) > 1e-12; )
2515
- Y = (S + F) / 2, Mt(Y, b) > 0 ? S = Y : F = Y;
2514
+ for (F = Y, G = 0; Math.abs(G - F) > 1e-12; )
2515
+ Y = (G + F) / 2, Mt(Y, b) > 0 ? G = Y : F = Y;
2516
2516
  y = F;
2517
2517
  }
2518
2518
  {
2519
- var Y = 0, F, S;
2519
+ var Y = 0, F, G;
2520
2520
  for (Y = 0; Mt(Y, b) > 1e-20; Y += 1)
2521
2521
  ;
2522
- for (F = 0, S = Y; Math.abs(S - F) > 1e-12; )
2523
- Y = (S + F) / 2, Mt(Y, b) > 0 ? F = Y : S = Y;
2524
- x = S;
2522
+ for (F = 0, G = Y; Math.abs(G - F) > 1e-12; )
2523
+ Y = (G + F) / 2, Mt(Y, b) > 0 ? F = Y : G = Y;
2524
+ x = G;
2525
2525
  }
2526
2526
  {
2527
2527
  var C = 0, E = 1e3, B;
@@ -2542,7 +2542,7 @@ function qn() {
2542
2542
  function o0(b) {
2543
2543
  return b < 0 && (b = 0), b = b * 1e-3, 13 * Math.atan(0.76 * b) + 3.5 * Math.atan(b * b / (7.5 * 7.5));
2544
2544
  }
2545
- function rs(b, y, x, Y, F, S, C, E, B, $, z, q) {
2545
+ function rs(b, y, x, Y, F, G, C, E, B, $, z, q) {
2546
2546
  var ce = je(D.CBANDS + 1), Ze = E / (q > 15 ? 2 * 576 : 2 * 192), ie = h0(D.HBLKSIZE), fe;
2547
2547
  E /= B;
2548
2548
  var Q = 0, be = 0;
@@ -2562,7 +2562,7 @@ function qn() {
2562
2562
  var te, Xe, ke, de, Ie;
2563
2563
  ke = $[pe], de = $[pe + 1], te = 0 | Math.floor(0.5 + z * (ke - 0.5)), te < 0 && (te = 0), Xe = 0 | Math.floor(0.5 + z * (de - 0.5)), Xe > B / 2 && (Xe = B / 2), x[pe] = (ie[te] + ie[Xe]) / 2, y[pe] = ie[Xe];
2564
2564
  var Te = Ze * de;
2565
- C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5, S[pe] = Math.pow(
2565
+ C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5, G[pe] = Math.pow(
2566
2566
  10,
2567
2567
  1.25 * (1 - Math.cos(Math.PI * Ie)) - 2.5
2568
2568
  );
@@ -2574,9 +2574,9 @@ function qn() {
2574
2574
  }
2575
2575
  return be;
2576
2576
  }
2577
- function as(b, y, x, Y, F, S) {
2577
+ function as(b, y, x, Y, F, G) {
2578
2578
  var C = kt([D.CBANDS, D.CBANDS]), E, B = 0;
2579
- if (S)
2579
+ if (G)
2580
2580
  for (var $ = 0; $ < y; $++)
2581
2581
  for (E = 0; E < y; E++) {
2582
2582
  var z = Xi(x[$] - x[E]) * Y[E];
@@ -2608,7 +2608,7 @@ function qn() {
2608
2608
  );
2609
2609
  }
2610
2610
  this.psymodel_init = function(b) {
2611
- var y = b.internal_flags, x, Y = !0, F = 13, S = 24, C = 0, E = 0, B = -8.25, $ = -4.5, z = je(D.CBANDS), q = je(D.CBANDS), ce = je(D.CBANDS), Ze = b.out_samplerate;
2611
+ var y = b.internal_flags, x, Y = !0, F = 13, G = 24, C = 0, E = 0, B = -8.25, $ = -4.5, z = je(D.CBANDS), q = je(D.CBANDS), ce = je(D.CBANDS), Ze = b.out_samplerate;
2612
2612
  switch (b.experimentalZ) {
2613
2613
  default:
2614
2614
  case 0:
@@ -2652,7 +2652,7 @@ function qn() {
2652
2652
  D.SBMAX_l
2653
2653
  ), ue(y.npart_l < D.CBANDS), x = 0; x < y.npart_l; x++) {
2654
2654
  var fe = C;
2655
- z[x] >= F && (fe = E * (z[x] - F) / (S - F) + C * (S - z[x]) / (S - F)), ce[x] = Math.pow(10, fe / 10), y.numlines_l[x] > 0 ? y.rnumlines_l[x] = 1 / y.numlines_l[x] : y.rnumlines_l[x] = 0;
2655
+ z[x] >= F && (fe = E * (z[x] - F) / (G - F) + C * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), y.numlines_l[x] > 0 ? y.rnumlines_l[x] = 1 / y.numlines_l[x] : y.rnumlines_l[x] = 0;
2656
2656
  }
2657
2657
  y.s3_ll = as(
2658
2658
  y.s3ind,
@@ -2665,7 +2665,7 @@ function qn() {
2665
2665
  var Q = 0;
2666
2666
  for (x = 0; x < y.npart_l; x++) {
2667
2667
  var be;
2668
- be = Gs.MAX_VALUE;
2668
+ be = Ss.MAX_VALUE;
2669
2669
  for (var Re = 0; Re < y.numlines_l[x]; Re++, Q++) {
2670
2670
  var se = Ze * Q / (1e3 * D.BLKSIZE), pe;
2671
2671
  pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_l[x], be > pe && (be = pe);
@@ -2687,7 +2687,7 @@ function qn() {
2687
2687
  D.SBMAX_s
2688
2688
  ), ue(y.npart_s < D.CBANDS), Q = 0, x = 0; x < y.npart_s; x++) {
2689
2689
  var be, fe = B;
2690
- z[x] >= F && (fe = $ * (z[x] - F) / (S - F) + B * (S - z[x]) / (S - F)), ce[x] = Math.pow(10, fe / 10), be = Gs.MAX_VALUE;
2690
+ z[x] >= F && (fe = $ * (z[x] - F) / (G - F) + B * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), be = Ss.MAX_VALUE;
2691
2691
  for (var Re = 0; Re < y.numlines_s[x]; Re++, Q++) {
2692
2692
  var se = Ze * Q / (1e3 * D.BLKSIZE_s), pe;
2693
2693
  pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_s[x], be > pe && (be = pe);
@@ -2701,7 +2701,7 @@ function qn() {
2701
2701
  q,
2702
2702
  ce,
2703
2703
  Y
2704
- ), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (G * Ze / 192));
2704
+ ), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (S * Ze / 192));
2705
2705
  {
2706
2706
  var te;
2707
2707
  te = O, b.exp_nspsytune & 2 && (te = 1), Math.abs(b.msfix) > 0 && (te = b.msfix), b.msfix = te;
@@ -2817,12 +2817,12 @@ Zt.new_byte;
2817
2817
  Zt.new_double;
2818
2818
  Zt.new_float;
2819
2819
  Zt.new_float_n;
2820
- var Ss = Zt.new_int;
2820
+ var Gs = Zt.new_int;
2821
2821
  Zt.new_int_n;
2822
2822
  Zt.assert;
2823
2823
  var lr = rn;
2824
2824
  function or() {
2825
- this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [Ss(4), Ss(4)];
2825
+ this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [Gs(4), Gs(4)];
2826
2826
  for (var t = 0; t < 2; t++)
2827
2827
  for (var e = 0; e < 2; e++)
2828
2828
  this.tt[t][e] = new lr();
@@ -2868,17 +2868,17 @@ var br = hr;
2868
2868
  function pr() {
2869
2869
  this.sum = 0, this.seen = 0, this.want = 0, this.pos = 0, this.size = 0, this.bag = null, this.nVbrNumFrames = 0, this.nBytesWritten = 0, this.TotalFrameSize = 0;
2870
2870
  }
2871
- var yr = pr, Gt = it;
2872
- Gt.System;
2873
- Gt.VbrMode;
2874
- Gt.Float;
2875
- Gt.ShortBlock;
2876
- Gt.Util;
2877
- Gt.Arrays;
2878
- Gt.new_array_n;
2879
- var fr = Gt.new_byte, Zr = Gt.new_double, Bt = Gt.new_float, p0 = Gt.new_float_n, Nt = Gt.new_int, ri = Gt.new_int_n;
2880
- Gt.assert;
2881
- var Xr = cr, _r = an, Gr = br, Sr = yr, Is = sn(), Pe = bt(), vr = Qi;
2871
+ var yr = pr, St = it;
2872
+ St.System;
2873
+ St.VbrMode;
2874
+ St.Float;
2875
+ St.ShortBlock;
2876
+ St.Util;
2877
+ St.Arrays;
2878
+ St.new_array_n;
2879
+ var fr = St.new_byte, Zr = St.new_double, Bt = St.new_float, p0 = St.new_float_n, Nt = St.new_int, ri = St.new_int_n;
2880
+ St.assert;
2881
+ var Xr = cr, _r = an, Sr = br, Gr = yr, Is = sn(), Pe = bt(), vr = Qi;
2882
2882
  n0.MFSIZE = 3 * 1152 + Pe.ENCDELAY - Pe.MDCTDELAY;
2883
2883
  n0.MAX_HEADER_BUF = 256;
2884
2884
  n0.MAX_BITS_PER_CHANNEL = 4095;
@@ -2890,7 +2890,7 @@ function n0() {
2890
2890
  function e() {
2891
2891
  this.write_timing = 0, this.ptr = 0, this.buf = fr(t);
2892
2892
  }
2893
- this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new _r(), this.minval_l = Bt(Pe.CBANDS), this.minval_s = Bt(Pe.CBANDS), this.nb_1 = p0([4, Pe.CBANDS]), this.nb_2 = p0([4, Pe.CBANDS]), this.nb_s1 = p0([4, Pe.CBANDS]), this.nb_s2 = p0([4, Pe.CBANDS]), this.s3_ss = null, this.s3_ll = null, this.decay = 0, this.thm = new Array(4), this.en = new Array(4), this.tot_ener = Bt(4), this.loudness_sq = p0([2, 2]), this.loudness_sq_save = Bt(2), this.mld_l = Bt(Pe.SBMAX_l), this.mld_s = Bt(Pe.SBMAX_s), this.bm_l = Nt(Pe.SBMAX_l), this.bo_l = Nt(Pe.SBMAX_l), this.bm_s = Nt(Pe.SBMAX_s), this.bo_s = Nt(Pe.SBMAX_s), this.npart_l = 0, this.npart_s = 0, this.s3ind = ri([Pe.CBANDS, 2]), this.s3ind_s = ri([Pe.CBANDS, 2]), this.numlines_s = Nt(Pe.CBANDS), this.numlines_l = Nt(Pe.CBANDS), this.rnumlines_l = Bt(Pe.CBANDS), this.mld_cb_l = Bt(Pe.CBANDS), this.mld_cb_s = Bt(Pe.CBANDS), this.numlines_s_num1 = 0, this.numlines_l_num1 = 0, this.pe = Bt(4), this.ms_ratio_s_old = 0, this.ms_ratio_l_old = 0, this.ms_ener_ratio_old = 0, this.blocktype_old = Nt(2), this.nsPsy = new Gr(), this.VBR_seek_table = new Sr(), this.ATH = null, this.PSY = null, this.nogap_total = 0, this.nogap_current = 0, this.decode_on_the_fly = !0, this.findReplayGain = !0, this.findPeakSample = !0, this.PeakSample = 0, this.RadioGain = 0, this.AudiophileGain = 0, this.rgdata = null, this.noclipGainChange = 0, this.noclipScale = 0, this.bitrate_stereoMode_Hist = ri([16, 5]), this.bitrate_blockType_Hist = ri([16, 6]), this.pinfo = null, this.hip = null, this.in_buffer_nsamples = 0, this.in_buffer_0 = null, this.in_buffer_1 = null, this.iteration_loop = null;
2893
+ this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new _r(), this.minval_l = Bt(Pe.CBANDS), this.minval_s = Bt(Pe.CBANDS), this.nb_1 = p0([4, Pe.CBANDS]), this.nb_2 = p0([4, Pe.CBANDS]), this.nb_s1 = p0([4, Pe.CBANDS]), this.nb_s2 = p0([4, Pe.CBANDS]), this.s3_ss = null, this.s3_ll = null, this.decay = 0, this.thm = new Array(4), this.en = new Array(4), this.tot_ener = Bt(4), this.loudness_sq = p0([2, 2]), this.loudness_sq_save = Bt(2), this.mld_l = Bt(Pe.SBMAX_l), this.mld_s = Bt(Pe.SBMAX_s), this.bm_l = Nt(Pe.SBMAX_l), this.bo_l = Nt(Pe.SBMAX_l), this.bm_s = Nt(Pe.SBMAX_s), this.bo_s = Nt(Pe.SBMAX_s), this.npart_l = 0, this.npart_s = 0, this.s3ind = ri([Pe.CBANDS, 2]), this.s3ind_s = ri([Pe.CBANDS, 2]), this.numlines_s = Nt(Pe.CBANDS), this.numlines_l = Nt(Pe.CBANDS), this.rnumlines_l = Bt(Pe.CBANDS), this.mld_cb_l = Bt(Pe.CBANDS), this.mld_cb_s = Bt(Pe.CBANDS), this.numlines_s_num1 = 0, this.numlines_l_num1 = 0, this.pe = Bt(4), this.ms_ratio_s_old = 0, this.ms_ratio_l_old = 0, this.ms_ener_ratio_old = 0, this.blocktype_old = Nt(2), this.nsPsy = new Sr(), this.VBR_seek_table = new Gr(), this.ATH = null, this.PSY = null, this.nogap_total = 0, this.nogap_current = 0, this.decode_on_the_fly = !0, this.findReplayGain = !0, this.findPeakSample = !0, this.PeakSample = 0, this.RadioGain = 0, this.AudiophileGain = 0, this.rgdata = null, this.noclipGainChange = 0, this.noclipScale = 0, this.bitrate_stereoMode_Hist = ri([16, 5]), this.bitrate_blockType_Hist = ri([16, 6]), this.pinfo = null, this.hip = null, this.in_buffer_nsamples = 0, this.in_buffer_0 = null, this.in_buffer_1 = null, this.iteration_loop = null;
2894
2894
  for (var i = 0; i < this.en.length; i++)
2895
2895
  this.en[i] = new Is();
2896
2896
  for (var i = 0; i < this.thm.length; i++)
@@ -2898,21 +2898,21 @@ function n0() {
2898
2898
  for (var i = 0; i < this.header.length; i++)
2899
2899
  this.header[i] = new e();
2900
2900
  }
2901
- var yi = n0, St = it;
2902
- St.System;
2903
- St.VbrMode;
2904
- St.Float;
2905
- St.ShortBlock;
2906
- St.Util;
2907
- St.Arrays;
2908
- St.new_array_n;
2909
- St.new_byte;
2910
- St.new_double;
2911
- var y0 = St.new_float;
2912
- St.new_float_n;
2913
- St.new_int;
2914
- St.new_int_n;
2915
- St.assert;
2901
+ var yi = n0, Gt = it;
2902
+ Gt.System;
2903
+ Gt.VbrMode;
2904
+ Gt.Float;
2905
+ Gt.ShortBlock;
2906
+ Gt.Util;
2907
+ Gt.Arrays;
2908
+ Gt.new_array_n;
2909
+ Gt.new_byte;
2910
+ Gt.new_double;
2911
+ var y0 = Gt.new_float;
2912
+ Gt.new_float_n;
2913
+ Gt.new_int;
2914
+ Gt.new_int_n;
2915
+ Gt.assert;
2916
2916
  var f0 = bt();
2917
2917
  function Ir() {
2918
2918
  this.useAdjust = 0, this.aaSensitivityP = 0, this.adjust = 0, this.adjustLimit = 0, this.decay = 0, this.floor = 0, this.l = y0(f0.SBMAX_l), this.s = y0(f0.SBMAX_s), this.psfb21 = y0(f0.PSFB21), this.psfb12 = y0(f0.PSFB12), this.cb_l = y0(f0.CBANDS), this.cb_s = y0(f0.CBANDS), this.eql_w = y0(f0.BLKSIZE / 2);
@@ -3232,7 +3232,7 @@ function Ce() {
3232
3232
  for (; J-- != 0; )
3233
3233
  w[N] = Z[O + 0] * U[0] - w[N - 1] * U[1] + Z[O - 1] * U[2] - w[N - 2] * U[3] + Z[O - 2] * U[4], ++N, ++O;
3234
3234
  }
3235
- function G(Z, O) {
3235
+ function S(Z, O) {
3236
3236
  for (var w = 0; w < MAX_ORDER; w++)
3237
3237
  Z.linprebuf[w] = Z.lstepbuf[w] = Z.loutbuf[w] = Z.rinprebuf[w] = Z.rstepbuf[w] = Z.routbuf[w] = 0;
3238
3238
  switch (0 | O) {
@@ -3269,7 +3269,7 @@ function Ce() {
3269
3269
  return Z.sampleWindow = 0 | (O * i + n - 1) / n, Z.lsum = 0, Z.rsum = 0, Z.totsamp = 0, Vs.ill(Z.A, 0), INIT_GAIN_ANALYSIS_OK;
3270
3270
  }
3271
3271
  this.InitGainAnalysis = function(Z, O) {
3272
- return G(Z, O) != INIT_GAIN_ANALYSIS_OK ? INIT_GAIN_ANALYSIS_ERROR : (Z.linpre = MAX_ORDER, Z.rinpre = MAX_ORDER, Z.lstep = MAX_ORDER, Z.rstep = MAX_ORDER, Z.lout = MAX_ORDER, Z.rout = MAX_ORDER, Vs.fill(Z.B, 0), INIT_GAIN_ANALYSIS_OK);
3272
+ return S(Z, O) != INIT_GAIN_ANALYSIS_OK ? INIT_GAIN_ANALYSIS_ERROR : (Z.linpre = MAX_ORDER, Z.rinpre = MAX_ORDER, Z.lstep = MAX_ORDER, Z.rstep = MAX_ORDER, Z.lout = MAX_ORDER, Z.rout = MAX_ORDER, Vs.fill(Z.B, 0), INIT_GAIN_ANALYSIS_OK);
3273
3273
  };
3274
3274
  function W(Z) {
3275
3275
  return Z * Z;
@@ -3448,7 +3448,7 @@ var Ws = Vt.assert, Hr = ln, Ls = bt(), Yr = Qi, wr = yi;
3448
3448
  function Kr(t) {
3449
3449
  var e = t;
3450
3450
  this.quantize = e, this.iteration_loop = function(i, n, d, o) {
3451
- var m = i.internal_flags, h = Ts(Yr.SFBMAX), G = Ts(576), W = xr(2), v = 0, Z, O = m.l3_side, w = new Hr(v);
3451
+ var m = i.internal_flags, h = Ts(Yr.SFBMAX), S = Ts(576), W = xr(2), v = 0, Z, O = m.l3_side, w = new Hr(v);
3452
3452
  this.quantize.rv.ResvFrameBegin(i, w), v = w.bits;
3453
3453
  for (var N = 0; N < m.mode_gr; N++) {
3454
3454
  Z = this.quantize.qupvt.on_pe(
@@ -3469,7 +3469,7 @@ function Kr(t) {
3469
3469
  I.block_type != Ls.SHORT_TYPE ? (U = 0, k = m.PSY.mask_adjust - U) : (U = 0, k = m.PSY.mask_adjust_short - U), m.masking_lower = Math.pow(
3470
3470
  10,
3471
3471
  k * 0.1
3472
- ), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I, G) && (this.quantize.qupvt.calc_xmin(
3472
+ ), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I, S) && (this.quantize.qupvt.calc_xmin(
3473
3473
  i,
3474
3474
  o[N][J],
3475
3475
  I,
@@ -3478,7 +3478,7 @@ function Kr(t) {
3478
3478
  i,
3479
3479
  I,
3480
3480
  h,
3481
- G,
3481
+ S,
3482
3482
  J,
3483
3483
  W[J]
3484
3484
  )), this.quantize.iteration_finish_one(m, N, J), Ws(I.part2_3_length <= wr.MAX_BITS_PER_CHANNEL), Ws(I.part2_3_length <= W[J]);
@@ -7007,7 +7007,7 @@ function wt() {
7007
7007
  this.IPOW20 = function(I) {
7008
7008
  return t0(0 <= I && I < wt.Q_MAX), O[I];
7009
7009
  };
7010
- var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX, G = wt.Q_MAX2;
7010
+ var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX, S = wt.Q_MAX2;
7011
7011
  wt.LARGE_BITS;
7012
7012
  var W = 100;
7013
7013
  this.nr_of_sfb_block = [
@@ -7378,7 +7378,7 @@ function wt() {
7378
7378
  /* sfb12 pseudo sub bands */
7379
7379
  )
7380
7380
  ];
7381
- var Z = X0(h + G + 1), O = X0(h), w = X0(m), N = X0(m);
7381
+ var Z = X0(h + S + 1), O = X0(h), w = X0(m), N = X0(m);
7382
7382
  this.adj43 = N;
7383
7383
  function J(I, r) {
7384
7384
  var K = i.ATHformula(r, I);
@@ -7443,8 +7443,8 @@ function wt() {
7443
7443
  );
7444
7444
  for (N[X] = 0.5, X = 0; X < h; X++)
7445
7445
  O[X] = Math.pow(2, (X - 210) * -0.1875);
7446
- for (X = 0; X <= h + G; X++)
7447
- Z[X] = Math.pow(2, (X - 210 - G) * 0.25);
7446
+ for (X = 0; X <= h + S; X++)
7447
+ Z[X] = Math.pow(2, (X - 210 - S) * 0.25);
7448
7448
  t.huffman_init(r);
7449
7449
  {
7450
7450
  var A, T, H, p;
@@ -7793,7 +7793,7 @@ function Ai() {
7793
7793
  } while (l < s);
7794
7794
  return g = j & 65535, j >>= 16, j > g && (j = g, V = _), R.bits += j, V;
7795
7795
  }
7796
- function G(u, l, s, V) {
7796
+ function S(u, l, s, V) {
7797
7797
  var _ = 0, R = Ee.ht[1].hlen;
7798
7798
  do {
7799
7799
  var f = u[l + 0] * 2 + u[l + 1];
@@ -7842,7 +7842,7 @@ function Ai() {
7842
7842
  case 0:
7843
7843
  return _;
7844
7844
  case 1:
7845
- return G(u, l, s, V);
7845
+ return S(u, l, s, V);
7846
7846
  case 2:
7847
7847
  case 3:
7848
7848
  return W(
@@ -8244,7 +8244,7 @@ Wt.new_double;
8244
8244
  Wt.new_float;
8245
8245
  var Ur = Wt.new_float_n, zr = Wt.new_int;
8246
8246
  Wt.new_int_n;
8247
- var Ve = Wt.assert, xs = Er, Mi = Di, li = bt(), G0 = yi;
8247
+ var Ve = Wt.assert, xs = Er, Mi = Di, li = bt(), S0 = yi;
8248
8248
  mi.EQ = function(t, e) {
8249
8249
  return Math.abs(t) > Math.abs(e) ? Math.abs(t - e) <= Math.abs(t) * 1e-6 : Math.abs(t - e) <= Math.abs(e) * 1e-6;
8250
8250
  };
@@ -8256,7 +8256,7 @@ function mi() {
8256
8256
  this.setModules = function(p, u, l, s) {
8257
8257
  n = p, d = u, o = l, m = s;
8258
8258
  };
8259
- var h = null, G = 0, W = 0, v = 0;
8259
+ var h = null, S = 0, W = 0, v = 0;
8260
8260
  this.getframebits = function(p) {
8261
8261
  var u = p.internal_flags, l;
8262
8262
  u.bitrate_index != 0 ? l = Mi.bitrate_table[p.version][u.bitrate_index] : l = p.brate, Ve(8 <= l && l <= 640);
@@ -8264,18 +8264,18 @@ function mi() {
8264
8264
  return 8 * s;
8265
8265
  };
8266
8266
  function Z(p) {
8267
- At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len, G += p.sideinfo_len * 8, p.w_ptr = p.w_ptr + 1 & G0.MAX_HEADER_BUF - 1;
8267
+ At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len, S += p.sideinfo_len * 8, p.w_ptr = p.w_ptr + 1 & S0.MAX_HEADER_BUF - 1;
8268
8268
  }
8269
8269
  function O(p, u, l) {
8270
8270
  for (Ve(l < i - 2); l > 0; ) {
8271
8271
  var s;
8272
- v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >= G), p.header[p.w_ptr].write_timing == G && Z(p), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, G += s;
8272
+ v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >= S), p.header[p.w_ptr].write_timing == S && Z(p), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
8273
8273
  }
8274
8274
  }
8275
8275
  function w(p, u, l) {
8276
8276
  for (Ve(l < i - 2); l > 0; ) {
8277
8277
  var s;
8278
- v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, G += s;
8278
+ v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
8279
8279
  }
8280
8280
  }
8281
8281
  function N(p, u) {
@@ -8331,7 +8331,7 @@ function mi() {
8331
8331
  p.error_protection && CRC_writeheader(l, l.header[l.h_ptr].buf);
8332
8332
  {
8333
8333
  var j = l.h_ptr;
8334
- Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 & G0.MAX_HEADER_BUF - 1, l.header[l.h_ptr].write_timing = l.header[j].write_timing + u, l.h_ptr == l.w_ptr && At.err.println(`Error: MAX_HEADER_BUF too small in bitstream.c
8334
+ Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 & S0.MAX_HEADER_BUF - 1, l.header[l.h_ptr].write_timing = l.header[j].write_timing + u, l.h_ptr == l.w_ptr && At.err.println(`Error: MAX_HEADER_BUF too small in bitstream.c
8335
8335
  `);
8336
8336
  }
8337
8337
  }
@@ -8445,13 +8445,13 @@ function mi() {
8445
8445
  }
8446
8446
  function H(p, u) {
8447
8447
  var l = p.internal_flags, s, V, _, R, f;
8448
- return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R = G0.MAX_HEADER_BUF - 1), s = l.header[R].write_timing - G, u.total = s, s >= 0 && (V = 1 + R - f, R < f && (V = 1 + R - f + G0.MAX_HEADER_BUF), s -= V * 8 * l.sideinfo_len), _ = t.getframebits(p), s += _, u.total += _, u.total % 8 != 0 ? u.total = 1 + u.total / 8 : u.total = u.total / 8, u.total += W + 1, s < 0 && At.err.println(`strange error flushing buffer ...
8448
+ return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R = S0.MAX_HEADER_BUF - 1), s = l.header[R].write_timing - S, u.total = s, s >= 0 && (V = 1 + R - f, R < f && (V = 1 + R - f + S0.MAX_HEADER_BUF), s -= V * 8 * l.sideinfo_len), _ = t.getframebits(p), s += _, u.total += _, u.total % 8 != 0 ? u.total = 1 + u.total / 8 : u.total = u.total / 8, u.total += W + 1, s < 0 && At.err.println(`strange error flushing buffer ...
8449
8449
  `), s;
8450
8450
  }
8451
8451
  this.flush_bitstream = function(p) {
8452
8452
  var u = p.internal_flags, l, s, V = u.h_ptr - 1;
8453
- if (V == -1 && (V = G0.MAX_HEADER_BUF - 1), l = u.l3_side, !((s = H(p, new T())) < 0)) {
8454
- if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) == G), u.ResvSize = 0, l.main_data_begin = 0, u.findReplayGain) {
8453
+ if (V == -1 && (V = S0.MAX_HEADER_BUF - 1), l = u.l3_side, !((s = H(p, new T())) < 0)) {
8454
+ if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) == S), u.ResvSize = 0, l.main_data_begin = 0, u.findReplayGain) {
8455
8455
  var _ = n.GetTitleGain(u.rgdata);
8456
8456
  Ve(NEQ(_, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES)), u.RadioGain = Math.floor(_ * 10 + 0.5) | 0;
8457
8457
  }
@@ -8459,7 +8459,7 @@ function mi() {
8459
8459
  }
8460
8460
  }, this.add_dummy_byte = function(p, u, l) {
8461
8461
  for (var s = p.internal_flags, V; l-- > 0; )
8462
- for (w(s, u, 8), V = 0; V < G0.MAX_HEADER_BUF; ++V)
8462
+ for (w(s, u, 8), V = 0; V < S0.MAX_HEADER_BUF; ++V)
8463
8463
  s.header[V].write_timing += 8;
8464
8464
  }, this.format_bitstream = function(p) {
8465
8465
  var u = p.internal_flags, l;
@@ -8487,11 +8487,11 @@ bitsperframe: %d
8487
8487
  V,
8488
8488
  V % 8,
8489
8489
  s
8490
- ), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(G % 8 == 0), G > 1e9) {
8490
+ ), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(S % 8 == 0), S > 1e9) {
8491
8491
  var _;
8492
- for (_ = 0; _ < G0.MAX_HEADER_BUF; ++_)
8493
- u.header[_].write_timing -= G;
8494
- G = 0;
8492
+ for (_ = 0; _ < S0.MAX_HEADER_BUF; ++_)
8493
+ u.header[_].write_timing -= S;
8494
+ S = 0;
8495
8495
  }
8496
8496
  return 0;
8497
8497
  }, this.copy_buffer = function(p, u, l, s, V) {
@@ -8534,7 +8534,7 @@ bitsperframe: %d
8534
8534
  }
8535
8535
  return _;
8536
8536
  }, this.init_bit_stream_w = function(p) {
8537
- h = Pr(Lame.LAME_MAXMP3BUFFER), p.h_ptr = p.w_ptr = 0, p.header[p.h_ptr].write_timing = 0, W = -1, v = 0, G = 0;
8537
+ h = Pr(Lame.LAME_MAXMP3BUFFER), p.h_ptr = p.w_ptr = 0, p.header[p.h_ptr].write_timing = 0, W = -1, v = 0, S = 0;
8538
8538
  };
8539
8539
  }
8540
8540
  var on = mi;
@@ -8547,7 +8547,7 @@ ot.Arrays;
8547
8547
  ot.new_array_n;
8548
8548
  ot.new_byte;
8549
8549
  ot.new_double;
8550
- var S0 = ot.new_float;
8550
+ var G0 = ot.new_float;
8551
8551
  ot.new_float_n;
8552
8552
  ot.new_int;
8553
8553
  var Hs = ot.new_int_n, jr = ot.new_short_n, Yt = ot.assert, Bi = er, Qr = sr, P0 = yi, Dr = Vr, $r = Wr, qr = Mr, v0 = on, Ot = Di, Ne = bt();
@@ -8556,12 +8556,12 @@ function Qe() {
8556
8556
  Qe.V9 = 410, Qe.V8 = 420, Qe.V7 = 430, Qe.V6 = 440, Qe.V5 = 450, Qe.V4 = 460, Qe.V3 = 470, Qe.V2 = 480, Qe.V1 = 490, Qe.V0 = 500, Qe.R3MIX = 1e3, Qe.STANDARD = 1001, Qe.EXTREME = 1002, Qe.INSANE = 1003, Qe.STANDARD_FAST = 1004, Qe.EXTREME_FAST = 1005, Qe.MEDIUM = 1006, Qe.MEDIUM_FAST = 1007;
8557
8557
  var i = 16384 + e;
8558
8558
  Qe.LAME_MAXMP3BUFFER = i;
8559
- var n, d, o, m, h, G = new Bi(), W, v, Z;
8559
+ var n, d, o, m, h, S = new Bi(), W, v, Z;
8560
8560
  this.enc = new Ne(), this.setModules = function(a, c, M, L, ee, ae, le, re, _e) {
8561
- n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d, G, m, W);
8561
+ n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d, S, m, W);
8562
8562
  };
8563
8563
  function O() {
8564
- this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight = S0(Ne.SBMAX_l), this.bo_s_weight = S0(Ne.SBMAX_s);
8564
+ this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight = G0(Ne.SBMAX_l), this.bo_s_weight = G0(Ne.SBMAX_s);
8565
8565
  }
8566
8566
  function w() {
8567
8567
  this.lowerlimit = 0;
@@ -8928,10 +8928,10 @@ function Qe() {
8928
8928
  a.VBR_mean_bitrate_kbps
8929
8929
  );
8930
8930
  }
8931
- return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a), G.psymodel_init(a), Yt(a.scale >= 0), 0;
8931
+ return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a), S.psymodel_init(a), Yt(a.scale >= 0), 0;
8932
8932
  };
8933
8933
  function u(a, c) {
8934
- (a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 = S0(c), a.in_buffer_1 = S0(c), a.in_buffer_nsamples = c);
8934
+ (a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 = G0(c), a.in_buffer_1 = G0(c), a.in_buffer_nsamples = c);
8935
8935
  }
8936
8936
  this.lame_encode_flush = function(a, c, M, L) {
8937
8937
  var ee = a.internal_flags, ae = jr([2, 1152]), le = 0, re, _e, he, oe, Le = ee.mf_samples_to_encode - Ne.POSTDELAY, ze = l(a);
@@ -9087,8 +9087,8 @@ function Qe() {
9087
9087
  De % 2 == 0 && --De, De += we;
9088
9088
  var st = De + 1;
9089
9089
  if (he.fill_buffer_resample_init == 0) {
9090
- for (he.inbuf_old[0] = S0(st), he.inbuf_old[1] = S0(st), oe = 0; oe <= 2 * We; ++oe)
9091
- he.blackfilt[oe] = S0(st);
9090
+ for (he.inbuf_old[0] = G0(st), he.inbuf_old[1] = G0(st), oe = 0; oe <= 2 * We; ++oe)
9091
+ he.blackfilt[oe] = G0(st);
9092
9092
  for (he.itime[0] = 0, he.itime[1] = 0, Le = 0; Le <= 2 * We; Le++) {
9093
9093
  var a0 = 0, gt = (Le - We) / (2 * We);
9094
9094
  for (oe = 0; oe <= De; oe++)
@@ -9167,8 +9167,8 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
9167
9167
  const i = (U) => new Uint8Array(U.length / 2).map((k, I) => parseInt(U.substring(2 * I, 2 * (I + 1)), 16)), n = (U) => i(U)[0], d = /* @__PURE__ */ new Map();
9168
9168
  [, 8364, , 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, , 381, , , 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, , 382, 376].forEach((U, k) => d.set(U, k));
9169
9169
  const o = new Uint8Array(t.length);
9170
- let m, h, G, W = !1, v = 0, Z = 42, O = t.length > 13 && t.substring(0, 9) === "dynEncode", w = 0;
9171
- O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8, G = ((U) => new DataView(i(U).buffer).getInt32(0, !0))(t.substring(13, w))));
9170
+ let m, h, S, W = !1, v = 0, Z = 42, O = t.length > 13 && t.substring(0, 9) === "dynEncode", w = 0;
9171
+ O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8, S = ((U) => new DataView(i(U).buffer).getInt32(0, !0))(t.substring(13, w))));
9172
9172
  const N = 256 - Z;
9173
9173
  for (let U = w; U < t.length; U++) if (m = t.charCodeAt(U), m !== 61 || W) {
9174
9174
  if (m === 92 && U < t.length - 5 && O) {
@@ -9184,10 +9184,10 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
9184
9184
  const J = o.subarray(0, v);
9185
9185
  if (O && h === 1) {
9186
9186
  const U = e(J);
9187
- if (U !== G) {
9187
+ if (U !== S) {
9188
9188
  const k = "Decode failed crc32 validation";
9189
9189
  throw console.error("`simple-yenc`\n", k + `
9190
- `, "Expected: " + G + "; Got: " + U + `
9190
+ `, "Expected: " + S + "; Got: " + U + `
9191
9191
  `, "Visit https://github.com/eshaz/simple-yenc for more information"), Error(k);
9192
9192
  }
9193
9193
  }
@@ -9231,17 +9231,17 @@ function qe() {
9231
9231
  },
9232
9232
  getDecodedAudioMultiChannel: {
9233
9233
  value(i, n, d, o, m, h) {
9234
- let G = [], W, v;
9234
+ let S = [], W, v;
9235
9235
  for (W = 0; W < d; W++) {
9236
9236
  const Z = [];
9237
9237
  for (v = 0; v < n.length; ) Z.push(n[v++][W] || []);
9238
- G.push(
9238
+ S.push(
9239
9239
  qe.concatFloat32(Z, o)
9240
9240
  );
9241
9241
  }
9242
9242
  return qe.getDecodedAudio(
9243
9243
  i,
9244
- G,
9244
+ S,
9245
9245
  o,
9246
9246
  m,
9247
9247
  h
@@ -9258,7 +9258,7 @@ function qe() {
9258
9258
  return i = Ys(i), new Promise((n) => {
9259
9259
  const d = String.raw`dynEncode012804c7886d(‰›•)((()>+ˆ*§§)§ˆ,§§§§)§ˆ+§§§)§+.-()(*)-+)(ˆ.7*§)i¸¸,3§(i¸¸,3/G+.••—š¡*(,˜ŽŽ(,3‡‡‰˜‡Š‰›+)2å:-œ),§H(P*DI*H(P*@I++hH)H*r,hH(H(P*<J,i)’^*<H,H(P*4’U((I-H(H*i0’J,^*DH+H-H*œšI+H,I*4)33H(H*H)“^*DH(H+H)^*@H+i§H)œi§›™3æ*).§K(iH“I/+§H,iHn,§H+i(H+i(rCJ0I,H*I-+hH,,hH(H-V)(i)œ’J.H.W)(i)’c)(H,i)“I,H-i*’I-4)33i(I.*hH(V)(H+n5(H(i*’I-i(I,i)I.+hH,i*’J+iHn,hi(I-i*I,+hH,H/’H-c)(H,iFn,hi(I,+hH,H0n5-H*V)(J(,hH/H(i)œ’J(H(V)(J(i)’c)(H)H(i)œ’H,c)(3H*i*’I*H,i)’I,4(3(-H(H,’W)(H-’I-H,i*’I,4)3(3(3H,H-’I1H+I,H.i)œH1V)(“J.i(v5(33H.-H(H,’i(c)(H,i*’I,4)333–)-§i*I*+§H*iHn,hiž73H,H(i)8(H+šJ+H)P*(H*’V)(J-“r,§H)P*,H.i)œ’H+H,“i)œ’V)(-H*i*’I*H+i)œI+H-H.’I.H,H-’i)œI,4)333Ã+)-§iø7i(^*(iü7I,*h+hH+iDn,h*hilI+i)I,+hH+,hH+iô7’H,c)(i)H+i´8’W)(œH,’I,H+i*’I+4)-+hH(H)8*J-i(p5.*h*h*hH-i')u,hH(P*(J+,hH(P*0J,H(P*,n50H+H,’H-b((3H(P*0i)’I.4)3H-i¨*n5*H-iÅ*s,hiž73H-i)œJ+V)&+I,H(H+V)æ,8(I.H(H*8*J-i(p51H-i)œJ+i¸7’V)(H(H+iø7’V)(8(’J/H(P*0J+s,hi73H+H,H.’J,’I.H(P*(m5(H.H(P*,s5.+hH,m5*H(P*(J.H+’H.H+H/“’U((b((H(H(P*0i)’J+^*0H,i)“I,4(3(3H(H.^*03H-i¨*o5)33i(73(3(3-H,H+i)žc)(H,i*’I,H+i)’I+4)33i)I-3H-3!2)0§K(i2“J,L(H,H(^*(H,H*^*4H,i(^*0H,i(^*DH,j(_*<H,H)P*(^*,H,H+P*(^*8*h*h+hH,i)8(I3i§I**h*h*h*h*h*h*hH,i*8(6+(),03H,j(_*@i*I-H,P*<J.i,’J(H,P*8J/s50H,H.i+’J0^*<i¦I*H.H,P*4J1’J.U(*H.U((J2›i')o5/H.U()I.H,H(^*<H0H1’U((H.i0œJ.i§›i0ži')™o5/H/H.H2šJ*H(’J.q50H,P*0J/H*’I-H,P*(J0,hH,P*,H-q,hi)I-423+hH*m5+H/H0’H(H1’U((b((H/i)’I/H(i)’I(H*i)“I*4(3(3H,H.^*<H,H-^*04*3iØ1U((5+i(I(i¨7i1^*(i$6iè1^*(i°7iè6^*(i¬7iÈ6^*(+hH(iÈ*n,hiÈ*I(+hH(i¨,n,hi¨,I(+hH(iØ,n,hiØ,I(+hH(iè,o,hH,i-’H(’i0c)(H(i*’I(4)33iè1i1H,i-’iÈ*8)Bi(I(+hH(ido,hH,i-’H(’i-c)(H(i*’I(4)33iÈ6iè6H,i-’iF8)BiØ1i)b((41-H,i-’H(’i/c)(H(i*’I(4)3(3(-H,i-’H(’i1c)(H(i*’I(4)3(3(-H,i-’H(’i0c)(H(i*’I(4)3(3(3H,H/^*0H,H(^*<3i(I*4*3H,H,i¸)’^*TH,H,iø-’^*PH,H,iX’^*LH,H,i(’^*HH,i-8(I(H,i-8(I-i¥I*H,i,8(I.H(iErH-iErš5)H(i©*’I1H-i)’I0i(i;H.i,’J(i(H(i(rCJ(“J*H*i;sCI*i¨1I-H(I/+hH/,hH,i-’H-V)(i)œ’H,i+8(c)(H/i)“I/H-i*’I-H*i)’I*4)-H(i)œi¨1’I/+hH(H*o,hH,i-’H/V)(i)œ’i(c)(H/i*’I/H(i)’I(4)33i¤I*H,iø-’H,i¸)’H,i-’i;8)5+H0H1’I2i(I-+hH-H2p,hH,H,iP’8*J*i(p5-H*i7u,hH,i-’H-i)œ’H*c)(H-i)’I-4*3i(I/i+I.i+I(*h*h*hH*i8“6*(*)3H-m,hi£I*403H-i)œH,’W)-I/i*I(4)3i3I.i/I(3H2H,H(8(H.’J(H-’J.p,hi¢I*4.3H,i-’H-i)œ’I*+hH(,hH*H/c)(H*i*’I*H(i)“I(4)-H.I-4+3(3(33H,W)1m,hiŸI*4,3H,iø-’H,i¸)’H,i-’H18)J(,hi¡I*H(i(p5,H1H,V)ú-H,V)ø-’o5,3H,i(’H,iX’H,i-’H1i)œ’H08)J(,hi I*H(i(p5,H0H,V)šH,V)˜’o5,3H,H,iP’H,iH’8+I*4+3(3(3H,i$6i¬78+I*3H*H3šm5(3i)I-H*i(r5)3H)H,P*0^*(H+H,P*<^*(H*I-3H,i2’L(H-33Á)+(i¨03b+(,(-(.(/(0(1(2(3(5(7(9(;(?(C(G(K(S([(c(k({(‹(›(«(Ë(ë( (*)(iø03O)()()()(*(*(*(*(+(+(+(+(,(,(,(,(-(-(-(-(i¨13M8(9(:(((0(/(1(.(2(-(3(,(4(+(5(*(6()(7(T7œ‰šœ‡Ž‰œš›*S7•œ‰Š”U”—Љ”›S0›‘–U œ`;
9260
9260
  qe.getModule(qe, d).then((o) => WebAssembly.instantiate(o, {})).then(({ exports: o }) => {
9261
- const m = new Map(Object.entries(o)), h = m.get("puff"), G = m.get("memory").buffer, W = new t(G), v = new DataView(G);
9261
+ const m = new Map(Object.entries(o)), h = m.get("puff"), S = m.get("memory").buffer, W = new t(S), v = new DataView(S);
9262
9262
  let Z = m.get("__heap_base");
9263
9263
  const O = i.length, w = Z;
9264
9264
  Z += 4, v.setInt32(w, O, !0);
@@ -9325,7 +9325,7 @@ class aa extends ra() {
9325
9325
  qe.modules || new qe();
9326
9326
  let o = qe.modules.get(n);
9327
9327
  if (!o) {
9328
- let m = "text/javascript", h, G = `'use strict';(${((W, v, Z) => {
9328
+ let m = "text/javascript", h, S = `'use strict';(${((W, v, Z) => {
9329
9329
  let O, w, N = new Promise((J) => {
9330
9330
  w = J;
9331
9331
  });
@@ -9351,13 +9351,13 @@ class aa extends ra() {
9351
9351
  h = typeof process.versions.node < "u";
9352
9352
  } catch {
9353
9353
  }
9354
- o = h ? `data:${m};base64,${Buffer.from(G).toString(
9354
+ o = h ? `data:${m};base64,${Buffer.from(S).toString(
9355
9355
  "base64"
9356
- )}` : URL.createObjectURL(new Blob([G], { type: m })), qe.modules.set(n, o);
9356
+ )}` : URL.createObjectURL(new Blob([S], { type: m })), qe.modules.set(n, o);
9357
9357
  }
9358
9358
  super(o, { name: i }), this._id = Number.MIN_SAFE_INTEGER, this._enqueuedOperations = /* @__PURE__ */ new Map(), this.onmessage = ({ data: m }) => {
9359
- const { id: h, ...G } = m;
9360
- this._enqueuedOperations.get(h)(G), this._enqueuedOperations.delete(h);
9359
+ const { id: h, ...S } = m;
9360
+ this._enqueuedOperations.get(h)(S), this._enqueuedOperations.delete(h);
9361
9361
  }, new d(qe).getModule().then((m) => {
9362
9362
  this.postToDecoder("init", { module: m, options: e });
9363
9363
  });
@@ -9394,7 +9394,7 @@ function w0(t) {
9394
9394
  throw L;
9395
9395
  }
9396
9396
  var o, m, h;
9397
- function G() {
9397
+ function S() {
9398
9398
  var L = h.buffer;
9399
9399
  o = new Uint8Array(L), m = new Uint32Array(L), new BigInt64Array(L), new BigUint64Array(L);
9400
9400
  }
@@ -9655,7 +9655,7 @@ r÷|‹ú–“
9655
9655
  t.setModule(w0, L);
9656
9656
  }, this.getModule = () => t.getModule(w0), this.instantiate = () => (this.getModule().then((L) => WebAssembly.instantiate(L, M)).then((L) => {
9657
9657
  const ee = L.exports;
9658
- V(ee), h = ee.k, G(), c(ee), n();
9658
+ V(ee), h = ee.k, S(), c(ee), n();
9659
9659
  }), this.ready = new Promise((L) => {
9660
9660
  n = L;
9661
9661
  }).then(() => {
@@ -9698,15 +9698,15 @@ function K0(t = {}) {
9698
9698
  e: for (let o = 0, m = 0; o < e.length; o += m) {
9699
9699
  const h = e.subarray(o, this._input.len + o);
9700
9700
  m = h.length, this._inputBytes += m, this._input.buf.set(h);
9701
- let G = this._common.wasm.mpeg_decoder_feed(
9701
+ let S = this._common.wasm.mpeg_decoder_feed(
9702
9702
  this._decoder,
9703
9703
  this._input.ptr,
9704
9704
  m
9705
9705
  );
9706
- if (G === -10)
9706
+ if (S === -10)
9707
9707
  continue e;
9708
9708
  t: for (; ; ) {
9709
- this._samplesDecodedPtr.buf[0] = 0, G = this._common.wasm.mpeg_decoder_read(
9709
+ this._samplesDecodedPtr.buf[0] = 0, S = this._common.wasm.mpeg_decoder_read(
9710
9710
  this._decoder,
9711
9711
  this._output.ptr,
9712
9712
  this._output.len,
@@ -9718,12 +9718,12 @@ function K0(t = {}) {
9718
9718
  if (this._outputSamples += W, W && (d += W, i.push([
9719
9719
  this._output.buf.slice(0, W),
9720
9720
  this._output.buf.slice(W, W * 2)
9721
- ])), G == -11)
9721
+ ])), S == -11)
9722
9722
  continue t;
9723
- if (G === -10)
9723
+ if (S === -10)
9724
9724
  continue e;
9725
- if (G) {
9726
- const v = this._getErrorMessage(G);
9725
+ if (S) {
9726
+ const v = this._getErrorMessage(S);
9727
9727
  console.error("mpg123-decoder: " + v), this._common.addError(
9728
9728
  n,
9729
9729
  v,
@@ -9779,7 +9779,7 @@ cn(dn, "MPEGDecoderWebWorker");
9779
9779
  globalThis.MPEGMode = En;
9780
9780
  globalThis.Lame = ta;
9781
9781
  globalThis.BitStream = Ar;
9782
- class I1 {
9782
+ class V1 {
9783
9783
  /**
9784
9784
  * Create a new MP3Encoder.
9785
9785
  *
@@ -9800,8 +9800,8 @@ class I1 {
9800
9800
  const i = e.numberOfChannels, n = e.numberOfFrames, d = Jn(e), o = new Int16Array(n * i);
9801
9801
  for (let m = 0; m < n; m++)
9802
9802
  for (let h = 0; h < i; h++) {
9803
- const G = Math.max(-1, Math.min(1, d[h][m]));
9804
- o[m * i + h] = G * 32767;
9803
+ const S = Math.max(-1, Math.min(1, d[h][m]));
9804
+ o[m * i + h] = S * 32767;
9805
9805
  }
9806
9806
  return o;
9807
9807
  }
@@ -9845,7 +9845,7 @@ class I1 {
9845
9845
  return this.encodedData.reduce((e, i) => e + i.length, 0);
9846
9846
  }
9847
9847
  }
9848
- class V1 {
9848
+ class R1 {
9849
9849
  /**
9850
9850
  * Create a new MP3Decoder.
9851
9851
  *
@@ -9877,10 +9877,10 @@ class V1 {
9877
9877
  const i = await this.decoder.decode(new Uint8Array(e)), { channelData: n, sampleRate: d } = i, o = n.length;
9878
9878
  return {
9879
9879
  channels: n.map((h) => {
9880
- const G = new Float32Array(h.length);
9880
+ const S = new Float32Array(h.length);
9881
9881
  for (let W = 0; W < h.length; W++)
9882
- G[W] = h[W];
9883
- return G;
9882
+ S[W] = h[W];
9883
+ return S;
9884
9884
  }),
9885
9885
  sampleRate: d,
9886
9886
  numberOfChannels: o
@@ -9913,14 +9913,14 @@ class V1 {
9913
9913
  async toAudioData(e) {
9914
9914
  const { channels: i, sampleRate: n, numberOfChannels: d } = await this.toSamples(e), o = 1024, m = i[0].length, h = [];
9915
9915
  console.log("Samples", m);
9916
- for (let G = 0; G < m; G += o) {
9917
- const W = m - G, v = Math.min(o, W), Z = i.map(
9918
- (J) => J.slice(G, G + v)
9916
+ for (let S = 0; S < m; S += o) {
9917
+ const W = m - S, v = Math.min(o, W), Z = i.map(
9918
+ (J) => J.slice(S, S + v)
9919
9919
  ), O = new Float32Array(v * d);
9920
9920
  for (let J = 0; J < v; J++)
9921
9921
  for (let U = 0; U < d; U++)
9922
9922
  O[J * d + U] = Z[U][J];
9923
- const w = G / n * 1e6, N = new AudioData({
9923
+ const w = S / n * 1e6, N = new AudioData({
9924
9924
  format: "f32",
9925
9925
  sampleRate: n,
9926
9926
  numberOfFrames: v,
@@ -9995,7 +9995,7 @@ function ua(t, e) {
9995
9995
  )
9996
9996
  );
9997
9997
  };
9998
- const G = async () => {
9998
+ const S = async () => {
9999
9999
  try {
10000
10000
  const { done: W, value: v } = await d.read();
10001
10001
  if (W) {
@@ -10010,19 +10010,19 @@ function ua(t, e) {
10010
10010
  }
10011
10011
  const Z = v.buffer;
10012
10012
  if (Z.fileStart = o, o += v.length, e && e(o / t.size), m.appendBuffer(Z), o < t.size)
10013
- return G();
10013
+ return S();
10014
10014
  if (m.flush(), !h)
10015
10015
  throw new Error("Invalid MP4 file: metadata not available");
10016
10016
  } catch (W) {
10017
10017
  n(W);
10018
10018
  }
10019
10019
  };
10020
- G().catch(n);
10020
+ S().catch(n);
10021
10021
  });
10022
10022
  }
10023
10023
  function ha(t, e, i, n, d) {
10024
10024
  const { mp4: o, info: m } = e;
10025
- return new Promise((h, G) => {
10025
+ return new Promise((h, S) => {
10026
10026
  let W = 0, v = !1, Z = 0;
10027
10027
  const O = i === "audio" ? EncodedAudioChunk : EncodedVideoChunk, w = [], N = i === "audio" ? m.audioTracks[0] ?? null : m.videoTracks[0] ?? null;
10028
10028
  if (!N) {
@@ -10054,7 +10054,7 @@ function ha(t, e, i, n, d) {
10054
10054
  (Math.abs(H - U) < oa || H > U) && (v = !0, o.stop(), o.flush(), h(w));
10055
10055
  }
10056
10056
  }, o.onError = (K) => {
10057
- G(
10057
+ S(
10058
10058
  new Error(
10059
10059
  `Extraction error: ${K instanceof Error ? K.message : String(K)}`
10060
10060
  )
@@ -10072,13 +10072,13 @@ function ha(t, e, i, n, d) {
10072
10072
  const A = X.buffer;
10073
10073
  return A.fileStart = W, W += X.length, o.appendBuffer(A), r();
10074
10074
  } catch (K) {
10075
- G(K);
10075
+ S(K);
10076
10076
  }
10077
10077
  };
10078
- o.start(), r().catch(G);
10078
+ o.start(), r().catch(S);
10079
10079
  });
10080
10080
  }
10081
- class R1 {
10081
+ class T1 {
10082
10082
  /**
10083
10083
  * Create a new MP4Demuxer instance.
10084
10084
  * @param file - The MP4 file to demux
@@ -10150,7 +10150,7 @@ class R1 {
10150
10150
  return this.mp4Data.info;
10151
10151
  }
10152
10152
  }
10153
- class T1 {
10153
+ class W1 {
10154
10154
  /**
10155
10155
  * Create a new InMemoryStorage instance
10156
10156
  * @param chunkSize Size of each chunk in bytes (default: 10MB)
@@ -10167,11 +10167,11 @@ class T1 {
10167
10167
  this._size = Math.max(this._size, i + e.byteLength);
10168
10168
  const n = Math.floor(i / this._chunkSize), d = Math.floor((i + e.byteLength - 1) / this._chunkSize);
10169
10169
  for (let o = n; o <= d; o++) {
10170
- const m = o * this._chunkSize, h = m + this._chunkSize, G = Math.max(i, m), v = Math.min(i + e.byteLength, h) - G;
10170
+ const m = o * this._chunkSize, h = m + this._chunkSize, S = Math.max(i, m), v = Math.min(i + e.byteLength, h) - S;
10171
10171
  if (v <= 0) continue;
10172
10172
  let Z;
10173
10173
  this.chunks.has(o) ? Z = this.chunks.get(o) : (Z = new Uint8Array(this._chunkSize), this.chunks.set(o, Z));
10174
- const O = G - m, w = G - i;
10174
+ const O = S - m, w = S - i;
10175
10175
  for (let N = 0; N < v; N++)
10176
10176
  Z[O + N] = e[w + N];
10177
10177
  }
@@ -10193,25 +10193,56 @@ class T1 {
10193
10193
  for (let o = 0; o < i.length; o++) {
10194
10194
  const m = i[o], h = this.chunks.get(m);
10195
10195
  if (o === i.length - 1) {
10196
- const G = this._size - m * this._chunkSize;
10197
- G < this._chunkSize ? n.push(h.slice(0, G)) : n.push(h);
10196
+ const S = this._size - m * this._chunkSize;
10197
+ S < this._chunkSize ? n.push(h.slice(0, S)) : n.push(h);
10198
10198
  } else
10199
10199
  n.push(h);
10200
10200
  }
10201
10201
  return new Blob(n, { type: e });
10202
10202
  }
10203
10203
  }
10204
- var ba = Object.defineProperty, pa = (t, e, i) => e in t ? ba(t, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[e] = i, oi = (t, e, i) => (pa(t, typeof e != "symbol" ? e + "" : e, i), i), I0 = /* @__PURE__ */ ((t) => (t[t.AVMEDIA_TYPE_UNKNOWN = -1] = "AVMEDIA_TYPE_UNKNOWN", t[t.AVMEDIA_TYPE_VIDEO = 0] = "AVMEDIA_TYPE_VIDEO", t[t.AVMEDIA_TYPE_AUDIO = 1] = "AVMEDIA_TYPE_AUDIO", t[t.AVMEDIA_TYPE_DATA = 2] = "AVMEDIA_TYPE_DATA", t[t.AVMEDIA_TYPE_SUBTITLE = 3] = "AVMEDIA_TYPE_SUBTITLE", t[t.AVMEDIA_TYPE_ATTACHMENT = 4] = "AVMEDIA_TYPE_ATTACHMENT", t[t.AVMEDIA_TYPE_NB = 5] = "AVMEDIA_TYPE_NB", t))(I0 || {}), di = /* @__PURE__ */ ((t) => (t[t.AVSEEK_FLAG_BACKWARD = 1] = "AVSEEK_FLAG_BACKWARD", t[t.AVSEEK_FLAG_BYTE = 2] = "AVSEEK_FLAG_BYTE", t[t.AVSEEK_FLAG_ANY = 4] = "AVSEEK_FLAG_ANY", t[t.AVSEEK_FLAG_FRAME = 8] = "AVSEEK_FLAG_FRAME", t))(di || {}), rt = /* @__PURE__ */ ((t) => (t.WasmWorkerLoaded = "WasmWorkerLoaded", t.WASMRuntimeInitialized = "WASMRuntimeInitialized", t.LoadWASM = "LoadWASM", t.GetAVPacket = "GetAVPacket", t.GetAVPackets = "GetAVPackets", t.GetAVStream = "GetAVStream", t.GetAVStreams = "GetAVStreams", t.GetMediaInfo = "GetMediaInfo", t.ReadAVPacket = "ReadAVPacket", t.AVPacketStream = "AVPacketStream", t.ReadNextAVPacket = "ReadNextAVPacket", t.StopReadAVPacket = "StopReadAVPacket", t.SetAVLogLevel = "SetAVLogLevel", t))(rt || {});
10205
- const mn = "video", ya = "audio", fa = "subtitle", ws = {
10204
+ class ba {
10205
+ constructor({ track: e }) {
10206
+ const i = e.getSettings();
10207
+ if (!i)
10208
+ throw new Error("track has no settings");
10209
+ let n, d;
10210
+ const o = i.frameRate ?? 30;
10211
+ this.readable = new ReadableStream({
10212
+ async start() {
10213
+ n = document.createElement("video"), n.srcObject = new MediaStream([e]), await Promise.all([
10214
+ n.play(),
10215
+ new Promise((m) => {
10216
+ n.onloadedmetadata = m;
10217
+ })
10218
+ ]), d = performance.now();
10219
+ },
10220
+ async pull(m) {
10221
+ for (; ; ) {
10222
+ const h = performance.now();
10223
+ if (h - d < 1e3 / o) {
10224
+ await new Promise((S) => requestAnimationFrame(S));
10225
+ continue;
10226
+ }
10227
+ d = h, m.enqueue(new VideoFrame(n, { timestamp: d * 1e3 }));
10228
+ break;
10229
+ }
10230
+ }
10231
+ });
10232
+ }
10233
+ }
10234
+ self.MediaStreamTrackProcessor || (self.MediaStreamTrackProcessor = ba);
10235
+ var pa = Object.defineProperty, ya = (t, e, i) => e in t ? pa(t, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[e] = i, oi = (t, e, i) => (ya(t, typeof e != "symbol" ? e + "" : e, i), i), I0 = /* @__PURE__ */ ((t) => (t[t.AVMEDIA_TYPE_UNKNOWN = -1] = "AVMEDIA_TYPE_UNKNOWN", t[t.AVMEDIA_TYPE_VIDEO = 0] = "AVMEDIA_TYPE_VIDEO", t[t.AVMEDIA_TYPE_AUDIO = 1] = "AVMEDIA_TYPE_AUDIO", t[t.AVMEDIA_TYPE_DATA = 2] = "AVMEDIA_TYPE_DATA", t[t.AVMEDIA_TYPE_SUBTITLE = 3] = "AVMEDIA_TYPE_SUBTITLE", t[t.AVMEDIA_TYPE_ATTACHMENT = 4] = "AVMEDIA_TYPE_ATTACHMENT", t[t.AVMEDIA_TYPE_NB = 5] = "AVMEDIA_TYPE_NB", t))(I0 || {}), di = /* @__PURE__ */ ((t) => (t[t.AVSEEK_FLAG_BACKWARD = 1] = "AVSEEK_FLAG_BACKWARD", t[t.AVSEEK_FLAG_BYTE = 2] = "AVSEEK_FLAG_BYTE", t[t.AVSEEK_FLAG_ANY = 4] = "AVSEEK_FLAG_ANY", t[t.AVSEEK_FLAG_FRAME = 8] = "AVSEEK_FLAG_FRAME", t))(di || {}), rt = /* @__PURE__ */ ((t) => (t.WasmWorkerLoaded = "WasmWorkerLoaded", t.WASMRuntimeInitialized = "WASMRuntimeInitialized", t.LoadWASM = "LoadWASM", t.GetAVPacket = "GetAVPacket", t.GetAVPackets = "GetAVPackets", t.GetAVStream = "GetAVStream", t.GetAVStreams = "GetAVStreams", t.GetMediaInfo = "GetMediaInfo", t.ReadAVPacket = "ReadAVPacket", t.AVPacketStream = "AVPacketStream", t.ReadNextAVPacket = "ReadNextAVPacket", t.StopReadAVPacket = "StopReadAVPacket", t.SetAVLogLevel = "SetAVLogLevel", t))(rt || {});
10236
+ const mn = "video", fa = "audio", Za = "subtitle", ws = {
10206
10237
  VIDEO: mn
10207
10238
  }, Ci = {
10208
10239
  [mn]: I0.AVMEDIA_TYPE_VIDEO,
10209
- [ya]: I0.AVMEDIA_TYPE_AUDIO,
10210
- [fa]: I0.AVMEDIA_TYPE_SUBTITLE
10211
- }, un = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Za = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Za(un)], {
10240
+ [fa]: I0.AVMEDIA_TYPE_AUDIO,
10241
+ [Za]: I0.AVMEDIA_TYPE_SUBTITLE
10242
+ }, un = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Xa = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Xa(un)], {
10212
10243
  type: "text/javascript;charset=utf-8"
10213
10244
  });
10214
- function Xa(t) {
10245
+ function _a(t) {
10215
10246
  let e;
10216
10247
  try {
10217
10248
  if (e = Ks && (window.URL || window.webkitURL).createObjectURL(Ks), !e)
@@ -10233,7 +10264,7 @@ function Xa(t) {
10233
10264
  const Ms = 1e6;
10234
10265
  class fi {
10235
10266
  constructor(e) {
10236
- oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new Xa({
10267
+ oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new _a({
10237
10268
  name: "web-demuxer"
10238
10269
  }), this.wasmWorkerLoadStatus = new Promise((i, n) => {
10239
10270
  this.wasmWorker.addEventListener("message", (d) => {
@@ -10262,9 +10293,9 @@ class fi {
10262
10293
  }
10263
10294
  const o = this.msgId, m = (h) => {
10264
10295
  let {
10265
- data: G
10296
+ data: S
10266
10297
  } = h;
10267
- G.type === e && G.msgId === o && (G.errMsg ? d(G.errMsg) : n(G.result), this.wasmWorker.removeEventListener("message", m));
10298
+ S.type === e && S.msgId === o && (S.errMsg ? d(S.errMsg) : n(S.result), this.wasmWorker.removeEventListener("message", m));
10268
10299
  };
10269
10300
  this.wasmWorker.addEventListener("message", m), this.post(e, i, o);
10270
10301
  });
@@ -10363,7 +10394,7 @@ class fi {
10363
10394
  const m = new CountQueuingStrategy({
10364
10395
  highWaterMark: 1
10365
10396
  }), h = this.msgId;
10366
- let G = 0, W, v;
10397
+ let S = 0, W, v;
10367
10398
  return new ReadableStream({
10368
10399
  start: (Z) => {
10369
10400
  if (!this.source) {
@@ -10383,7 +10414,7 @@ class fi {
10383
10414
  });
10384
10415
  },
10385
10416
  pull: () => {
10386
- G > 0 && this.post(rt.ReadNextAVPacket, void 0, h), G++;
10417
+ S > 0 && this.post(rt.ReadNextAVPacket, void 0, h), S++;
10387
10418
  },
10388
10419
  cancel: () => new Promise((Z) => {
10389
10420
  v = Z, this.post(rt.StopReadAVPacket, void 0, h);
@@ -10509,7 +10540,7 @@ function Zi() {
10509
10540
  "⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper demuxing library like MediaBunny (https://mediabunny.dev/) or web-demuxer (https://github.com/bilibili/web-demuxer) directly."
10510
10541
  ), ks = !0);
10511
10542
  }
10512
- async function W1(t) {
10543
+ async function L1(t) {
10513
10544
  Zi();
10514
10545
  const e = new fi({
10515
10546
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10518,12 +10549,12 @@ async function W1(t) {
10518
10549
  const i = e.read("video", 0).getReader(), n = [];
10519
10550
  return new Promise(function(d) {
10520
10551
  i.read().then(async function o(m) {
10521
- const { done: h, value: G } = m;
10522
- return G && n.push(G), h ? d(n) : i.read().then(o);
10552
+ const { done: h, value: S } = m;
10553
+ return S && n.push(S), h ? d(n) : i.read().then(o);
10523
10554
  });
10524
10555
  });
10525
10556
  }
10526
- async function L1(t) {
10557
+ async function x1(t) {
10527
10558
  Zi();
10528
10559
  const e = new fi({
10529
10560
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10531,9 +10562,9 @@ async function L1(t) {
10531
10562
  await e.load(t);
10532
10563
  const i = e.read("audio", 0).getReader(), n = [];
10533
10564
  await new Promise(function(h) {
10534
- i.read().then(async function G(W) {
10565
+ i.read().then(async function S(W) {
10535
10566
  const { done: v, value: Z } = W;
10536
- return Z && n.push(Z), v ? h(n) : i.read().then(G);
10567
+ return Z && n.push(Z), v ? h(n) : i.read().then(S);
10537
10568
  });
10538
10569
  });
10539
10570
  const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "audio")[0], m = {
@@ -10546,7 +10577,7 @@ async function L1(t) {
10546
10577
  config: m
10547
10578
  };
10548
10579
  }
10549
- async function x1(t) {
10580
+ async function H1(t) {
10550
10581
  Zi();
10551
10582
  const e = new fi({
10552
10583
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10554,9 +10585,9 @@ async function x1(t) {
10554
10585
  await e.load(t);
10555
10586
  const i = e.read("video", 0).getReader(), n = [];
10556
10587
  await new Promise(function(h) {
10557
- i.read().then(async function G(W) {
10588
+ i.read().then(async function S(W) {
10558
10589
  const { done: v, value: Z } = W;
10559
- return Z && n.push(Z), v ? h(n) : i.read().then(G);
10590
+ return Z && n.push(Z), v ? h(n) : i.read().then(S);
10560
10591
  });
10561
10592
  });
10562
10593
  const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "video")[0], m = {
@@ -10570,7 +10601,7 @@ async function x1(t) {
10570
10601
  config: m
10571
10602
  };
10572
10603
  }
10573
- async function H1(t) {
10604
+ async function Y1(t) {
10574
10605
  Zi();
10575
10606
  const e = new fi({
10576
10607
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10579,8 +10610,8 @@ async function H1(t) {
10579
10610
  const i = e.read("audio", 0).getReader(), n = [];
10580
10611
  return new Promise(function(d) {
10581
10612
  i.read().then(async function o(m) {
10582
- const { done: h, value: G } = m;
10583
- return G && n.push(G), h ? d(n) : i.read().then(o);
10613
+ const { done: h, value: S } = m;
10614
+ return S && n.push(S), h ? d(n) : i.read().then(o);
10584
10615
  });
10585
10616
  });
10586
10617
  }
@@ -10652,7 +10683,7 @@ const ye = (t) => {
10652
10683
  }, s0 = (t) => {
10653
10684
  const e = ye(t);
10654
10685
  return e & 1 ? e + 1 >> 1 : -(e >> 1);
10655
- }, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t), _a = (t) => t.constructor === DataView ? t : ArrayBuffer.isView(t) ? new DataView(t.buffer, t.byteOffset, t.byteLength) : new DataView(t), $t = /* @__PURE__ */ new TextEncoder(), $i = {
10686
+ }, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t), Sa = (t) => t.constructor === DataView ? t : ArrayBuffer.isView(t) ? new DataView(t.buffer, t.byteOffset, t.byteLength) : new DataView(t), $t = /* @__PURE__ */ new TextEncoder(), $i = {
10656
10687
  bt709: 1,
10657
10688
  // ITU-R BT.709
10658
10689
  bt470bg: 5,
@@ -10700,27 +10731,27 @@ class bn {
10700
10731
  return this.currentPromise = i, await n, e;
10701
10732
  }
10702
10733
  }
10703
- const Sa = () => {
10734
+ const va = () => {
10704
10735
  let t, e;
10705
10736
  return { promise: new Promise((n, d) => {
10706
10737
  t = n, e = d;
10707
10738
  }), resolve: t, reject: e };
10708
10739
  }, pn = (t) => {
10709
10740
  throw new Error(`Unexpected value: ${t}`);
10710
- }, va = (t, e, i, n) => {
10741
+ }, Ia = (t, e, i, n) => {
10711
10742
  i = i >>> 0, i = i & 16777215, t.setUint8(e, i >>> 16 & 255), t.setUint8(e + 1, i >>> 8 & 255), t.setUint8(e + 2, i & 255);
10712
- }, Ia = "und", Va = /^[a-z]{3}$/, Ra = (t) => Va.test(t), Bs = 1e6 * (1 + Number.EPSILON), Ta = (t, e) => {
10743
+ }, Va = "und", Ra = /^[a-z]{3}$/, Ta = (t) => Ra.test(t), Bs = 1e6 * (1 + Number.EPSILON), Wa = (t, e) => {
10713
10744
  const i = t < 0 ? -1 : 1;
10714
10745
  t = Math.abs(t);
10715
10746
  let n = 0, d = 1, o = 1, m = 0, h = t;
10716
10747
  for (; ; ) {
10717
- const G = Math.floor(h), W = G * o + n, v = G * m + d;
10748
+ const S = Math.floor(h), W = S * o + n, v = S * m + d;
10718
10749
  if (v > e)
10719
10750
  return {
10720
10751
  numerator: i * o,
10721
10752
  denominator: m
10722
10753
  };
10723
- if (n = o, d = m, o = W, m = v, h = 1 / (h - G), !isFinite(h))
10754
+ if (n = o, d = m, o = W, m = v, h = 1 / (h - S), !isFinite(h))
10724
10755
  break;
10725
10756
  }
10726
10757
  return {
@@ -10749,7 +10780,7 @@ class fn {
10749
10780
  throw new TypeError("mimeType must be a string.");
10750
10781
  }
10751
10782
  }
10752
- class Wa {
10783
+ class La {
10753
10784
  /** Creates a new {@link AttachedFile}. */
10754
10785
  constructor(e, i, n, d) {
10755
10786
  if (this.data = e, this.mimeType = i, this.name = n, this.description = d, !(e instanceof Uint8Array))
@@ -10762,7 +10793,7 @@ class Wa {
10762
10793
  throw new TypeError("description, when provided, must be a string.");
10763
10794
  }
10764
10795
  }
10765
- const La = (t) => {
10796
+ const xa = (t) => {
10766
10797
  if (!t || typeof t != "object")
10767
10798
  throw new TypeError("tags must be an object.");
10768
10799
  if (t.title !== void 0 && typeof t.title != "string")
@@ -10809,10 +10840,10 @@ const La = (t) => {
10809
10840
  if (!t.raw || typeof t.raw != "object")
10810
10841
  throw new TypeError("tags.raw, when provided, must be an object.");
10811
10842
  for (const e of Object.values(t.raw))
10812
- if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof fn) && !(e instanceof Wa))
10843
+ if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof fn) && !(e instanceof La))
10813
10844
  throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.");
10814
10845
  }
10815
- }, xa = (t) => {
10846
+ }, Ha = (t) => {
10816
10847
  if (!t || typeof t != "object")
10817
10848
  throw new TypeError("disposition must be an object.");
10818
10849
  if (t.default !== void 0 && typeof t.default != "boolean")
@@ -10868,21 +10899,21 @@ const O0 = [
10868
10899
  ...k0
10869
10900
  ], hi = [
10870
10901
  "webvtt"
10871
- ], Ha = (t) => {
10872
- const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)), G = (o << 5) + h, W = m.slice(-1) === "H" ? 1 : 0, Z = Number(e[3]) === 8 ? 0 : 1, O = 0, w = e[4] ? Number(e[4]) : 0, N = e[5] ? Number(e[5][0]) : 1, J = e[5] ? Number(e[5][1]) : 1, U = e[5] ? Number(e[5][2]) : 0, k = (W << 7) + (Z << 6) + (O << 5) + (w << 4) + (N << 3) + (J << 2) + U;
10873
- return [d, G, k, 0];
10874
- }, Ya = /^pcm-([usf])(\d+)+(be)?$/, D0 = (t) => {
10902
+ ], Ya = (t) => {
10903
+ const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)), S = (o << 5) + h, W = m.slice(-1) === "H" ? 1 : 0, Z = Number(e[3]) === 8 ? 0 : 1, O = 0, w = e[4] ? Number(e[4]) : 0, N = e[5] ? Number(e[5][0]) : 1, J = e[5] ? Number(e[5][1]) : 1, U = e[5] ? Number(e[5][2]) : 0, k = (W << 7) + (Z << 6) + (O << 5) + (w << 4) + (N << 3) + (J << 2) + U;
10904
+ return [d, S, k, 0];
10905
+ }, wa = /^pcm-([usf])(\d+)+(be)?$/, D0 = (t) => {
10875
10906
  if (ve(k0.includes(t)), t === "ulaw")
10876
10907
  return { dataType: "ulaw", sampleSize: 1, littleEndian: !0, silentValue: 255 };
10877
10908
  if (t === "alaw")
10878
10909
  return { dataType: "alaw", sampleSize: 1, littleEndian: !0, silentValue: 213 };
10879
- const e = Ya.exec(t);
10910
+ const e = wa.exec(t);
10880
10911
  ve(e);
10881
10912
  let i;
10882
10913
  e[1] === "u" ? i = "unsigned" : e[1] === "s" ? i = "signed" : i = "float";
10883
10914
  const n = Number(e[2]) / 8, d = e[3] !== "be", o = t === "pcm-u8" ? 2 ** 7 : 0;
10884
10915
  return { dataType: i, sampleSize: n, littleEndian: d, silentValue: o };
10885
- }, wa = ["avc1", "avc3", "hev1", "hvc1", "vp8", "vp09", "av01"], Ka = /^(avc1|avc3)\.[0-9a-fA-F]{6}$/, Ma = /^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/, ka = /^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/, Ba = /^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/, Ca = (t) => {
10916
+ }, Ka = ["avc1", "avc3", "hev1", "hvc1", "vp8", "vp09", "av01"], Ma = /^(avc1|avc3)\.[0-9a-fA-F]{6}$/, ka = /^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/, Ba = /^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/, Ca = /^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/, ga = (t) => {
10886
10917
  if (!t)
10887
10918
  throw new TypeError("Video chunk metadata must be provided.");
10888
10919
  if (typeof t != "object")
@@ -10893,7 +10924,7 @@ const O0 = [
10893
10924
  throw new TypeError("Video chunk metadata decoder configuration must be an object.");
10894
10925
  if (typeof t.decoderConfig.codec != "string")
10895
10926
  throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");
10896
- if (!wa.some((e) => t.decoderConfig.codec.startsWith(e)))
10927
+ if (!Ka.some((e) => t.decoderConfig.codec.startsWith(e)))
10897
10928
  throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");
10898
10929
  if (!Number.isInteger(t.decoderConfig.codedWidth) || t.decoderConfig.codedWidth <= 0)
10899
10930
  throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");
@@ -10918,20 +10949,20 @@ const O0 = [
10918
10949
  throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.");
10919
10950
  }
10920
10951
  if (t.decoderConfig.codec.startsWith("avc1") || t.decoderConfig.codec.startsWith("avc3")) {
10921
- if (!Ka.test(t.decoderConfig.codec))
10952
+ if (!Ma.test(t.decoderConfig.codec))
10922
10953
  throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.");
10923
10954
  } else if (t.decoderConfig.codec.startsWith("hev1") || t.decoderConfig.codec.startsWith("hvc1")) {
10924
- if (!Ma.test(t.decoderConfig.codec))
10955
+ if (!ka.test(t.decoderConfig.codec))
10925
10956
  throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.");
10926
10957
  } else if (t.decoderConfig.codec.startsWith("vp8")) {
10927
10958
  if (t.decoderConfig.codec !== "vp8")
10928
10959
  throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".');
10929
10960
  } else if (t.decoderConfig.codec.startsWith("vp09")) {
10930
- if (!ka.test(t.decoderConfig.codec))
10961
+ if (!Ba.test(t.decoderConfig.codec))
10931
10962
  throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.');
10932
- } else if (t.decoderConfig.codec.startsWith("av01") && !Ba.test(t.decoderConfig.codec))
10963
+ } else if (t.decoderConfig.codec.startsWith("av01") && !Ca.test(t.decoderConfig.codec))
10933
10964
  throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.');
10934
- }, ga = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"], Fa = (t) => {
10965
+ }, Fa = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"], Ja = (t) => {
10935
10966
  if (!t)
10936
10967
  throw new TypeError("Audio chunk metadata must be provided.");
10937
10968
  if (typeof t != "object")
@@ -10942,7 +10973,7 @@ const O0 = [
10942
10973
  throw new TypeError("Audio chunk metadata decoder configuration must be an object.");
10943
10974
  if (typeof t.decoderConfig.codec != "string")
10944
10975
  throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");
10945
- if (!ga.some((e) => t.decoderConfig.codec.startsWith(e)))
10976
+ if (!Fa.some((e) => t.decoderConfig.codec.startsWith(e)))
10946
10977
  throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");
10947
10978
  if (!Number.isInteger(t.decoderConfig.sampleRate) || t.decoderConfig.sampleRate <= 0)
10948
10979
  throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");
@@ -10975,7 +11006,7 @@ const O0 = [
10975
11006
  throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.");
10976
11007
  } else if ((t.decoderConfig.codec.startsWith("pcm") || t.decoderConfig.codec.startsWith("ulaw") || t.decoderConfig.codec.startsWith("alaw")) && !k0.includes(t.decoderConfig.codec))
10977
11008
  throw new TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${k0.join(", ")}).`);
10978
- }, Ja = (t) => {
11009
+ }, Ea = (t) => {
10979
11010
  if (!t)
10980
11011
  throw new TypeError("Subtitle metadata must be provided.");
10981
11012
  if (typeof t != "object")
@@ -10994,7 +11025,7 @@ const O0 = [
10994
11025
  * License, v. 2.0. If a copy of the MPL was not distributed with this
10995
11026
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
10996
11027
  */
10997
- class Ea {
11028
+ class Na {
10998
11029
  constructor(e) {
10999
11030
  this.mutex = new bn(), this.firstMediaStreamTimestamp = null, this.trackTimestampInfo = /* @__PURE__ */ new WeakMap(), this.output = e;
11000
11031
  }
@@ -11067,7 +11098,7 @@ const ts = (t) => {
11067
11098
  for (let n = 0; n < i; n++)
11068
11099
  n + 2 < i && t[n] === 0 && t[n + 1] === 0 && t[n + 2] === 3 ? (e.push(0, 0), n += 2) : e.push(t[n]);
11069
11100
  return new Uint8Array(e);
11070
- }, Na = (t, e) => {
11101
+ }, Pa = (t, e) => {
11071
11102
  const i = t.reduce((o, m) => o + e + m.byteLength, 0), n = new Uint8Array(i);
11072
11103
  let d = 0;
11073
11104
  for (const o of t) {
@@ -11080,7 +11111,7 @@ const ts = (t) => {
11080
11111
  m.setUint16(d, o.byteLength, !1);
11081
11112
  break;
11082
11113
  case 3:
11083
- va(m, d, o.byteLength);
11114
+ Ia(m, d, o.byteLength);
11084
11115
  break;
11085
11116
  case 4:
11086
11117
  m.setUint32(d, o.byteLength, !1);
@@ -11089,12 +11120,12 @@ const ts = (t) => {
11089
11120
  d += e, n.set(o, d), d += o.byteLength;
11090
11121
  }
11091
11122
  return n;
11092
- }, gi = (t) => t[0] & 31, Pa = (t) => {
11123
+ }, gi = (t) => t[0] & 31, Ua = (t) => {
11093
11124
  try {
11094
- const e = ts(t), i = e.filter((G) => gi(G) === z0.SPS), n = e.filter((G) => gi(G) === z0.PPS), d = e.filter((G) => gi(G) === z0.SPS_EXT);
11125
+ const e = ts(t), i = e.filter((S) => gi(S) === z0.SPS), n = e.filter((S) => gi(S) === z0.PPS), d = e.filter((S) => gi(S) === z0.SPS_EXT);
11095
11126
  if (i.length === 0 || n.length === 0)
11096
11127
  return null;
11097
- const o = i[0], m = za(o);
11128
+ const o = i[0], m = Aa(o);
11098
11129
  ve(m !== null);
11099
11130
  const h = m.profileIdc === 100 || m.profileIdc === 110 || m.profileIdc === 122 || m.profileIdc === 144;
11100
11131
  return {
@@ -11114,7 +11145,7 @@ const ts = (t) => {
11114
11145
  } catch (e) {
11115
11146
  return console.error("Error building AVC Decoder Configuration Record:", e), null;
11116
11147
  }
11117
- }, Ua = (t) => {
11148
+ }, za = (t) => {
11118
11149
  const e = [];
11119
11150
  e.push(t.configurationVersion), e.push(t.avcProfileIndication), e.push(t.profileCompatibility), e.push(t.avcLevelIndication), e.push(252 | t.lengthSizeMinusOne & 3), e.push(224 | t.sequenceParameterSets.length & 31);
11120
11151
  for (const i of t.sequenceParameterSets) {
@@ -11140,15 +11171,15 @@ const ts = (t) => {
11140
11171
  }
11141
11172
  }
11142
11173
  return new Uint8Array(e);
11143
- }, za = (t) => {
11174
+ }, Aa = (t) => {
11144
11175
  try {
11145
11176
  const e = new A0(Oi(t));
11146
11177
  if (e.skipBits(1), e.skipBits(2), e.readBits(5) !== 7)
11147
11178
  return null;
11148
11179
  const n = e.readAlignedByte(), d = e.readAlignedByte(), o = e.readAlignedByte();
11149
11180
  ye(e);
11150
- let m = null, h = null, G = null;
11151
- if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e), G = ye(e), e.skipBits(1), e.readBits(1))) {
11181
+ let m = null, h = null, S = null;
11182
+ if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e), S = ye(e), e.skipBits(1), e.readBits(1))) {
11152
11183
  for (let O = 0; O < (m !== 3 ? 8 : 12); O++)
11153
11184
  if (e.readBits(1)) {
11154
11185
  const N = O < 6 ? 16 : 64;
@@ -11181,37 +11212,37 @@ const ts = (t) => {
11181
11212
  frameMbsOnlyFlag: v,
11182
11213
  chromaFormatIdc: m,
11183
11214
  bitDepthLumaMinus8: h,
11184
- bitDepthChromaMinus8: G
11215
+ bitDepthChromaMinus8: S
11185
11216
  };
11186
11217
  } catch (e) {
11187
11218
  return console.error("Error parsing AVC SPS:", e), null;
11188
11219
  }
11189
- }, H0 = (t) => t[0] >> 1 & 63, Aa = (t) => {
11220
+ }, H0 = (t) => t[0] >> 1 & 63, Oa = (t) => {
11190
11221
  try {
11191
11222
  const e = ts(t), i = e.filter((u) => H0(u) === Dt.VPS_NUT), n = e.filter((u) => H0(u) === Dt.SPS_NUT), d = e.filter((u) => H0(u) === Dt.PPS_NUT), o = e.filter((u) => H0(u) === Dt.PREFIX_SEI_NUT || H0(u) === Dt.SUFFIX_SEI_NUT);
11192
11223
  if (n.length === 0 || d.length === 0)
11193
11224
  return null;
11194
11225
  const m = n[0], h = new A0(Oi(m));
11195
11226
  h.skipBits(16), h.readBits(4);
11196
- const G = h.readBits(3), W = h.readBits(1), { general_profile_space: v, general_tier_flag: Z, general_profile_idc: O, general_profile_compatibility_flags: w, general_constraint_indicator_flags: N, general_level_idc: J } = Oa(h, G);
11227
+ const S = h.readBits(3), W = h.readBits(1), { general_profile_space: v, general_tier_flag: Z, general_profile_idc: O, general_profile_compatibility_flags: w, general_constraint_indicator_flags: N, general_level_idc: J } = ja(h, S);
11197
11228
  ye(h);
11198
11229
  const U = ye(h);
11199
11230
  U === 3 && h.skipBits(1), ye(h), ye(h), h.readBits(1) && (ye(h), ye(h), ye(h), ye(h));
11200
11231
  const k = ye(h), I = ye(h);
11201
11232
  ye(h);
11202
- const K = h.readBits(1) ? 0 : G;
11203
- for (let u = K; u <= G; u++)
11233
+ const K = h.readBits(1) ? 0 : S;
11234
+ for (let u = K; u <= S; u++)
11204
11235
  ye(h), ye(h), ye(h);
11205
- ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) && ja(h), h.skipBits(1), h.skipBits(1), h.readBits(1) && (h.skipBits(4), h.skipBits(4), ye(h), ye(h), h.skipBits(1));
11236
+ ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) && Qa(h), h.skipBits(1), h.skipBits(1), h.readBits(1) && (h.skipBits(4), h.skipBits(4), ye(h), ye(h), h.skipBits(1));
11206
11237
  const X = ye(h);
11207
- if (Qa(h, X), h.readBits(1)) {
11238
+ if (Da(h, X), h.readBits(1)) {
11208
11239
  const u = ye(h);
11209
11240
  for (let l = 0; l < u; l++)
11210
11241
  ye(h), h.skipBits(1);
11211
11242
  }
11212
11243
  h.skipBits(1), h.skipBits(1);
11213
11244
  let A = 0;
11214
- h.readBits(1) && (A = $a(h, G));
11245
+ h.readBits(1) && (A = qa(h, S));
11215
11246
  let T = 0;
11216
11247
  if (d.length > 0) {
11217
11248
  const u = d[0], l = new A0(Oi(u));
@@ -11264,7 +11295,7 @@ const ts = (t) => {
11264
11295
  bitDepthChromaMinus8: I,
11265
11296
  avgFrameRate: 0,
11266
11297
  constantFrameRate: 0,
11267
- numTemporalLayers: G + 1,
11298
+ numTemporalLayers: S + 1,
11268
11299
  temporalIdNested: W,
11269
11300
  lengthSizeMinusOne: 3,
11270
11301
  arrays: H
@@ -11272,7 +11303,7 @@ const ts = (t) => {
11272
11303
  } catch (e) {
11273
11304
  return console.error("Error building HEVC Decoder Configuration Record:", e), null;
11274
11305
  }
11275
- }, Oa = (t, e) => {
11306
+ }, ja = (t, e) => {
11276
11307
  const i = t.readBits(2), n = t.readBits(1), d = t.readBits(5);
11277
11308
  let o = 0;
11278
11309
  for (let v = 0; v < 32; v++)
@@ -11280,14 +11311,14 @@ const ts = (t) => {
11280
11311
  const m = new Uint8Array(6);
11281
11312
  for (let v = 0; v < 6; v++)
11282
11313
  m[v] = t.readBits(8);
11283
- const h = t.readBits(8), G = [], W = [];
11314
+ const h = t.readBits(8), S = [], W = [];
11284
11315
  for (let v = 0; v < e; v++)
11285
- G.push(t.readBits(1)), W.push(t.readBits(1));
11316
+ S.push(t.readBits(1)), W.push(t.readBits(1));
11286
11317
  if (e > 0)
11287
11318
  for (let v = e; v < 8; v++)
11288
11319
  t.skipBits(2);
11289
11320
  for (let v = 0; v < e; v++)
11290
- G[v] && t.skipBits(88), W[v] && t.skipBits(8);
11321
+ S[v] && t.skipBits(88), W[v] && t.skipBits(8);
11291
11322
  return {
11292
11323
  general_profile_space: i,
11293
11324
  general_tier_flag: n,
@@ -11296,7 +11327,7 @@ const ts = (t) => {
11296
11327
  general_constraint_indicator_flags: m,
11297
11328
  general_level_idc: h
11298
11329
  };
11299
- }, ja = (t) => {
11330
+ }, Qa = (t) => {
11300
11331
  for (let e = 0; e < 4; e++)
11301
11332
  for (let i = 0; i < (e === 3 ? 2 : 6); i++)
11302
11333
  if (!t.readBits(1))
@@ -11307,55 +11338,55 @@ const ts = (t) => {
11307
11338
  for (let o = 0; o < d; o++)
11308
11339
  s0(t);
11309
11340
  }
11310
- }, Qa = (t, e) => {
11341
+ }, Da = (t, e) => {
11311
11342
  const i = [];
11312
11343
  for (let n = 0; n < e; n++)
11313
- i[n] = Da(t, n, e, i);
11314
- }, Da = (t, e, i, n) => {
11344
+ i[n] = $a(t, n, e, i);
11345
+ }, $a = (t, e, i, n) => {
11315
11346
  let d = 0, o = 0, m = 0;
11316
11347
  if (e !== 0 && (o = t.readBits(1)), o) {
11317
11348
  if (e === i) {
11318
- const G = ye(t);
11319
- m = e - (G + 1);
11349
+ const S = ye(t);
11350
+ m = e - (S + 1);
11320
11351
  } else
11321
11352
  m = e - 1;
11322
11353
  t.readBits(1), ye(t);
11323
11354
  const h = n[m] ?? 0;
11324
- for (let G = 0; G <= h; G++)
11355
+ for (let S = 0; S <= h; S++)
11325
11356
  t.readBits(1) || t.readBits(1);
11326
11357
  d = n[m];
11327
11358
  } else {
11328
- const h = ye(t), G = ye(t);
11359
+ const h = ye(t), S = ye(t);
11329
11360
  for (let W = 0; W < h; W++)
11330
11361
  ye(t), t.readBits(1);
11331
- for (let W = 0; W < G; W++)
11362
+ for (let W = 0; W < S; W++)
11332
11363
  ye(t), t.readBits(1);
11333
- d = h + G;
11364
+ d = h + S;
11334
11365
  }
11335
11366
  return d;
11336
- }, $a = (t, e) => {
11337
- if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) && qa(t, !0, e)), t.readBits(1)) {
11367
+ }, qa = (t, e) => {
11368
+ if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) && el(t, !0, e)), t.readBits(1)) {
11338
11369
  t.readBits(1), t.readBits(1), t.readBits(1);
11339
11370
  const i = ye(t);
11340
11371
  return ye(t), ye(t), ye(t), ye(t), i;
11341
11372
  }
11342
11373
  return 0;
11343
- }, qa = (t, e, i) => {
11374
+ }, el = (t, e, i) => {
11344
11375
  let n = !1, d = !1, o = !1;
11345
11376
  n = t.readBits(1) === 1, d = t.readBits(1) === 1, (n || d) && (o = t.readBits(1) === 1, o && (t.readBits(8), t.readBits(5), t.readBits(1), t.readBits(5)), t.readBits(4), t.readBits(4), o && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5));
11346
11377
  for (let m = 0; m <= i; m++) {
11347
11378
  const h = t.readBits(1) === 1;
11348
- let G = !0;
11349
- h || (G = t.readBits(1) === 1);
11379
+ let S = !0;
11380
+ h || (S = t.readBits(1) === 1);
11350
11381
  let W = !1;
11351
- G ? ye(t) : W = t.readBits(1) === 1;
11382
+ S ? ye(t) : W = t.readBits(1) === 1;
11352
11383
  let v = 1;
11353
11384
  W || (v = ye(t) + 1), n && Cs(t, v, o), d && Cs(t, v, o);
11354
11385
  }
11355
11386
  }, Cs = (t, e, i) => {
11356
11387
  for (let n = 0; n < e; n++)
11357
11388
  ye(t), ye(t), i && (ye(t), ye(t)), t.readBits(1);
11358
- }, el = (t) => {
11389
+ }, tl = (t) => {
11359
11390
  const e = [];
11360
11391
  e.push(t.configurationVersion), e.push((t.generalProfileSpace & 3) << 6 | (t.generalTierFlag & 1) << 5 | t.generalProfileIdc & 31), e.push(t.generalProfileCompatibilityFlags >>> 24 & 255), e.push(t.generalProfileCompatibilityFlags >>> 16 & 255), e.push(t.generalProfileCompatibilityFlags >>> 8 & 255), e.push(t.generalProfileCompatibilityFlags & 255), e.push(...t.generalConstraintIndicatorFlags), e.push(t.generalLevelIdc & 255), e.push(240 | t.minSpatialSegmentationIdc >> 8 & 15), e.push(t.minSpatialSegmentationIdc & 255), e.push(252 | t.parallelismType & 3), e.push(252 | t.chromaFormatIdc & 3), e.push(248 | t.bitDepthLumaMinus8 & 7), e.push(248 | t.bitDepthChromaMinus8 & 7), e.push(t.avgFrameRate >> 8 & 255), e.push(t.avgFrameRate & 255), e.push((t.constantFrameRate & 3) << 6 | (t.numTemporalLayers & 7) << 3 | (t.temporalIdNested & 1) << 2 | t.lengthSizeMinusOne & 3), e.push(t.arrays.length & 255);
11361
11392
  for (const i of t.arrays) {
@@ -11367,8 +11398,8 @@ const ts = (t) => {
11367
11398
  }
11368
11399
  }
11369
11400
  return new Uint8Array(e);
11370
- }, tl = (t) => {
11371
- const e = _a(t), i = e.getUint8(9), n = e.getUint16(10, !0), d = e.getUint32(12, !0), o = e.getInt16(16, !0), m = e.getUint8(18);
11401
+ }, il = (t) => {
11402
+ const e = Sa(t), i = e.getUint8(9), n = e.getUint16(10, !0), d = e.getUint32(12, !0), o = e.getInt16(16, !0), m = e.getUint8(18);
11372
11403
  let h = null;
11373
11404
  return m && (h = t.subarray(19, 21 + i)), {
11374
11405
  outputChannelCount: i,
@@ -11510,7 +11541,7 @@ class B0 {
11510
11541
  * License, v. 2.0. If a copy of the MPL was not distributed with this
11511
11542
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
11512
11543
  */
11513
- const il = (t) => {
11544
+ const sl = (t) => {
11514
11545
  let i = (t.hasVideo ? "video/" : t.hasAudio ? "audio/" : "application/") + (t.isQuickTime ? "quicktime" : "mp4");
11515
11546
  if (t.codecStrings.length > 0) {
11516
11547
  const n = [...new Set(t.codecStrings)];
@@ -11533,7 +11564,7 @@ const Fi = 8, Js = 16;
11533
11564
  * License, v. 2.0. If a copy of the MPL was not distributed with this
11534
11565
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
11535
11566
  */
11536
- const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, sl = (t) => {
11567
+ const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, nl = (t) => {
11537
11568
  const e = Math.floor(t / 36e5), i = Math.floor(t % (60 * 60 * 1e3) / (60 * 1e3)), n = Math.floor(t % (60 * 1e3) / 1e3), d = t % 1e3;
11538
11569
  return e.toString().padStart(2, "0") + ":" + i.toString().padStart(2, "0") + ":" + n.toString().padStart(2, "0") + "." + d.toString().padStart(3, "0");
11539
11570
  };
@@ -11595,7 +11626,7 @@ class Ns {
11595
11626
  }
11596
11627
  }
11597
11628
  }
11598
- const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256], Ge = (t) => (qt.setUint16(0, t, !1), [He[0], He[1]]), Xn = (t) => (qt.setInt16(0, t, !1), [He[0], He[1]]), _n = (t) => (qt.setUint32(0, t, !1), [He[1], He[2], He[3]]), me = (t) => (qt.setUint32(0, t, !1), [He[0], He[1], He[2], He[3]]), d0 = (t) => (qt.setInt32(0, t, !1), [He[0], He[1], He[2], He[3]]), V0 = (t) => (qt.setUint32(0, Math.floor(t / 2 ** 32), !1), qt.setUint32(4, t, !1), [He[0], He[1], He[2], He[3], He[4], He[5], He[6], He[7]]), Gn = (t) => (qt.setInt16(0, 2 ** 8 * t, !1), [He[0], He[1]]), i0 = (t) => (qt.setInt32(0, 2 ** 16 * t, !1), [He[0], He[1], He[2], He[3]]), Ji = (t) => (qt.setInt32(0, 2 ** 30 * t, !1), [He[0], He[1], He[2], He[3]]), Ei = (t, e) => {
11629
+ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256], Se = (t) => (qt.setUint16(0, t, !1), [He[0], He[1]]), Xn = (t) => (qt.setInt16(0, t, !1), [He[0], He[1]]), _n = (t) => (qt.setUint32(0, t, !1), [He[1], He[2], He[3]]), me = (t) => (qt.setUint32(0, t, !1), [He[0], He[1], He[2], He[3]]), d0 = (t) => (qt.setInt32(0, t, !1), [He[0], He[1], He[2], He[3]]), V0 = (t) => (qt.setUint32(0, Math.floor(t / 2 ** 32), !1), qt.setUint32(4, t, !1), [He[0], He[1], He[2], He[3], He[4], He[5], He[6], He[7]]), Sn = (t) => (qt.setInt16(0, 2 ** 8 * t, !1), [He[0], He[1]]), i0 = (t) => (qt.setInt32(0, 2 ** 16 * t, !1), [He[0], He[1], He[2], He[3]]), Ji = (t) => (qt.setInt32(0, 2 ** 30 * t, !1), [He[0], He[1], He[2], He[3]]), Ei = (t, e) => {
11599
11630
  const i = [];
11600
11631
  let n = t;
11601
11632
  do {
@@ -11611,7 +11642,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11611
11642
  for (const i of t)
11612
11643
  (!e || i.timestamp > e.timestamp) && (e = i);
11613
11644
  return e;
11614
- }, Sn = (t) => {
11645
+ }, Gn = (t) => {
11615
11646
  const e = t * (Math.PI / 180), i = Math.round(Math.cos(e)), n = Math.round(Math.sin(e));
11616
11647
  return [
11617
11648
  i,
@@ -11624,7 +11655,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11624
11655
  0,
11625
11656
  1
11626
11657
  ];
11627
- }, vn = /* @__PURE__ */ Sn(0), In = (t) => [
11658
+ }, vn = /* @__PURE__ */ Gn(0), In = (t) => [
11628
11659
  i0(t[0]),
11629
11660
  i0(t[1]),
11630
11661
  Ji(t[2]),
@@ -11634,18 +11665,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11634
11665
  i0(t[6]),
11635
11666
  i0(t[7]),
11636
11667
  Ji(t[8])
11637
- ], Se = (t, e, i) => ({
11668
+ ], Ge = (t, e, i) => ({
11638
11669
  type: t,
11639
11670
  contents: e && new Uint8Array(e.flat(10)),
11640
11671
  children: i
11641
- }), Ye = (t, e, i, n, d) => Se(t, [Ue(e), _n(i), n ?? []], d), nl = (t) => t.isQuickTime ? Se("ftyp", [
11672
+ }), Ye = (t, e, i, n, d) => Ge(t, [Ue(e), _n(i), n ?? []], d), rl = (t) => t.isQuickTime ? Ge("ftyp", [
11642
11673
  at("qt "),
11643
11674
  // Major brand
11644
11675
  me(512),
11645
11676
  // Minor version
11646
11677
  // Compatible brands
11647
11678
  at("qt ")
11648
- ]) : t.fragmented ? Se("ftyp", [
11679
+ ]) : t.fragmented ? Ge("ftyp", [
11649
11680
  at("iso5"),
11650
11681
  // Major brand
11651
11682
  me(512),
@@ -11654,7 +11685,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11654
11685
  at("iso5"),
11655
11686
  at("iso6"),
11656
11687
  at("mp41")
11657
- ]) : Se("ftyp", [
11688
+ ]) : Ge("ftyp", [
11658
11689
  at("isom"),
11659
11690
  // Major brand
11660
11691
  me(512),
@@ -11663,12 +11694,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11663
11694
  at("isom"),
11664
11695
  t.holdsAvc ? at("avc1") : [],
11665
11696
  at("mp41")
11666
- ]), ci = (t) => ({ type: "mdat", largeSize: t }), rl = (t) => ({ type: "free", size: t }), U0 = (t) => Se("moov", void 0, [
11667
- al(t.creationTime, t.trackDatas),
11668
- ...t.trackDatas.map((e) => ll(e, t.creationTime)),
11669
- t.isFragmented ? El(t.trackDatas) : null,
11670
- t1(t)
11671
- ]), al = (t, e) => {
11697
+ ]), ci = (t) => ({ type: "mdat", largeSize: t }), al = (t) => ({ type: "free", size: t }), U0 = (t) => Ge("moov", void 0, [
11698
+ ll(t.creationTime, t.trackDatas),
11699
+ ...t.trackDatas.map((e) => ol(e, t.creationTime)),
11700
+ t.isFragmented ? Nl(t.trackDatas) : null,
11701
+ i1(t)
11702
+ ]), ll = (t, e) => {
11672
11703
  const i = tt(Math.max(0, ...e.filter((m) => m.samples.length > 0).map((m) => {
11673
11704
  const h = is(m.samples);
11674
11705
  return h.timestamp + h.duration;
@@ -11684,7 +11715,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11684
11715
  // Duration
11685
11716
  i0(1),
11686
11717
  // Preferred rate
11687
- Gn(1),
11718
+ Sn(1),
11688
11719
  // Preferred volume
11689
11720
  Array(10).fill(0),
11690
11721
  // Reserved
@@ -11695,28 +11726,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11695
11726
  me(n)
11696
11727
  // Next track ID
11697
11728
  ]);
11698
- }, ll = (t, e) => {
11699
- const i = u1(t);
11700
- return Se("trak", void 0, [
11701
- ol(t, e),
11729
+ }, ol = (t, e) => {
11730
+ const i = h1(t);
11731
+ return Ge("trak", void 0, [
11702
11732
  cl(t, e),
11703
- i.name !== void 0 ? Se("udta", void 0, [
11704
- Se("name", [
11733
+ dl(t, e),
11734
+ i.name !== void 0 ? Ge("udta", void 0, [
11735
+ Ge("name", [
11705
11736
  ...$t.encode(i.name)
11706
11737
  ])
11707
11738
  ]) : null
11708
11739
  ]);
11709
- }, ol = (t, e) => {
11710
- var G;
11740
+ }, cl = (t, e) => {
11741
+ var S;
11711
11742
  const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, ji), d = !M0(e) || !M0(n), o = d ? V0 : me;
11712
11743
  let m;
11713
11744
  if (t.type === "video") {
11714
11745
  const W = t.track.metadata.rotation;
11715
- m = Sn(W ?? 0);
11746
+ m = Gn(W ?? 0);
11716
11747
  } else
11717
11748
  m = vn;
11718
11749
  let h = 2;
11719
- return ((G = t.track.metadata.disposition) == null ? void 0 : G.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
11750
+ return ((S = t.track.metadata.disposition) == null ? void 0 : S.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
11720
11751
  o(e),
11721
11752
  // Creation time
11722
11753
  o(e),
@@ -11729,13 +11760,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11729
11760
  // Duration
11730
11761
  Array(8).fill(0),
11731
11762
  // Reserved
11732
- Ge(0),
11763
+ Se(0),
11733
11764
  // Layer
11734
- Ge(t.track.id),
11765
+ Se(t.track.id),
11735
11766
  // Alternate group
11736
- Gn(t.type === "audio" ? 1 : 0),
11767
+ Sn(t.type === "audio" ? 1 : 0),
11737
11768
  // Volume
11738
- Ge(0),
11769
+ Se(0),
11739
11770
  // Reserved
11740
11771
  In(m),
11741
11772
  // Matrix
@@ -11744,11 +11775,11 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11744
11775
  i0(t.type === "video" ? t.info.height : 0)
11745
11776
  // Track height
11746
11777
  ]);
11747
- }, cl = (t, e) => Se("mdia", void 0, [
11748
- dl(t, e),
11749
- ss(!0, ml[t.type], ul[t.type]),
11750
- hl(t)
11751
- ]), dl = (t, e) => {
11778
+ }, dl = (t, e) => Ge("mdia", void 0, [
11779
+ ml(t, e),
11780
+ ss(!0, ul[t.type], hl[t.type]),
11781
+ bl(t)
11782
+ ]), ml = (t, e) => {
11752
11783
  const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, t.timescale), d = !M0(e) || !M0(n), o = d ? V0 : me;
11753
11784
  return Ye("mdhd", +d, 0, [
11754
11785
  o(e),
@@ -11759,16 +11790,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11759
11790
  // Timescale
11760
11791
  o(n),
11761
11792
  // Duration
11762
- Ge(Wn(t.track.metadata.languageCode ?? Ia)),
11793
+ Se(Wn(t.track.metadata.languageCode ?? Va)),
11763
11794
  // Language
11764
- Ge(0)
11795
+ Se(0)
11765
11796
  // Quality
11766
11797
  ]);
11767
- }, ml = {
11798
+ }, ul = {
11768
11799
  video: "vide",
11769
11800
  audio: "soun",
11770
11801
  subtitle: "text"
11771
- }, ul = {
11802
+ }, hl = {
11772
11803
  video: "MediabunnyVideoHandler",
11773
11804
  audio: "MediabunnySoundHandler",
11774
11805
  subtitle: "MediabunnyTextHandler"
@@ -11785,75 +11816,75 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11785
11816
  // Component flags mask
11786
11817
  at(i, !0)
11787
11818
  // Component name
11788
- ]), hl = (t) => Se("minf", void 0, [
11789
- fl[t.type](),
11790
- Zl(),
11819
+ ]), bl = (t) => Ge("minf", void 0, [
11820
+ Zl[t.type](),
11821
+ Xl(),
11791
11822
  Gl(t)
11792
- ]), bl = () => Ye("vmhd", 0, 1, [
11793
- Ge(0),
11823
+ ]), pl = () => Ye("vmhd", 0, 1, [
11824
+ Se(0),
11794
11825
  // Graphics mode
11795
- Ge(0),
11826
+ Se(0),
11796
11827
  // Opcolor R
11797
- Ge(0),
11828
+ Se(0),
11798
11829
  // Opcolor G
11799
- Ge(0)
11830
+ Se(0)
11800
11831
  // Opcolor B
11801
- ]), pl = () => Ye("smhd", 0, 0, [
11802
- Ge(0),
11832
+ ]), yl = () => Ye("smhd", 0, 0, [
11833
+ Se(0),
11803
11834
  // Balance
11804
- Ge(0)
11835
+ Se(0)
11805
11836
  // Reserved
11806
- ]), yl = () => Ye("nmhd", 0, 0), fl = {
11807
- video: bl,
11808
- audio: pl,
11809
- subtitle: yl
11810
- }, Zl = () => Se("dinf", void 0, [
11811
- Xl()
11812
- ]), Xl = () => Ye("dref", 0, 0, [
11837
+ ]), fl = () => Ye("nmhd", 0, 0), Zl = {
11838
+ video: pl,
11839
+ audio: yl,
11840
+ subtitle: fl
11841
+ }, Xl = () => Ge("dinf", void 0, [
11842
+ _l()
11843
+ ]), _l = () => Ye("dref", 0, 0, [
11813
11844
  me(1)
11814
11845
  // Entry count
11815
11846
  ], [
11816
- _l()
11817
- ]), _l = () => Ye("url ", 0, 1), Gl = (t) => {
11847
+ Sl()
11848
+ ]), Sl = () => Ye("url ", 0, 1), Gl = (t) => {
11818
11849
  const e = t.compositionTimeOffsetTable.length > 1 || t.compositionTimeOffsetTable.some((i) => i.sampleCompositionTimeOffset !== 0);
11819
- return Se("stbl", void 0, [
11820
- Sl(t),
11821
- Ml(t),
11822
- e ? Fl(t) : null,
11850
+ return Ge("stbl", void 0, [
11851
+ vl(t),
11852
+ kl(t),
11823
11853
  e ? Jl(t) : null,
11824
- Bl(t),
11854
+ e ? El(t) : null,
11825
11855
  Cl(t),
11826
11856
  gl(t),
11827
- kl(t)
11857
+ Fl(t),
11858
+ Bl(t)
11828
11859
  ]);
11829
- }, Sl = (t) => {
11860
+ }, vl = (t) => {
11830
11861
  let e;
11831
11862
  if (t.type === "video")
11832
- e = vl(r1(t.track.source._codec, t.info.decoderConfig.codec), t);
11863
+ e = Il(a1(t.track.source._codec, t.info.decoderConfig.codec), t);
11833
11864
  else if (t.type === "audio") {
11834
11865
  const i = Tn(t.track.source._codec, t.muxer.isQuickTime);
11835
- ve(i), e = Wl(i, t);
11836
- } else t.type === "subtitle" && (e = wl(o1[t.track.source._codec], t));
11866
+ ve(i), e = Ll(i, t);
11867
+ } else t.type === "subtitle" && (e = Kl(c1[t.track.source._codec], t));
11837
11868
  return ve(e), Ye("stsd", 0, 0, [
11838
11869
  me(1)
11839
11870
  // Entry count
11840
11871
  ], [
11841
11872
  e
11842
11873
  ]);
11843
- }, vl = (t, e) => Se(t, [
11874
+ }, Il = (t, e) => Ge(t, [
11844
11875
  Array(6).fill(0),
11845
11876
  // Reserved
11846
- Ge(1),
11877
+ Se(1),
11847
11878
  // Data reference index
11848
- Ge(0),
11879
+ Se(0),
11849
11880
  // Pre-defined
11850
- Ge(0),
11881
+ Se(0),
11851
11882
  // Reserved
11852
11883
  Array(12).fill(0),
11853
11884
  // Pre-defined
11854
- Ge(e.info.width),
11885
+ Se(e.info.width),
11855
11886
  // Width
11856
- Ge(e.info.height),
11887
+ Se(e.info.height),
11857
11888
  // Height
11858
11889
  me(4718592),
11859
11890
  // Horizontal resolution
@@ -11861,45 +11892,45 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11861
11892
  // Vertical resolution
11862
11893
  me(0),
11863
11894
  // Reserved
11864
- Ge(1),
11895
+ Se(1),
11865
11896
  // Frame count
11866
11897
  Array(32).fill(0),
11867
11898
  // Compressor name
11868
- Ge(24),
11899
+ Se(24),
11869
11900
  // Depth
11870
11901
  Xn(65535)
11871
11902
  // Pre-defined
11872
11903
  ], [
11873
- a1[e.track.source._codec](e),
11874
- Ga(e.info.decoderConfig.colorSpace) ? Il(e) : null
11875
- ]), Il = (t) => Se("colr", [
11904
+ l1[e.track.source._codec](e),
11905
+ Ga(e.info.decoderConfig.colorSpace) ? Vl(e) : null
11906
+ ]), Vl = (t) => Ge("colr", [
11876
11907
  at("nclx"),
11877
11908
  // Colour type
11878
- Ge($i[t.info.decoderConfig.colorSpace.primaries]),
11909
+ Se($i[t.info.decoderConfig.colorSpace.primaries]),
11879
11910
  // Colour primaries
11880
- Ge(qi[t.info.decoderConfig.colorSpace.transfer]),
11911
+ Se(qi[t.info.decoderConfig.colorSpace.transfer]),
11881
11912
  // Transfer characteristics
11882
- Ge(es[t.info.decoderConfig.colorSpace.matrix]),
11913
+ Se(es[t.info.decoderConfig.colorSpace.matrix]),
11883
11914
  // Matrix coefficients
11884
11915
  Ue((t.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)
11885
11916
  // Full range flag
11886
- ]), Vl = (t) => t.info.decoderConfig && Se("avcC", [
11917
+ ]), Rl = (t) => t.info.decoderConfig && Ge("avcC", [
11887
11918
  // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here
11888
11919
  ...Q0(t.info.decoderConfig.description)
11889
- ]), Rl = (t) => t.info.decoderConfig && Se("hvcC", [
11920
+ ]), Tl = (t) => t.info.decoderConfig && Ge("hvcC", [
11890
11921
  // For HEVC, description is an HEVCDecoderConfigurationRecord, so nothing else to do here
11891
11922
  ...Q0(t.info.decoderConfig.description)
11892
11923
  ]), Ps = (t) => {
11893
11924
  var O, w, N, J;
11894
11925
  if (!t.info.decoderConfig)
11895
11926
  return null;
11896
- const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0), G = (o << 4) + (m << 1) + h, W = i[5] ? Number(i[5]) : (w = e.colorSpace) != null && w.primaries ? $i[e.colorSpace.primaries] : 2, v = i[6] ? Number(i[6]) : (N = e.colorSpace) != null && N.transfer ? qi[e.colorSpace.transfer] : 2, Z = i[7] ? Number(i[7]) : (J = e.colorSpace) != null && J.matrix ? es[e.colorSpace.matrix] : 2;
11927
+ const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0), S = (o << 4) + (m << 1) + h, W = i[5] ? Number(i[5]) : (w = e.colorSpace) != null && w.primaries ? $i[e.colorSpace.primaries] : 2, v = i[6] ? Number(i[6]) : (N = e.colorSpace) != null && N.transfer ? qi[e.colorSpace.transfer] : 2, Z = i[7] ? Number(i[7]) : (J = e.colorSpace) != null && J.matrix ? es[e.colorSpace.matrix] : 2;
11897
11928
  return Ye("vpcC", 1, 0, [
11898
11929
  Ue(n),
11899
11930
  // Profile
11900
11931
  Ue(d),
11901
11932
  // Level
11902
- Ue(G),
11933
+ Ue(S),
11903
11934
  // Bit depth, chroma subsampling, full range
11904
11935
  Ue(W),
11905
11936
  // Colour primaries
@@ -11907,10 +11938,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11907
11938
  // Transfer characteristics
11908
11939
  Ue(Z),
11909
11940
  // Matrix coefficients
11910
- Ge(0)
11941
+ Se(0)
11911
11942
  // Codec initialization data size
11912
11943
  ]);
11913
- }, Tl = (t) => Se("av1C", Ha(t.info.decoderConfig.codec)), Wl = (t, e) => {
11944
+ }, Wl = (t) => Ge("av1C", Ya(t.info.decoderConfig.codec)), Ll = (t, e) => {
11914
11945
  var o;
11915
11946
  let i = 0, n, d = 16;
11916
11947
  if (k0.includes(e.track.source._codec)) {
@@ -11920,48 +11951,48 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11920
11951
  return i === 0 ? n = [
11921
11952
  Array(6).fill(0),
11922
11953
  // Reserved
11923
- Ge(1),
11954
+ Se(1),
11924
11955
  // Data reference index
11925
- Ge(i),
11956
+ Se(i),
11926
11957
  // Version
11927
- Ge(0),
11958
+ Se(0),
11928
11959
  // Revision level
11929
11960
  me(0),
11930
11961
  // Vendor
11931
- Ge(e.info.numberOfChannels),
11962
+ Se(e.info.numberOfChannels),
11932
11963
  // Number of channels
11933
- Ge(d),
11964
+ Se(d),
11934
11965
  // Sample size (bits)
11935
- Ge(0),
11966
+ Se(0),
11936
11967
  // Compression ID
11937
- Ge(0),
11968
+ Se(0),
11938
11969
  // Packet size
11939
- Ge(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11970
+ Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11940
11971
  // Sample rate (upper)
11941
- Ge(0)
11972
+ Se(0)
11942
11973
  // Sample rate (lower)
11943
11974
  ] : n = [
11944
11975
  Array(6).fill(0),
11945
11976
  // Reserved
11946
- Ge(1),
11977
+ Se(1),
11947
11978
  // Data reference index
11948
- Ge(i),
11979
+ Se(i),
11949
11980
  // Version
11950
- Ge(0),
11981
+ Se(0),
11951
11982
  // Revision level
11952
11983
  me(0),
11953
11984
  // Vendor
11954
- Ge(e.info.numberOfChannels),
11985
+ Se(e.info.numberOfChannels),
11955
11986
  // Number of channels
11956
- Ge(Math.min(d, 16)),
11987
+ Se(Math.min(d, 16)),
11957
11988
  // Sample size (bits)
11958
- Ge(0),
11989
+ Se(0),
11959
11990
  // Compression ID
11960
- Ge(0),
11991
+ Se(0),
11961
11992
  // Packet size
11962
- Ge(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11993
+ Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11963
11994
  // Sample rate (upper)
11964
- Ge(0),
11995
+ Se(0),
11965
11996
  // Sample rate (lower)
11966
11997
  me(1),
11967
11998
  // Samples per packet (must be 1 for uncompressed formats)
@@ -11971,8 +12002,8 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11971
12002
  // Bytes per frame
11972
12003
  me(2)
11973
12004
  // Bytes per sample (constant in FFmpeg)
11974
- ], Se(t, n, [
11975
- ((o = l1(e.track.source._codec, e.muxer.isQuickTime)) == null ? void 0 : o(e)) ?? null
12005
+ ], Ge(t, n, [
12006
+ ((o = o1(e.track.source._codec, e.muxer.isQuickTime)) == null ? void 0 : o(e)) ?? null
11976
12007
  ]);
11977
12008
  }, Ni = (t) => {
11978
12009
  let e;
@@ -12012,7 +12043,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12012
12043
  ];
12013
12044
  }
12014
12045
  return i = [
12015
- ...Ge(1),
12046
+ ...Se(1),
12016
12047
  // ES_ID = 1
12017
12048
  ...Ue(0),
12018
12049
  // flags etc = 0
@@ -12032,33 +12063,33 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12032
12063
  ...Ei(i.length),
12033
12064
  ...i
12034
12065
  ], Ye("esds", 0, 0, i);
12035
- }, c0 = (t) => Se("wave", void 0, [
12036
- Ll(t),
12066
+ }, c0 = (t) => Ge("wave", void 0, [
12037
12067
  xl(t),
12038
- Se("\0\0\0\0")
12068
+ Hl(t),
12069
+ Ge("\0\0\0\0")
12039
12070
  // NULL tag at the end
12040
- ]), Ll = (t) => Se("frma", [
12071
+ ]), xl = (t) => Ge("frma", [
12041
12072
  at(Tn(t.track.source._codec, t.muxer.isQuickTime))
12042
- ]), xl = (t) => {
12073
+ ]), Hl = (t) => {
12043
12074
  const { littleEndian: e } = D0(t.track.source._codec);
12044
- return Se("enda", [
12045
- Ge(+e)
12075
+ return Ge("enda", [
12076
+ Se(+e)
12046
12077
  ]);
12047
- }, Hl = (t) => {
12048
- var G;
12078
+ }, Yl = (t) => {
12079
+ var S;
12049
12080
  let e = t.info.numberOfChannels, i = 3840, n = t.info.sampleRate, d = 0, o = 0, m = new Uint8Array(0);
12050
- const h = (G = t.info.decoderConfig) == null ? void 0 : G.description;
12081
+ const h = (S = t.info.decoderConfig) == null ? void 0 : S.description;
12051
12082
  if (h) {
12052
12083
  ve(h.byteLength >= 18);
12053
- const W = Q0(h), v = tl(W);
12084
+ const W = Q0(h), v = il(W);
12054
12085
  e = v.outputChannelCount, i = v.preSkip, n = v.inputSampleRate, d = v.outputGain, o = v.channelMappingFamily, v.channelMappingTable && (m = v.channelMappingTable);
12055
12086
  }
12056
- return Se("dOps", [
12087
+ return Ge("dOps", [
12057
12088
  Ue(0),
12058
12089
  // Version
12059
12090
  Ue(e),
12060
12091
  // OutputChannelCount
12061
- Ge(i),
12092
+ Se(i),
12062
12093
  // PreSkip
12063
12094
  me(n),
12064
12095
  // InputSampleRate
@@ -12068,7 +12099,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12068
12099
  // ChannelMappingFamily
12069
12100
  ...m
12070
12101
  ]);
12071
- }, Yl = (t) => {
12102
+ }, wl = (t) => {
12072
12103
  var n;
12073
12104
  const e = (n = t.info.decoderConfig) == null ? void 0 : n.description;
12074
12105
  ve(e);
@@ -12082,16 +12113,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12082
12113
  Ue(n),
12083
12114
  Ue(8 * i)
12084
12115
  ]);
12085
- }, wl = (t, e) => Se(t, [
12116
+ }, Kl = (t, e) => Ge(t, [
12086
12117
  Array(6).fill(0),
12087
12118
  // Reserved
12088
- Ge(1)
12119
+ Se(1)
12089
12120
  // Data reference index
12090
12121
  ], [
12091
- c1[e.track.source._codec](e)
12092
- ]), Kl = (t) => Se("vttC", [
12122
+ d1[e.track.source._codec](e)
12123
+ ]), Ml = (t) => Ge("vttC", [
12093
12124
  ...$t.encode(t.info.config.description)
12094
- ]), Ml = (t) => Ye("stts", 0, 0, [
12125
+ ]), kl = (t) => Ye("stts", 0, 0, [
12095
12126
  me(t.timeToSampleTable.length),
12096
12127
  // Number of entries
12097
12128
  t.timeToSampleTable.map((e) => [
@@ -12100,7 +12131,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12100
12131
  me(e.sampleDelta)
12101
12132
  // Sample duration
12102
12133
  ])
12103
- ]), kl = (t) => {
12134
+ ]), Bl = (t) => {
12104
12135
  if (t.samples.every((i) => i.type === "key"))
12105
12136
  return null;
12106
12137
  const e = [...t.samples.entries()].filter(([, i]) => i.type === "key");
@@ -12110,7 +12141,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12110
12141
  e.map(([i]) => me(i + 1))
12111
12142
  // Sync sample table
12112
12143
  ]);
12113
- }, Bl = (t) => Ye("stsc", 0, 0, [
12144
+ }, Cl = (t) => Ye("stsc", 0, 0, [
12114
12145
  me(t.compactlyCodedChunkTable.length),
12115
12146
  // Number of entries
12116
12147
  t.compactlyCodedChunkTable.map((e) => [
@@ -12121,7 +12152,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12121
12152
  me(1)
12122
12153
  // Sample description index
12123
12154
  ])
12124
- ]), Cl = (t) => {
12155
+ ]), gl = (t) => {
12125
12156
  if (t.type === "audio" && t.info.requiresPcmTransformation) {
12126
12157
  const { sampleSize: e } = D0(t.track.source._codec);
12127
12158
  return Ye("stsz", 0, 0, [
@@ -12138,7 +12169,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12138
12169
  t.samples.map((e) => me(e.size))
12139
12170
  // Sample size table
12140
12171
  ]);
12141
- }, gl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
12172
+ }, Fl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
12142
12173
  me(t.finalizedChunks.length),
12143
12174
  // Number of entries
12144
12175
  t.finalizedChunks.map((e) => V0(e.offset))
@@ -12148,7 +12179,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12148
12179
  // Number of entries
12149
12180
  t.finalizedChunks.map((e) => me(e.offset))
12150
12181
  // Chunk offset table
12151
- ]), Fl = (t) => Ye("ctts", 1, 0, [
12182
+ ]), Jl = (t) => Ye("ctts", 1, 0, [
12152
12183
  me(t.compositionTimeOffsetTable.length),
12153
12184
  // Number of entries
12154
12185
  t.compositionTimeOffsetTable.map((e) => [
@@ -12157,7 +12188,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12157
12188
  d0(e.sampleCompositionTimeOffset)
12158
12189
  // Sample offset
12159
12190
  ])
12160
- ]), Jl = (t) => {
12191
+ ]), El = (t) => {
12161
12192
  let e = 1 / 0, i = -1 / 0, n = 1 / 0, d = -1 / 0;
12162
12193
  ve(t.compositionTimeOffsetTable.length > 0), ve(t.samples.length > 0);
12163
12194
  for (let m = 0; m < t.compositionTimeOffsetTable.length; m++) {
@@ -12181,7 +12212,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12181
12212
  d0(d)
12182
12213
  // Composition end time
12183
12214
  ]);
12184
- }, El = (t) => Se("mvex", void 0, t.map(Nl)), Nl = (t) => Ye("trex", 0, 0, [
12215
+ }, Nl = (t) => Ge("mvex", void 0, t.map(Pl)), Pl = (t) => Ye("trex", 0, 0, [
12185
12216
  me(t.track.id),
12186
12217
  // Track ID
12187
12218
  me(1),
@@ -12192,21 +12223,21 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12192
12223
  // Default sample size
12193
12224
  me(0)
12194
12225
  // Default sample flags
12195
- ]), Us = (t, e) => Se("moof", void 0, [
12196
- Pl(t),
12197
- ...e.map(Ul)
12198
- ]), Pl = (t) => Ye("mfhd", 0, 0, [
12226
+ ]), Us = (t, e) => Ge("moof", void 0, [
12227
+ Ul(t),
12228
+ ...e.map(zl)
12229
+ ]), Ul = (t) => Ye("mfhd", 0, 0, [
12199
12230
  me(t)
12200
12231
  // Sequence number
12201
12232
  ]), Vn = (t) => {
12202
12233
  let e = 0, i = 0;
12203
12234
  const n = 0, d = 0, o = t.type === "delta";
12204
12235
  return i |= +o, o ? e |= 1 : e |= 2, e << 24 | i << 16 | n << 8 | d;
12205
- }, Ul = (t) => Se("traf", void 0, [
12206
- zl(t),
12236
+ }, zl = (t) => Ge("traf", void 0, [
12207
12237
  Al(t),
12208
- Ol(t)
12209
- ]), zl = (t) => {
12238
+ Ol(t),
12239
+ jl(t)
12240
+ ]), Al = (t) => {
12210
12241
  ve(t.currentChunk);
12211
12242
  let e = 0;
12212
12243
  e |= 8, e |= 16, e |= 32, e |= 131072;
@@ -12225,12 +12256,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12225
12256
  me(n.flags)
12226
12257
  // Default sample flags
12227
12258
  ]);
12228
- }, Al = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
12259
+ }, Ol = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
12229
12260
  V0(tt(t.currentChunk.startTimestamp, t.timescale))
12230
12261
  // Base Media Decode Time
12231
- ])), Ol = (t) => {
12262
+ ])), jl = (t) => {
12232
12263
  ve(t.currentChunk);
12233
- const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Vn), d = t.currentChunk.samples.map((J) => tt(J.timestamp - J.decodeTimestamp, t.timescale)), o = new Set(e), m = new Set(i), h = new Set(n), G = new Set(d), W = h.size === 2 && n[0] !== n[1], v = o.size > 1, Z = m.size > 1, O = !W && h.size > 1, w = G.size > 1 || [...G].some((J) => J !== 0);
12264
+ const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Vn), d = t.currentChunk.samples.map((J) => tt(J.timestamp - J.decodeTimestamp, t.timescale)), o = new Set(e), m = new Set(i), h = new Set(n), S = new Set(d), W = h.size === 2 && n[0] !== n[1], v = o.size > 1, Z = m.size > 1, O = !W && h.size > 1, w = S.size > 1 || [...S].some((J) => J !== 0);
12234
12265
  let N = 0;
12235
12266
  return N |= 1, N |= 4 * +W, N |= 256 * +v, N |= 512 * +Z, N |= 1024 * +O, N |= 2048 * +w, Ye("trun", 1, N, [
12236
12267
  me(t.currentChunk.samples.length),
@@ -12249,10 +12280,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12249
12280
  w ? d0(d[U]) : []
12250
12281
  ])
12251
12282
  ]);
12252
- }, jl = (t) => Se("mfra", void 0, [
12253
- ...t.map(Ql),
12254
- Dl()
12255
- ]), Ql = (t, e) => Ye("tfra", 1, 0, [
12283
+ }, Ql = (t) => Ge("mfra", void 0, [
12284
+ ...t.map(Dl),
12285
+ $l()
12286
+ ]), Dl = (t, e) => Ye("tfra", 1, 0, [
12256
12287
  me(t.track.id),
12257
12288
  // Track ID
12258
12289
  me(63),
@@ -12271,28 +12302,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12271
12302
  me(1)
12272
12303
  // Sample number
12273
12304
  ])
12274
- ]), Dl = () => Ye("mfro", 0, 0, [
12305
+ ]), $l = () => Ye("mfro", 0, 0, [
12275
12306
  // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box
12276
12307
  // is known
12277
12308
  me(0)
12278
12309
  // Size
12279
- ]), $l = () => Se("vtte"), ql = (t, e, i, n, d) => Se("vttc", void 0, [
12280
- d !== null ? Se("vsid", [d0(d)]) : null,
12281
- i !== null ? Se("iden", [...$t.encode(i)]) : null,
12282
- e !== null ? Se("ctim", [...$t.encode(sl(e))]) : null,
12283
- n !== null ? Se("sttg", [...$t.encode(n)]) : null,
12284
- Se("payl", [...$t.encode(t)])
12285
- ]), e1 = (t) => Se("vtta", [...$t.encode(t)]), t1 = (t) => {
12310
+ ]), ql = () => Ge("vtte"), e1 = (t, e, i, n, d) => Ge("vttc", void 0, [
12311
+ d !== null ? Ge("vsid", [d0(d)]) : null,
12312
+ i !== null ? Ge("iden", [...$t.encode(i)]) : null,
12313
+ e !== null ? Ge("ctim", [...$t.encode(nl(e))]) : null,
12314
+ n !== null ? Ge("sttg", [...$t.encode(n)]) : null,
12315
+ Ge("payl", [...$t.encode(t)])
12316
+ ]), t1 = (t) => Ge("vtta", [...$t.encode(t)]), i1 = (t) => {
12286
12317
  const e = [], i = t.format._options.metadataFormat ?? "auto", n = t.output._metadataTags;
12287
12318
  if (i === "mdir" || i === "auto" && !t.isQuickTime) {
12288
- const d = s1(n);
12319
+ const d = n1(n);
12289
12320
  d && e.push(d);
12290
12321
  } else if (i === "mdta") {
12291
- const d = n1(n);
12322
+ const d = r1(n);
12292
12323
  d && e.push(d);
12293
- } else (i === "udta" || i === "auto" && t.isQuickTime) && i1(e, t.output._metadataTags);
12294
- return e.length === 0 ? null : Se("udta", void 0, e);
12295
- }, i1 = (t, e) => {
12324
+ } else (i === "udta" || i === "auto" && t.isQuickTime) && s1(e, t.output._metadataTags);
12325
+ return e.length === 0 ? null : Ge("udta", void 0, e);
12326
+ }, s1 = (t, e) => {
12296
12327
  for (const { key: i, value: n } of yn(e))
12297
12328
  switch (i) {
12298
12329
  case "title":
@@ -12336,13 +12367,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12336
12367
  if (e.raw)
12337
12368
  for (const i in e.raw) {
12338
12369
  const n = e.raw[i];
12339
- n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(Se(i, Array.from(n))));
12370
+ n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(Ge(i, Array.from(n))));
12340
12371
  }
12341
12372
  }, Qt = (t, e) => {
12342
12373
  const i = $t.encode(e);
12343
- return Se(t, [
12344
- Ge(i.length),
12345
- Ge(Wn("und")),
12374
+ return Ge(t, [
12375
+ Se(i.length),
12376
+ Se(Wn("und")),
12346
12377
  Array.from(i)
12347
12378
  ]);
12348
12379
  }, zs = {
@@ -12385,7 +12416,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12385
12416
  break;
12386
12417
  case "images":
12387
12418
  for (const o of d)
12388
- o.kind === "coverFront" && i.push({ key: "covr", value: Se("data", [
12419
+ o.kind === "coverFront" && i.push({ key: "covr", value: Ge("data", [
12389
12420
  me(zs[o.mimeType] ?? 0),
12390
12421
  // Type indicator
12391
12422
  me(0),
@@ -12399,28 +12430,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12399
12430
  const o = t.tracksTotal !== void 0 ? `${d}/${t.tracksTotal}` : d.toString();
12400
12431
  i.push({ key: "track", value: Pt(o) });
12401
12432
  } else
12402
- i.push({ key: "trkn", value: Se("data", [
12433
+ i.push({ key: "trkn", value: Ge("data", [
12403
12434
  me(0),
12404
12435
  // 8 bytes empty
12405
12436
  me(0),
12406
- Ge(0),
12437
+ Se(0),
12407
12438
  // Empty
12408
- Ge(d),
12409
- Ge(t.tracksTotal ?? 0),
12410
- Ge(0)
12439
+ Se(d),
12440
+ Se(t.tracksTotal ?? 0),
12441
+ Se(0)
12411
12442
  // Empty
12412
12443
  ]) });
12413
12444
  break;
12414
12445
  case "discNumber":
12415
- e || i.push({ key: "disc", value: Se("data", [
12446
+ e || i.push({ key: "disc", value: Ge("data", [
12416
12447
  me(0),
12417
12448
  // 8 bytes empty
12418
12449
  me(0),
12419
- Ge(0),
12450
+ Se(0),
12420
12451
  // Empty
12421
- Ge(d),
12422
- Ge(t.discsTotal ?? 0),
12423
- Ge(0)
12452
+ Se(d),
12453
+ Se(t.discsTotal ?? 0),
12454
+ Se(0)
12424
12455
  // Empty
12425
12456
  ]) });
12426
12457
  break;
@@ -12435,13 +12466,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12435
12466
  if (t.raw)
12436
12467
  for (const n in t.raw) {
12437
12468
  const d = t.raw[n];
12438
- d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value: Se("data", [
12469
+ d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value: Ge("data", [
12439
12470
  me(0),
12440
12471
  // Type indicator
12441
12472
  me(0),
12442
12473
  // Locale indicator
12443
12474
  Array.from(d)
12444
- ]) }) : d instanceof fn && i.push({ key: n, value: Se("data", [
12475
+ ]) }) : d instanceof fn && i.push({ key: n, value: Ge("data", [
12445
12476
  me(zs[d.mimeType] ?? 0),
12446
12477
  // Type indicator
12447
12478
  me(0),
@@ -12451,36 +12482,36 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12451
12482
  ]) }));
12452
12483
  }
12453
12484
  return i;
12454
- }, s1 = (t) => {
12485
+ }, n1 = (t) => {
12455
12486
  const e = Rn(t, !1);
12456
12487
  return e.length === 0 ? null : Ye("meta", 0, 0, void 0, [
12457
12488
  ss(!1, "mdir", "", "appl"),
12458
12489
  // mdir handler
12459
- Se("ilst", void 0, e.map((i) => Se(i.key, void 0, [i.value])))
12490
+ Ge("ilst", void 0, e.map((i) => Ge(i.key, void 0, [i.value])))
12460
12491
  // Item list without keys box
12461
12492
  ]);
12462
- }, n1 = (t) => {
12493
+ }, r1 = (t) => {
12463
12494
  const e = Rn(t, !0);
12464
- return e.length === 0 ? null : Se("meta", void 0, [
12495
+ return e.length === 0 ? null : Ge("meta", void 0, [
12465
12496
  ss(!1, "mdta", ""),
12466
12497
  // mdta handler
12467
12498
  Ye("keys", 0, 0, [
12468
12499
  me(e.length)
12469
- ], e.map((i) => Se("mdta", [
12500
+ ], e.map((i) => Ge("mdta", [
12470
12501
  ...$t.encode(i.key)
12471
12502
  ]))),
12472
- Se("ilst", void 0, e.map((i, n) => {
12503
+ Ge("ilst", void 0, e.map((i, n) => {
12473
12504
  const d = String.fromCharCode(...me(n + 1));
12474
- return Se(d, void 0, [i.value]);
12505
+ return Ge(d, void 0, [i.value]);
12475
12506
  }))
12476
12507
  ]);
12477
- }, Pt = (t) => Se("data", [
12508
+ }, Pt = (t) => Ge("data", [
12478
12509
  me(1),
12479
12510
  // Type indicator (UTF-8)
12480
12511
  me(0),
12481
12512
  // Locale indicator
12482
12513
  ...$t.encode(t)
12483
- ]), r1 = (t, e) => {
12514
+ ]), a1 = (t, e) => {
12484
12515
  switch (t) {
12485
12516
  case "avc":
12486
12517
  return e.startsWith("avc3") ? "avc3" : "avc1";
@@ -12493,12 +12524,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12493
12524
  case "av1":
12494
12525
  return "av01";
12495
12526
  }
12496
- }, a1 = {
12497
- avc: Vl,
12498
- hevc: Rl,
12527
+ }, l1 = {
12528
+ avc: Rl,
12529
+ hevc: Tl,
12499
12530
  vp8: Ps,
12500
12531
  vp9: Ps,
12501
- av1: Tl
12532
+ av1: Wl
12502
12533
  }, Tn = (t, e) => {
12503
12534
  switch (t) {
12504
12535
  case "aac":
@@ -12566,18 +12597,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12566
12597
  case "pcm-f64be":
12567
12598
  return "fpcm";
12568
12599
  }
12569
- }, l1 = (t, e) => {
12600
+ }, o1 = (t, e) => {
12570
12601
  switch (t) {
12571
12602
  case "aac":
12572
12603
  return Ni;
12573
12604
  case "mp3":
12574
12605
  return Ni;
12575
12606
  case "opus":
12576
- return Hl;
12607
+ return Yl;
12577
12608
  case "vorbis":
12578
12609
  return Ni;
12579
12610
  case "flac":
12580
- return Yl;
12611
+ return wl;
12581
12612
  }
12582
12613
  if (e)
12583
12614
  switch (t) {
@@ -12622,10 +12653,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12622
12653
  return jt;
12623
12654
  }
12624
12655
  return null;
12625
- }, o1 = {
12626
- webvtt: "wvtt"
12627
12656
  }, c1 = {
12628
- webvtt: Kl
12657
+ webvtt: "wvtt"
12658
+ }, d1 = {
12659
+ webvtt: Ml
12629
12660
  }, Wn = (t) => {
12630
12661
  ve(t.length === 3);
12631
12662
  let e = 0;
@@ -12640,7 +12671,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12640
12671
  * License, v. 2.0. If a copy of the MPL was not distributed with this
12641
12672
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
12642
12673
  */
12643
- class d1 {
12674
+ class m1 {
12644
12675
  constructor() {
12645
12676
  this.ensureMonotonicity = !1, this.trackedWrites = null, this.trackedStart = -1, this.trackedEnd = -1;
12646
12677
  }
@@ -12680,7 +12711,7 @@ class d1 {
12680
12711
  }
12681
12712
  }
12682
12713
  const Pi = 2 ** 16, Ui = 2 ** 32;
12683
- class Ln extends d1 {
12714
+ class Ln extends m1 {
12684
12715
  constructor(e) {
12685
12716
  if (super(), this.pos = 0, this.maxPos = 0, this.target = e, this.supportsResize = "resize" in new ArrayBuffer(0), this.supportsResize)
12686
12717
  try {
@@ -12756,22 +12787,22 @@ class Hn extends xn {
12756
12787
  * License, v. 2.0. If a copy of the MPL was not distributed with this
12757
12788
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
12758
12789
  */
12759
- const ji = 1e3, m1 = 2082844800, u1 = (t) => {
12790
+ const ji = 1e3, u1 = 2082844800, h1 = (t) => {
12760
12791
  const e = {}, i = t.track;
12761
12792
  return i.metadata.name !== void 0 && (e.name = i.metadata.name), e;
12762
12793
  }, tt = (t, e, i = !0) => {
12763
12794
  const n = t * e;
12764
12795
  return i ? Math.round(n) : n;
12765
12796
  };
12766
- class h1 extends Ea {
12797
+ class b1 extends Na {
12767
12798
  constructor(e, i) {
12768
- super(e), this.auxTarget = new Hn(), this.auxWriter = this.auxTarget._createWriter(), this.auxBoxWriter = new Ns(this.auxWriter), this.mdat = null, this.ftypSize = null, this.trackDatas = [], this.allTracksKnown = Sa(), this.creationTime = Math.floor(Date.now() / 1e3) + m1, this.finalizedChunks = [], this.nextFragmentNumber = 1, this.maxWrittenTimestamp = -1 / 0, this.format = i, this.writer = e._writer, this.boxWriter = new Ns(this.writer), this.isQuickTime = i instanceof Mn;
12799
+ super(e), this.auxTarget = new Hn(), this.auxWriter = this.auxTarget._createWriter(), this.auxBoxWriter = new Ns(this.auxWriter), this.mdat = null, this.ftypSize = null, this.trackDatas = [], this.allTracksKnown = va(), this.creationTime = Math.floor(Date.now() / 1e3) + u1, this.finalizedChunks = [], this.nextFragmentNumber = 1, this.maxWrittenTimestamp = -1 / 0, this.format = i, this.writer = e._writer, this.boxWriter = new Ns(this.writer), this.isQuickTime = i instanceof Mn;
12769
12800
  const n = this.writer instanceof Ln ? "in-memory" : !1;
12770
12801
  this.fastStart = i._options.fastStart ?? n, this.isFragmented = this.fastStart === "fragmented", (this.fastStart === "in-memory" || this.isFragmented) && (this.writer.ensureMonotonicity = !0), this.minimumFragmentDuration = i._options.minimumFragmentDuration ?? 1;
12771
12802
  }
12772
12803
  async start() {
12773
12804
  const e = await this.mutex.acquire(), i = this.output._tracks.some((n) => n.type === "video" && n.source._codec === "avc");
12774
- if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(nl({
12805
+ if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(rl({
12775
12806
  isQuickTime: this.isQuickTime,
12776
12807
  holdsAvc: i,
12777
12808
  fragmented: this.isFragmented
@@ -12797,7 +12828,7 @@ class h1 extends Ea {
12797
12828
  const e = this.trackDatas.map((i) => i.type === "video" || i.type === "audio" ? i.info.decoderConfig.codec : {
12798
12829
  webvtt: "wvtt"
12799
12830
  }[i.track.source._codec]);
12800
- return il({
12831
+ return sl({
12801
12832
  isQuickTime: this.isQuickTime,
12802
12833
  hasVideo: this.trackDatas.some((i) => i.type === "video"),
12803
12834
  hasAudio: this.trackDatas.some((i) => i.type === "audio"),
@@ -12808,22 +12839,22 @@ class h1 extends Ea {
12808
12839
  const d = this.trackDatas.find((W) => W.track === e);
12809
12840
  if (d)
12810
12841
  return d;
12811
- Ca(n), ve(n), ve(n.decoderConfig);
12842
+ ga(n), ve(n), ve(n.decoderConfig);
12812
12843
  const o = { ...n.decoderConfig };
12813
12844
  ve(o.codedWidth !== void 0), ve(o.codedHeight !== void 0);
12814
12845
  let m = !1;
12815
12846
  if (e.source._codec === "avc" && !o.description) {
12816
- const W = Pa(i.data);
12847
+ const W = Ua(i.data);
12817
12848
  if (!W)
12818
12849
  throw new Error("Couldn't extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in AVCC format.");
12819
- o.description = Ua(W), m = !0;
12850
+ o.description = za(W), m = !0;
12820
12851
  } else if (e.source._codec === "hevc" && !o.description) {
12821
- const W = Aa(i.data);
12852
+ const W = Oa(i.data);
12822
12853
  if (!W)
12823
12854
  throw new Error("Couldn't extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in HEVC format.");
12824
- o.description = el(W), m = !0;
12855
+ o.description = tl(W), m = !0;
12825
12856
  }
12826
- const h = Ta(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, G = {
12857
+ const h = Wa(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, S = {
12827
12858
  muxer: this,
12828
12859
  track: e,
12829
12860
  type: "video",
@@ -12845,13 +12876,13 @@ class h1 extends Ea {
12845
12876
  currentChunk: null,
12846
12877
  compactlyCodedChunkTable: []
12847
12878
  };
12848
- return this.trackDatas.push(G), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), G;
12879
+ return this.trackDatas.push(S), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), S;
12849
12880
  }
12850
12881
  getAudioTrackData(e, i) {
12851
12882
  const n = this.trackDatas.find((o) => o.track === e);
12852
12883
  if (n)
12853
12884
  return n;
12854
- Fa(i), ve(i), ve(i.decoderConfig);
12885
+ Ja(i), ve(i), ve(i.decoderConfig);
12855
12886
  const d = {
12856
12887
  muxer: this,
12857
12888
  track: e,
@@ -12880,7 +12911,7 @@ class h1 extends Ea {
12880
12911
  const n = this.trackDatas.find((o) => o.track === e);
12881
12912
  if (n)
12882
12913
  return n;
12883
- Ja(i), ve(i), ve(i.config);
12914
+ Ea(i), ve(i), ve(i.config);
12884
12915
  const d = {
12885
12916
  muxer: this,
12886
12917
  track: e,
@@ -12916,10 +12947,10 @@ class h1 extends Ea {
12916
12947
  const W = ts(m);
12917
12948
  if (W.length === 0)
12918
12949
  throw new Error("Failed to transform packet data. Make sure all packets are provided in Annex B format, as specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.");
12919
- m = Na(W, 4);
12950
+ m = Pa(W, 4);
12920
12951
  }
12921
- const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"), G = this.createSampleForTrack(o, m, h, i.duration, i.type);
12922
- await this.registerSample(o, G);
12952
+ const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"), S = this.createSampleForTrack(o, m, h, i.duration, i.type);
12953
+ await this.registerSample(o, S);
12923
12954
  } finally {
12924
12955
  d();
12925
12956
  }
@@ -12936,7 +12967,7 @@ class h1 extends Ea {
12936
12967
  async maybePadWithSilence(e, i) {
12937
12968
  const n = Y0(e.samples), d = n ? n.timestamp + n.duration : 0, o = i - d, m = tt(o, e.timescale);
12938
12969
  if (m > 0) {
12939
- const { sampleSize: h, silentValue: G } = D0(e.info.decoderConfig.codec), W = m * e.info.numberOfChannels, v = new Uint8Array(h * W).fill(G), Z = this.createSampleForTrack(e, new Uint8Array(v.buffer), d, o, "key");
12970
+ const { sampleSize: h, silentValue: S } = D0(e.info.decoderConfig.codec), W = m * e.info.numberOfChannels, v = new Uint8Array(h * W).fill(S), Z = this.createSampleForTrack(e, new Uint8Array(v.buffer), d, o, "key");
12940
12971
  await this.registerSample(e, Z);
12941
12972
  }
12942
12973
  }
@@ -12959,7 +12990,7 @@ class h1 extends Ea {
12959
12990
  break;
12960
12991
  if (e.lastCueEndTimestamp < o) {
12961
12992
  this.auxWriter.seek(0);
12962
- const W = $l();
12993
+ const W = ql();
12963
12994
  this.auxBoxWriter.writeBox(W);
12964
12995
  const v = this.auxWriter.getSlice(0, this.auxWriter.getPos()), Z = this.createSampleForTrack(e, v, e.lastCueEndTimestamp, o - e.lastCueEndTimestamp, "key");
12965
12996
  await this.registerSample(e, Z), e.lastCueEndTimestamp = o;
@@ -12973,14 +13004,14 @@ class h1 extends Ea {
12973
13004
  const Z = Es.test(v.text), O = v.timestamp + v.duration;
12974
13005
  let w = e.cueToSourceId.get(v);
12975
13006
  if (w === void 0 && m < O && (w = e.nextSourceId++, e.cueToSourceId.set(v, w)), v.notes) {
12976
- const J = e1(v.notes);
13007
+ const J = t1(v.notes);
12977
13008
  this.auxBoxWriter.writeBox(J);
12978
13009
  }
12979
- const N = ql(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
13010
+ const N = e1(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
12980
13011
  this.auxBoxWriter.writeBox(N), O === m && e.cueQueue.splice(W--, 1);
12981
13012
  }
12982
- const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()), G = this.createSampleForTrack(e, h, o, m - o, "key");
12983
- await this.registerSample(e, G), e.lastCueEndTimestamp = m;
13013
+ const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()), S = this.createSampleForTrack(e, h, o, m - o, "key");
13014
+ await this.registerSample(e, S), e.lastCueEndTimestamp = m;
12984
13015
  }
12985
13016
  }
12986
13017
  createSampleForTrack(e, i, n, d, o) {
@@ -13024,7 +13055,7 @@ class h1 extends Ea {
13024
13055
  const m = tt(o.timestamp - o.decodeTimestamp, e.timescale), h = tt(o.duration, e.timescale);
13025
13056
  if (e.lastTimescaleUnits !== null) {
13026
13057
  ve(e.lastSample);
13027
- const G = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(G - e.lastTimescaleUnits);
13058
+ const S = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(S - e.lastTimescaleUnits);
13028
13059
  if (ve(W >= 0), e.lastTimescaleUnits += W, e.lastSample.timescaleUnitsToNextSample = W, !this.isFragmented) {
13029
13060
  let v = Y0(e.timeToSampleTable);
13030
13061
  if (ve(v), v.sampleCount === 1) {
@@ -13139,12 +13170,12 @@ class h1 extends Ea {
13139
13170
  }
13140
13171
  }
13141
13172
  const n = this.trackDatas.filter((w) => w.currentChunk), d = Us(i, n), o = this.writer.getPos(), m = o + this.boxWriter.measureBox(d);
13142
- let h = m + Fi, G = 1 / 0;
13173
+ let h = m + Fi, S = 1 / 0;
13143
13174
  for (const w of n) {
13144
13175
  w.currentChunk.offset = h, w.currentChunk.moofOffset = o;
13145
13176
  for (const N of w.currentChunk.samples)
13146
13177
  h += N.size;
13147
- G = Math.min(G, w.currentChunk.startTimestamp);
13178
+ S = Math.min(S, w.currentChunk.startTimestamp);
13148
13179
  }
13149
13180
  const W = h - m, v = W >= 2 ** 32;
13150
13181
  if (v)
@@ -13154,7 +13185,7 @@ class h1 extends Ea {
13154
13185
  const Z = Us(i, n);
13155
13186
  if (this.boxWriter.writeBox(Z), this.format._options.onMoof) {
13156
13187
  const { data: w, start: N } = this.writer.stopTrackingWrites();
13157
- this.format._options.onMoof(w, N, G);
13188
+ this.format._options.onMoof(w, N, S);
13158
13189
  }
13159
13190
  ve(this.writer.getPos() === m), this.format._options.onMdat && this.writer.startTrackingWrites();
13160
13191
  const O = ci(v);
@@ -13224,9 +13255,9 @@ class h1 extends Ea {
13224
13255
  const o = U0(this), m = this.boxWriter.measureBox(o);
13225
13256
  i = this.boxWriter.measureBox(this.mdat);
13226
13257
  let h = this.writer.getPos() + m + i;
13227
- for (const G of this.finalizedChunks) {
13228
- G.offset = h;
13229
- for (const { data: W } of G.samples)
13258
+ for (const S of this.finalizedChunks) {
13259
+ S.offset = h;
13260
+ for (const { data: W } of S.samples)
13230
13261
  ve(W), h += W.byteLength, i += W.byteLength;
13231
13262
  }
13232
13263
  if (h < 2 ** 32)
@@ -13248,7 +13279,7 @@ class h1 extends Ea {
13248
13279
  this.format._options.onMdat(d, o);
13249
13280
  }
13250
13281
  } else if (this.isFragmented) {
13251
- const i = this.writer.getPos(), n = jl(this.trackDatas);
13282
+ const i = this.writer.getPos(), n = Ql(this.trackDatas);
13252
13283
  this.boxWriter.writeBox(n);
13253
13284
  const d = this.writer.getPos() - i;
13254
13285
  this.writer.seek(this.writer.getPos() - 4), this.boxWriter.writeU32(d);
@@ -13265,7 +13296,7 @@ class h1 extends Ea {
13265
13296
  if (this.fastStart === "reserve") {
13266
13297
  ve(this.ftypSize !== null), this.writer.seek(this.ftypSize), this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
13267
13298
  const o = this.boxWriter.offsets.get(this.mdat) - this.writer.getPos();
13268
- this.boxWriter.writeBox(rl(o));
13299
+ this.boxWriter.writeBox(al(o));
13269
13300
  } else
13270
13301
  this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
13271
13302
  if (this.format._options.onMoov) {
@@ -13337,7 +13368,7 @@ class wn extends Yn {
13337
13368
  }
13338
13369
  /** @internal */
13339
13370
  _createMuxer(e) {
13340
- return new h1(e, this);
13371
+ return new b1(e, this);
13341
13372
  }
13342
13373
  }
13343
13374
  class Kn extends wn {
@@ -13465,7 +13496,7 @@ class kn extends ns {
13465
13496
  this._codec = e;
13466
13497
  }
13467
13498
  }
13468
- class b1 extends kn {
13499
+ class p1 extends kn {
13469
13500
  /** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */
13470
13501
  constructor(e) {
13471
13502
  super(e);
@@ -13498,7 +13529,7 @@ class Bn extends ns {
13498
13529
  this._codec = e;
13499
13530
  }
13500
13531
  }
13501
- class p1 extends Bn {
13532
+ class y1 extends Bn {
13502
13533
  /** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */
13503
13534
  constructor(e) {
13504
13535
  super(e);
@@ -13522,7 +13553,7 @@ class p1 extends Bn {
13522
13553
  return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedAudioPacket(this._connectedTrack, e, i);
13523
13554
  }
13524
13555
  }
13525
- class y1 extends ns {
13556
+ class f1 extends ns {
13526
13557
  /** Internal constructor. */
13527
13558
  constructor(e) {
13528
13559
  if (super(), this._connectedTrack = null, !hi.includes(e))
@@ -13537,17 +13568,17 @@ class y1 extends ns {
13537
13568
  * License, v. 2.0. If a copy of the MPL was not distributed with this
13538
13569
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
13539
13570
  */
13540
- const f1 = ["video", "audio", "subtitle"], zi = (t) => {
13571
+ const Z1 = ["video", "audio", "subtitle"], zi = (t) => {
13541
13572
  if (!t || typeof t != "object")
13542
13573
  throw new TypeError("metadata must be an object.");
13543
- if (t.languageCode !== void 0 && !Ra(t.languageCode))
13574
+ if (t.languageCode !== void 0 && !Ta(t.languageCode))
13544
13575
  throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");
13545
13576
  if (t.name !== void 0 && typeof t.name != "string")
13546
13577
  throw new TypeError("metadata.name, when provided, must be a string.");
13547
- if (t.disposition !== void 0 && xa(t.disposition), t.maximumPacketCount !== void 0 && (!Number.isInteger(t.maximumPacketCount) || t.maximumPacketCount < 0))
13578
+ if (t.disposition !== void 0 && Ha(t.disposition), t.maximumPacketCount !== void 0 && (!Number.isInteger(t.maximumPacketCount) || t.maximumPacketCount < 0))
13548
13579
  throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");
13549
13580
  };
13550
- class Z1 {
13581
+ class X1 {
13551
13582
  /**
13552
13583
  * Creates a new instance of {@link Output} which can then be used to create a new media file according to the
13553
13584
  * specified {@link OutputOptions}.
@@ -13583,7 +13614,7 @@ class Z1 {
13583
13614
  }
13584
13615
  /** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */
13585
13616
  addSubtitleTrack(e, i = {}) {
13586
- if (!(e instanceof y1))
13617
+ if (!(e instanceof f1))
13587
13618
  throw new TypeError("source must be a SubtitleSource.");
13588
13619
  zi(i), this._addTrack("subtitle", e, i);
13589
13620
  }
@@ -13594,7 +13625,7 @@ class Z1 {
13594
13625
  * Can only be called before the output is started.
13595
13626
  */
13596
13627
  setMetadataTags(e) {
13597
- if (La(e), this.state !== "pending")
13628
+ if (xa(e), this.state !== "pending")
13598
13629
  throw new Error("Cannot set metadata tags after output has been started or canceled.");
13599
13630
  this._metadataTags = e;
13600
13631
  }
@@ -13610,33 +13641,33 @@ class Z1 {
13610
13641
  const h = d.total.max;
13611
13642
  if (this._tracks.length === h)
13612
13643
  throw new Error(`${this.format._name} does not support more than ${h} tracks${h === 1 ? "" : "s"} in total.`);
13613
- const G = {
13644
+ const S = {
13614
13645
  id: this._tracks.length + 1,
13615
13646
  output: this,
13616
13647
  type: e,
13617
13648
  source: i,
13618
13649
  metadata: n
13619
13650
  };
13620
- if (G.type === "video") {
13651
+ if (S.type === "video") {
13621
13652
  const W = this.format.getSupportedVideoCodecs();
13622
13653
  if (W.length === 0)
13623
- throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(G.source._codec));
13624
- if (!W.includes(G.source._codec))
13625
- throw new Error(`Codec '${G.source._codec}' cannot be contained within ${this.format._name}. Supported video codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(G.source._codec));
13626
- } else if (G.type === "audio") {
13654
+ throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13655
+ if (!W.includes(S.source._codec))
13656
+ throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported video codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
13657
+ } else if (S.type === "audio") {
13627
13658
  const W = this.format.getSupportedAudioCodecs();
13628
13659
  if (W.length === 0)
13629
- throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(G.source._codec));
13630
- if (!W.includes(G.source._codec))
13631
- throw new Error(`Codec '${G.source._codec}' cannot be contained within ${this.format._name}. Supported audio codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(G.source._codec));
13632
- } else if (G.type === "subtitle") {
13660
+ throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13661
+ if (!W.includes(S.source._codec))
13662
+ throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported audio codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
13663
+ } else if (S.type === "subtitle") {
13633
13664
  const W = this.format.getSupportedSubtitleCodecs();
13634
13665
  if (W.length === 0)
13635
- throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(G.source._codec));
13636
- if (!W.includes(G.source._codec))
13637
- throw new Error(`Codec '${G.source._codec}' cannot be contained within ${this.format._name}. Supported subtitle codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(G.source._codec));
13666
+ throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13667
+ if (!W.includes(S.source._codec))
13668
+ throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported subtitle codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
13638
13669
  }
13639
- this._tracks.push(G), i._connectedTrack = G;
13670
+ this._tracks.push(S), i._connectedTrack = S;
13640
13671
  }
13641
13672
  /**
13642
13673
  * Starts the creation of the output file. This method should be called after all tracks have been added. Only after
@@ -13646,7 +13677,7 @@ class Z1 {
13646
13677
  */
13647
13678
  async start() {
13648
13679
  const e = this.format.getSupportedTrackCounts();
13649
- for (const n of f1) {
13680
+ for (const n of Z1) {
13650
13681
  const d = this._tracks.reduce((m, h) => m + (h.type === n ? 1 : 0), 0), o = e[n].min;
13651
13682
  if (d < o)
13652
13683
  throw new Error(o === e[n].max ? `${this.format._name} requires exactly ${o} ${n} track${o === 1 ? "" : "s"}.` : `${this.format._name} requires at least ${o} ${n} track${o === 1 ? "" : "s"}.`);
@@ -13707,7 +13738,7 @@ class Z1 {
13707
13738
  })();
13708
13739
  }
13709
13740
  }
13710
- class Y1 {
13741
+ class w1 {
13711
13742
  /**
13712
13743
  * Create a new ExampleMuxer.
13713
13744
  *
@@ -13715,11 +13746,11 @@ class Y1 {
13715
13746
  */
13716
13747
  constructor(e) {
13717
13748
  this.type = e || "video", this.target = new Hn();
13718
- const i = new Z1({
13749
+ const i = new X1({
13719
13750
  format: new Kn(),
13720
13751
  target: this.target
13721
13752
  });
13722
- this.started = !1, this.output = i, this.source = this.type === "video" ? new b1("avc") : new p1("aac"), this.output.addVideoTrack(this.source), console.warn(
13753
+ this.started = !1, this.output = i, this.source = this.type === "video" ? new p1("avc") : new y1("aac"), this.output.addVideoTrack(this.source), console.warn(
13723
13754
  "⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper muxing library like MediaBunny (https://mediabunny.dev/) "
13724
13755
  );
13725
13756
  }
@@ -13744,17 +13775,18 @@ class Y1 {
13744
13775
  }
13745
13776
  }
13746
13777
  export {
13747
- Y1 as ExampleMuxer,
13748
- v1 as GPUFrameRenderer,
13749
- T1 as InMemoryStorage,
13750
- V1 as MP3Decoder,
13751
- I1 as MP3Encoder,
13752
- R1 as MP4Demuxer,
13753
- L1 as demuxAudio,
13754
- x1 as demuxVideo,
13778
+ w1 as ExampleMuxer,
13779
+ I1 as GPUFrameRenderer,
13780
+ W1 as InMemoryStorage,
13781
+ R1 as MP3Decoder,
13782
+ V1 as MP3Encoder,
13783
+ T1 as MP4Demuxer,
13784
+ ba as MediaStreamTrackProcessor,
13785
+ x1 as demuxAudio,
13786
+ H1 as demuxVideo,
13755
13787
  Jn as extractChannels,
13756
- H1 as getAudioChunks,
13788
+ Y1 as getAudioChunks,
13757
13789
  G1 as getBitrate,
13758
- S1 as getCodecString,
13759
- W1 as getVideoChunks
13790
+ v1 as getCodecString,
13791
+ L1 as getVideoChunks
13760
13792
  };