webcodecs-utils 0.2.0 → 0.2.2

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 +839 -806
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import gn from "lamejs";
2
- import Fn, { DataStream as bs } from "mp4box";
1
+ import Fn from "lamejs";
2
+ import Jn, { DataStream as bs } from "mp4box";
3
3
  function G1(t, e, i = 30, n = "good") {
4
4
  const d = t * e, o = {
5
5
  low: 0.05,
@@ -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);
@@ -464,7 +464,7 @@ class v1 {
464
464
  this.device && this.device.destroy();
465
465
  }
466
466
  }
467
- function Jn(t) {
467
+ function En(t) {
468
468
  var i;
469
469
  const e = [];
470
470
  if ((i = t.format) != null && i.includes("planar"))
@@ -501,11 +501,11 @@ Ut.DUAL_CHANNEL = new Ut(2);
501
501
  Ut.MONO = new Ut(3);
502
502
  Ut.NOT_SET = new Ut(4);
503
503
  var As = Ut;
504
- const En = /* @__PURE__ */ bi(As);
505
- function Nn(t) {
504
+ const Nn = /* @__PURE__ */ bi(As);
505
+ function Pn(t) {
506
506
  return new Int8Array(t);
507
507
  }
508
- function Pn(t) {
508
+ function Un(t) {
509
509
  return new Int16Array(t);
510
510
  }
511
511
  function Os(t) {
@@ -514,7 +514,7 @@ function Os(t) {
514
514
  function js(t) {
515
515
  return new Float32Array(t);
516
516
  }
517
- function Un(t) {
517
+ function zn(t) {
518
518
  return new Float64Array(t);
519
519
  }
520
520
  function Qs(t) {
@@ -537,7 +537,7 @@ function Ds(t) {
537
537
  }
538
538
  function $s(t) {
539
539
  if (t.length == 1)
540
- return Pn(t[0]);
540
+ return Un(t[0]);
541
541
  var e = t[0];
542
542
  t = t.slice(1);
543
543
  for (var i = [], n = 0; n < e; n++)
@@ -600,7 +600,7 @@ Kt.vbr_rh = new Kt(2);
600
600
  Kt.vbr_abr = new Kt(3);
601
601
  Kt.vbr_mtrh = new Kt(4);
602
602
  Kt.vbr_default = Kt.vbr_mtrh;
603
- var zn = function(t) {
603
+ var An = function(t) {
604
604
  }, it = {
605
605
  System: j0,
606
606
  VbrMode: Kt,
@@ -609,16 +609,16 @@ var zn = function(t) {
609
609
  Util: pi,
610
610
  Arrays: en,
611
611
  new_array_n: qs,
612
- new_byte: Nn,
613
- new_double: Un,
612
+ new_byte: Pn,
613
+ new_double: zn,
614
614
  new_float: js,
615
615
  new_float_n: Qs,
616
616
  new_int: Os,
617
617
  new_int_n: Ds,
618
618
  new_short_n: $s,
619
- assert: zn
619
+ assert: An
620
620
  }, Wi, ps;
621
- function An() {
621
+ function On() {
622
622
  if (ps) return Wi;
623
623
  ps = 1;
624
624
  var t = it, e = t.System;
@@ -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,15 +1219,15 @@ 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;
1228
1228
  }
1229
1229
  var xi, fs;
1230
- function On() {
1230
+ function jn() {
1231
1231
  if (fs) return xi;
1232
1232
  fs = 1;
1233
1233
  var t = sn();
@@ -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 = On(), v = jn(), 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;
@@ -1415,7 +1415,7 @@ pt.new_int;
1415
1415
  pt.new_int_n;
1416
1416
  pt.assert;
1417
1417
  var Oe = bt();
1418
- function jn() {
1418
+ function Qn() {
1419
1419
  var t = _s(Oe.BLKSIZE), e = _s(Oe.BLKSIZE_s / 2), i = [
1420
1420
  0.9238795325112867,
1421
1421
  0.3826834323650898,
@@ -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) {
@@ -1603,17 +1603,17 @@ function jn() {
1603
1603
  e[m] = 0.5 * (1 - Math.cos(2 * Math.PI * (m + 0.5) / Oe.BLKSIZE_s));
1604
1604
  };
1605
1605
  }
1606
- var Qn = jn, yt = it;
1606
+ var Dn = Qn, 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, $n = yt.Arrays;
1609
1609
  yt.new_array_n;
1610
1610
  yt.new_byte;
1611
1611
  yt.new_double;
1612
1612
  var je = yt.new_float, kt = yt.new_float_n, h0 = yt.new_int;
1613
1613
  yt.new_int_n;
1614
- var ue = yt.assert, $n = Qn, D = bt();
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;
1614
+ var ue = yt.assert, qn = Dn, D = bt();
1615
+ function er() {
1616
+ var t = new qn(), 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,9 +2039,9 @@ 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
- 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++) {
2044
+ for ($n.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;
2046
2046
  for (ue(oe.length == (w - 1) / 2), te = 0; te < 576; te++) {
2047
2047
  var xt, Ht;
@@ -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,13 +2057,13 @@ 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;
2065
2065
  for (te = 0; te < 9; te++) {
2066
- for (var Cn = g0 + 64, $e = 1; g0 < Cn; g0++)
2066
+ for (var gn = g0 + 64, $e = 1; g0 < gn; g0++)
2067
2067
  $e < Math.abs(hs[g0]) && ($e = Math.abs(hs[g0]));
2068
2068
  z.nsPsy.last_en_subshort[se][te] = nt[te + 3] = $e, zt[1 + te / 3] += $e, $e > nt[te + 3 - 2] ? (ue(nt[te + 3 - 2] > 0), $e = $e / nt[te + 3 - 2]) : nt[te + 3 - 2] > $e * 10 ? (ue($e > 0), $e = nt[te + 3 - 2] / ($e * 10)) : $e = 0, T0[te + 3] = $e;
2069
2069
  }
@@ -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;
@@ -2770,12 +2770,12 @@ function qn() {
2770
2770
  return x;
2771
2771
  };
2772
2772
  }
2773
- var er = qn, tr = As;
2774
- function ir() {
2775
- this.class_id = 0, this.num_samples = 0, this.num_channels = 0, this.in_samplerate = 0, this.out_samplerate = 0, this.scale = 0, this.scale_left = 0, this.scale_right = 0, this.analysis = !1, this.bWriteVbrTag = !1, this.decode_only = !1, this.quality = 0, this.mode = tr.STEREO, this.force_ms = !1, this.free_format = !1, this.findReplayGain = !1, this.decode_on_the_fly = !1, this.write_id3tag_automatic = !1, this.brate = 0, this.compression_ratio = 0, this.copyright = 0, this.original = 0, this.extension = 0, this.emphasis = 0, this.error_protection = 0, this.strict_ISO = !1, this.disable_reservoir = !1, this.quant_comp = 0, this.quant_comp_short = 0, this.experimentalY = !1, this.experimentalZ = 0, this.exp_nspsytune = 0, this.preset = 0, this.VBR = null, this.VBR_q_frac = 0, this.VBR_q = 0, this.VBR_mean_bitrate_kbps = 0, this.VBR_min_bitrate_kbps = 0, this.VBR_max_bitrate_kbps = 0, this.VBR_hard_min = 0, this.lowpassfreq = 0, this.highpassfreq = 0, this.lowpasswidth = 0, this.highpasswidth = 0, this.maskingadjust = 0, this.maskingadjust_short = 0, this.ATHonly = !1, this.ATHshort = !1, this.noATH = !1, this.ATHtype = 0, this.ATHcurve = 0, this.ATHlower = 0, this.athaa_type = 0, this.athaa_loudapprox = 0, this.athaa_sensitivity = 0, this.short_blocks = null, this.useTemporal = !1, this.interChRatio = 0, this.msfix = 0, this.tune = !1, this.tune_value_a = 0, this.version = 0, this.encoder_delay = 0, this.encoder_padding = 0, this.framesize = 0, this.frameNum = 0, this.lame_allocated_gfp = 0, this.internal_flags = null;
2773
+ var tr = er, ir = As;
2774
+ function sr() {
2775
+ this.class_id = 0, this.num_samples = 0, this.num_channels = 0, this.in_samplerate = 0, this.out_samplerate = 0, this.scale = 0, this.scale_left = 0, this.scale_right = 0, this.analysis = !1, this.bWriteVbrTag = !1, this.decode_only = !1, this.quality = 0, this.mode = ir.STEREO, this.force_ms = !1, this.free_format = !1, this.findReplayGain = !1, this.decode_on_the_fly = !1, this.write_id3tag_automatic = !1, this.brate = 0, this.compression_ratio = 0, this.copyright = 0, this.original = 0, this.extension = 0, this.emphasis = 0, this.error_protection = 0, this.strict_ISO = !1, this.disable_reservoir = !1, this.quant_comp = 0, this.quant_comp_short = 0, this.experimentalY = !1, this.experimentalZ = 0, this.exp_nspsytune = 0, this.preset = 0, this.VBR = null, this.VBR_q_frac = 0, this.VBR_q = 0, this.VBR_mean_bitrate_kbps = 0, this.VBR_min_bitrate_kbps = 0, this.VBR_max_bitrate_kbps = 0, this.VBR_hard_min = 0, this.lowpassfreq = 0, this.highpassfreq = 0, this.lowpasswidth = 0, this.highpasswidth = 0, this.maskingadjust = 0, this.maskingadjust_short = 0, this.ATHonly = !1, this.ATHshort = !1, this.noATH = !1, this.ATHtype = 0, this.ATHcurve = 0, this.ATHlower = 0, this.athaa_type = 0, this.athaa_loudapprox = 0, this.athaa_sensitivity = 0, this.short_blocks = null, this.useTemporal = !1, this.interChRatio = 0, this.msfix = 0, this.tune = !1, this.tune_value_a = 0, this.version = 0, this.encoder_delay = 0, this.encoder_padding = 0, this.framesize = 0, this.frameNum = 0, this.lame_allocated_gfp = 0, this.internal_flags = null;
2776
2776
  }
2777
- var sr = ir, nr = bt(), nn = {};
2778
- nn.SFBMAX = nr.SBMAX_s * 3;
2777
+ var nr = sr, rr = bt(), nn = {};
2778
+ nn.SFBMAX = rr.SBMAX_s * 3;
2779
2779
  var Qi = nn, ft = it;
2780
2780
  ft.System;
2781
2781
  ft.VbrMode;
@@ -2786,14 +2786,14 @@ ft.Arrays;
2786
2786
  ft.new_array_n;
2787
2787
  ft.new_byte;
2788
2788
  ft.new_double;
2789
- var rr = ft.new_float;
2789
+ var ar = ft.new_float;
2790
2790
  ft.new_float_n;
2791
2791
  var b0 = ft.new_int;
2792
2792
  ft.new_int_n;
2793
2793
  ft.assert;
2794
2794
  var Yi = Qi;
2795
- function ar() {
2796
- this.xr = rr(576), this.l3_enc = b0(576), this.scalefac = b0(Yi.SFBMAX), this.xrpow_max = 0, this.part2_3_length = 0, this.big_values = 0, this.count1 = 0, this.global_gain = 0, this.scalefac_compress = 0, this.block_type = 0, this.mixed_block_flag = 0, this.table_select = b0(3), this.subblock_gain = b0(4), this.region0_count = 0, this.region1_count = 0, this.preflag = 0, this.scalefac_scale = 0, this.count1table_select = 0, this.part2_length = 0, this.sfb_lmax = 0, this.sfb_smin = 0, this.psy_lmax = 0, this.sfbmax = 0, this.psymax = 0, this.sfbdivide = 0, this.width = b0(Yi.SFBMAX), this.window = b0(Yi.SFBMAX), this.count1bits = 0, this.sfb_partition_table = null, this.slen = b0(4), this.max_nonzero_coeff = 0;
2795
+ function lr() {
2796
+ this.xr = ar(576), this.l3_enc = b0(576), this.scalefac = b0(Yi.SFBMAX), this.xrpow_max = 0, this.part2_3_length = 0, this.big_values = 0, this.count1 = 0, this.global_gain = 0, this.scalefac_compress = 0, this.block_type = 0, this.mixed_block_flag = 0, this.table_select = b0(3), this.subblock_gain = b0(4), this.region0_count = 0, this.region1_count = 0, this.preflag = 0, this.scalefac_scale = 0, this.count1table_select = 0, this.part2_length = 0, this.sfb_lmax = 0, this.sfb_smin = 0, this.psy_lmax = 0, this.sfbmax = 0, this.psymax = 0, this.sfbdivide = 0, this.width = b0(Yi.SFBMAX), this.window = b0(Yi.SFBMAX), this.count1bits = 0, this.sfb_partition_table = null, this.slen = b0(4), this.max_nonzero_coeff = 0;
2797
2797
  var t = this;
2798
2798
  function e(n) {
2799
2799
  return new Int32Array(n);
@@ -2805,7 +2805,7 @@ function ar() {
2805
2805
  t.xr = i(n.xr), t.l3_enc = e(n.l3_enc), t.scalefac = e(n.scalefac), t.xrpow_max = n.xrpow_max, t.part2_3_length = n.part2_3_length, t.big_values = n.big_values, t.count1 = n.count1, t.global_gain = n.global_gain, t.scalefac_compress = n.scalefac_compress, t.block_type = n.block_type, t.mixed_block_flag = n.mixed_block_flag, t.table_select = e(n.table_select), t.subblock_gain = e(n.subblock_gain), t.region0_count = n.region0_count, t.region1_count = n.region1_count, t.preflag = n.preflag, t.scalefac_scale = n.scalefac_scale, t.count1table_select = n.count1table_select, t.part2_length = n.part2_length, t.sfb_lmax = n.sfb_lmax, t.sfb_smin = n.sfb_smin, t.psy_lmax = n.psy_lmax, t.sfbmax = n.sfbmax, t.psymax = n.psymax, t.sfbdivide = n.sfbdivide, t.width = e(n.width), t.window = e(n.window), t.count1bits = n.count1bits, t.sfb_partition_table = n.sfb_partition_table.slice(0), t.slen = e(n.slen), t.max_nonzero_coeff = n.max_nonzero_coeff;
2806
2806
  };
2807
2807
  }
2808
- var rn = ar, Zt = it;
2808
+ var rn = lr, Zt = it;
2809
2809
  Zt.System;
2810
2810
  Zt.VbrMode;
2811
2811
  Zt.Float;
@@ -2817,17 +2817,17 @@ 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
- var lr = rn;
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)];
2823
+ var or = rn;
2824
+ function cr() {
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
- this.tt[t][e] = new lr();
2828
+ this.tt[t][e] = new or();
2829
2829
  }
2830
- var cr = or, Xt = it, ii = Xt.System;
2830
+ var dr = cr, Xt = it, ii = Xt.System;
2831
2831
  Xt.VbrMode;
2832
2832
  Xt.Float;
2833
2833
  Xt.ShortBlock;
@@ -2842,12 +2842,12 @@ var si = Xt.new_int;
2842
2842
  Xt.new_int_n;
2843
2843
  Xt.assert;
2844
2844
  var ni = bt();
2845
- function dr(t, e, i, n) {
2845
+ function mr(t, e, i, n) {
2846
2846
  this.l = si(1 + ni.SBMAX_l), this.s = si(1 + ni.SBMAX_s), this.psfb21 = si(1 + ni.PSFB21), this.psfb12 = si(1 + ni.PSFB12);
2847
2847
  var d = this.l, o = this.s;
2848
2848
  arguments.length == 4 && (this.arrL = arguments[0], this.arrS = arguments[1], this.arr21 = arguments[2], this.arr12 = arguments[3], ii.arraycopy(this.arrL, 0, d, 0, Math.min(this.arrL.length, this.l.length)), ii.arraycopy(this.arrS, 0, o, 0, Math.min(this.arrS.length, this.s.length)), ii.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length)), ii.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length)));
2849
2849
  }
2850
- var an = dr, _t = it;
2850
+ var an = mr, _t = it;
2851
2851
  _t.System;
2852
2852
  _t.VbrMode;
2853
2853
  _t.Float;
@@ -2857,28 +2857,28 @@ _t.Arrays;
2857
2857
  _t.new_array_n;
2858
2858
  _t.new_byte;
2859
2859
  _t.new_double;
2860
- var wi = _t.new_float, mr = _t.new_float_n, ur = _t.new_int;
2860
+ var wi = _t.new_float, ur = _t.new_float_n, hr = _t.new_int;
2861
2861
  _t.new_int_n;
2862
2862
  _t.assert;
2863
2863
  var vs = bt();
2864
- function hr() {
2865
- this.last_en_subshort = mr([4, 9]), this.lastAttacks = ur(4), this.pefirbuf = wi(19), this.longfact = wi(vs.SBMAX_l), this.shortfact = wi(vs.SBMAX_s), this.attackthre = 0, this.attackthre_s = 0;
2864
+ function br() {
2865
+ this.last_en_subshort = ur([4, 9]), this.lastAttacks = hr(4), this.pefirbuf = wi(19), this.longfact = wi(vs.SBMAX_l), this.shortfact = wi(vs.SBMAX_s), this.attackthre = 0, this.attackthre_s = 0;
2866
2866
  }
2867
- var br = hr;
2868
- function pr() {
2867
+ var pr = br;
2868
+ function yr() {
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 fr = yr, 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 Zr = St.new_byte, Xr = 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 _r = dr, Sr = an, Gr = pr, vr = fr, Is = sn(), Pe = bt(), Ir = 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;
@@ -2886,11 +2886,11 @@ n0.MAX_BITS_PER_GRANULE = 7680;
2886
2886
  n0.BPC = 320;
2887
2887
  function n0() {
2888
2888
  var t = 40;
2889
- this.Class_ID = 0, this.lame_encode_frame_init = 0, this.iteration_init_init = 0, this.fill_buffer_resample_init = 0, this.mfbuf = p0([2, n0.MFSIZE]), this.mode_gr = 0, this.channels_in = 0, this.channels_out = 0, this.resample_ratio = 0, this.mf_samples_to_encode = 0, this.mf_size = 0, this.VBR_min_bitrate = 0, this.VBR_max_bitrate = 0, this.bitrate_index = 0, this.samplerate_index = 0, this.mode_ext = 0, this.lowpass1 = 0, this.lowpass2 = 0, this.highpass1 = 0, this.highpass2 = 0, this.noise_shaping = 0, this.noise_shaping_amp = 0, this.substep_shaping = 0, this.psymodel = 0, this.noise_shaping_stop = 0, this.subblock_gain = 0, this.use_best_huffman = 0, this.full_outer_loop = 0, this.l3_side = new Xr(), this.ms_ratio = Bt(2), this.padding = 0, this.frac_SpF = 0, this.slot_lag = 0, this.tag_spec = null, this.nMusicCRC = 0, this.OldValue = Nt(2), this.CurrentStep = Nt(2), this.masking_lower = 0, this.bv_scf = Nt(576), this.pseudohalf = Nt(vr.SFBMAX), this.sfb21_extra = !1, this.inbuf_old = new Array(2), this.blackfilt = new Array(2 * n0.BPC + 1), this.itime = Zr(2), this.sideinfo_len = 0, this.sb_sample = p0([2, 2, 18, Pe.SBLIMIT]), this.amp_filter = Bt(32);
2889
+ this.Class_ID = 0, this.lame_encode_frame_init = 0, this.iteration_init_init = 0, this.fill_buffer_resample_init = 0, this.mfbuf = p0([2, n0.MFSIZE]), this.mode_gr = 0, this.channels_in = 0, this.channels_out = 0, this.resample_ratio = 0, this.mf_samples_to_encode = 0, this.mf_size = 0, this.VBR_min_bitrate = 0, this.VBR_max_bitrate = 0, this.bitrate_index = 0, this.samplerate_index = 0, this.mode_ext = 0, this.lowpass1 = 0, this.lowpass2 = 0, this.highpass1 = 0, this.highpass2 = 0, this.noise_shaping = 0, this.noise_shaping_amp = 0, this.substep_shaping = 0, this.psymodel = 0, this.noise_shaping_stop = 0, this.subblock_gain = 0, this.use_best_huffman = 0, this.full_outer_loop = 0, this.l3_side = new _r(), this.ms_ratio = Bt(2), this.padding = 0, this.frac_SpF = 0, this.slot_lag = 0, this.tag_spec = null, this.nMusicCRC = 0, this.OldValue = Nt(2), this.CurrentStep = Nt(2), this.masking_lower = 0, this.bv_scf = Nt(576), this.pseudohalf = Nt(Ir.SFBMAX), this.sfb21_extra = !1, this.inbuf_old = new Array(2), this.blackfilt = new Array(2 * n0.BPC + 1), this.itime = Xr(2), this.sideinfo_len = 0, this.sb_sample = p0([2, 2, 18, Pe.SBLIMIT]), this.amp_filter = Bt(32);
2890
2890
  function e() {
2891
- this.write_timing = 0, this.ptr = 0, this.buf = fr(t);
2891
+ this.write_timing = 0, this.ptr = 0, this.buf = Zr(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 Sr(), 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 vr(), 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,26 +2898,26 @@ 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
- function Ir() {
2917
+ function Vr() {
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);
2919
2919
  }
2920
- var Vr = Ir, vt = it, ut = vt.System;
2920
+ var Rr = Vr, vt = it, ut = vt.System;
2921
2921
  vt.VbrMode;
2922
2922
  vt.Float;
2923
2923
  vt.ShortBlock;
@@ -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;
@@ -3407,7 +3407,7 @@ function Ce() {
3407
3407
  return Z.totsamp = 0, Z.lsum = Z.rsum = 0, O;
3408
3408
  };
3409
3409
  }
3410
- var Rr = Ce, It = it;
3410
+ var Tr = Ce, It = it;
3411
3411
  It.System;
3412
3412
  It.VbrMode;
3413
3413
  It.Float;
@@ -3422,15 +3422,15 @@ It.new_float_n;
3422
3422
  var Rs = It.new_int;
3423
3423
  It.new_int_n;
3424
3424
  It.assert;
3425
- var ht = Rr;
3426
- function Tr() {
3425
+ var ht = Tr;
3426
+ function Wr() {
3427
3427
  this.linprebuf = x0(ht.MAX_ORDER * 2), this.linpre = 0, this.lstepbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.lstep = 0, this.loutbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.lout = 0, this.rinprebuf = x0(ht.MAX_ORDER * 2), this.rinpre = 0, this.rstepbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.rstep = 0, this.routbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.rout = 0, this.sampleWindow = 0, this.totsamp = 0, this.lsum = 0, this.rsum = 0, this.freqindex = 0, this.first = 0, this.A = Rs(0 | ht.STEPS_per_dB * ht.MAX_dB), this.B = Rs(0 | ht.STEPS_per_dB * ht.MAX_dB);
3428
3428
  }
3429
- var Wr = Tr;
3430
- function Lr(t) {
3429
+ var Lr = Wr;
3430
+ function xr(t) {
3431
3431
  this.bits = t;
3432
3432
  }
3433
- var ln = Lr, Vt = it;
3433
+ var ln = xr, Vt = it;
3434
3434
  Vt.System;
3435
3435
  Vt.VbrMode;
3436
3436
  Vt.Float;
@@ -3442,13 +3442,13 @@ Vt.new_byte;
3442
3442
  Vt.new_double;
3443
3443
  var Ts = Vt.new_float;
3444
3444
  Vt.new_float_n;
3445
- var xr = Vt.new_int;
3445
+ var Hr = Vt.new_int;
3446
3446
  Vt.new_int_n;
3447
- var Ws = Vt.assert, Hr = ln, Ls = bt(), Yr = Qi, wr = yi;
3448
- function Kr(t) {
3447
+ var Ws = Vt.assert, Yr = ln, Ls = bt(), wr = Qi, Kr = yi;
3448
+ function Mr(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(wr.SFBMAX), S = Ts(576), W = Hr(2), v = 0, Z, O = m.l3_side, w = new Yr(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,16 +3478,16 @@ function Kr(t) {
3478
3478
  i,
3479
3479
  I,
3480
3480
  h,
3481
- G,
3481
+ S,
3482
3482
  J,
3483
3483
  W[J]
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]);
3484
+ )), this.quantize.iteration_finish_one(m, N, J), Ws(I.part2_3_length <= Kr.MAX_BITS_PER_CHANNEL), Ws(I.part2_3_length <= W[J]);
3485
3485
  }
3486
3486
  }
3487
3487
  this.quantize.rv.ResvFrameEnd(m, v);
3488
3488
  };
3489
3489
  }
3490
- var Mr = Kr;
3490
+ var kr = Mr;
3491
3491
  function xe(t, e, i, n) {
3492
3492
  this.xlen = t, this.linmax = e, this.table = i, this.hlen = n;
3493
3493
  }
@@ -6989,9 +6989,9 @@ Rt.new_byte;
6989
6989
  Rt.new_double;
6990
6990
  var X0 = Rt.new_float;
6991
6991
  Rt.new_float_n;
6992
- var kr = Rt.new_int;
6992
+ var Br = Rt.new_int;
6993
6993
  Rt.new_int_n;
6994
- var t0 = Rt.assert, et = bt(), Br = ln, lt = yi;
6994
+ var t0 = Rt.assert, et = bt(), Cr = ln, lt = yi;
6995
6995
  wt.Q_MAX = 257;
6996
6996
  wt.Q_MAX2 = 116;
6997
6997
  wt.LARGE_BITS = 1e5;
@@ -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;
@@ -7459,7 +7459,7 @@ function wt() {
7459
7459
  }
7460
7460
  }
7461
7461
  }, this.on_pe = function(I, r, K, X, A, T) {
7462
- var H = I.internal_flags, p = 0, u, l = kr(2), s, V = new Br(p), _ = e.ResvMaxBits(I, X, V, T);
7462
+ var H = I.internal_flags, p = 0, u, l = Br(2), s, V = new Cr(p), _ = e.ResvMaxBits(I, X, V, T);
7463
7463
  p = V.bits;
7464
7464
  var R = p + _;
7465
7465
  for (R > lt.MAX_BITS_PER_GRANULE && (R = lt.MAX_BITS_PER_GRANULE), u = 0, s = 0; s < H.channels_out; ++s)
@@ -7613,12 +7613,12 @@ function wt() {
7613
7613
  T.pinfo.LAMEqss[X][A] = r.global_gain, T.pinfo.LAMEmainbits[X][A] = r.part2_3_length + r.part2_length, T.pinfo.LAMEsfbits[X][A] = r.part2_length, T.pinfo.over[X][A] = j.over_count, T.pinfo.max_noise[X][A] = j.max_noise * 10, T.pinfo.over_noise[X][A] = j.over_noise * 10, T.pinfo.tot_noise[X][A] = j.tot_noise * 10, T.pinfo.over_SSD[X][A] = j.over_SSD;
7614
7614
  };
7615
7615
  }
7616
- var Cr = wt, Tt = it, gr = Tt.System;
7616
+ var gr = wt, Tt = it, Fr = Tt.System;
7617
7617
  Tt.VbrMode;
7618
7618
  Tt.Float;
7619
7619
  Tt.ShortBlock;
7620
7620
  Tt.Util;
7621
- var Fr = Tt.Arrays;
7621
+ var Jr = Tt.Arrays;
7622
7622
  Tt.new_array_n;
7623
7623
  Tt.new_byte;
7624
7624
  Tt.new_double;
@@ -7626,7 +7626,7 @@ Tt.new_float;
7626
7626
  Tt.new_float_n;
7627
7627
  var N0 = Tt.new_int;
7628
7628
  Tt.new_int_n;
7629
- var Ct = Tt.assert, Je = bt(), Ee = Di, Jr = rn, _0 = Cr;
7629
+ var Ct = Tt.assert, Je = bt(), Ee = Di, Er = rn, _0 = gr;
7630
7630
  function Ai() {
7631
7631
  var t = null;
7632
7632
  this.qupvt = null, this.setModules = function(u) {
@@ -7724,7 +7724,7 @@ function Ai() {
7724
7724
  var he = V.width[R];
7725
7725
  if (j + V.width[R] > V.max_nonzero_coeff) {
7726
7726
  var oe;
7727
- oe = V.max_nonzero_coeff - j + 1, Fr.fill(l, V.max_nonzero_coeff, 576, 0), he = oe, he < 0 && (he = 0), R = f + 1;
7727
+ oe = V.max_nonzero_coeff - j + 1, Jr.fill(l, V.max_nonzero_coeff, 576, 0), he = oe, he < 0 && (he = 0), R = f + 1;
7728
7728
  }
7729
7729
  if (P == 0 && a == 0 && (ee = M, ae = L, le = u, re = c), _ != null && _.sfb_count1 > 0 && R >= _.sfb_count1 && _.step[R] > 0 && _e >= _.step[R] ? (P != 0 && (d(
7730
7730
  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(
@@ -7971,7 +7971,7 @@ function Ai() {
7971
7971
  }
7972
7972
  }
7973
7973
  this.best_huffman_divide = function(u, l) {
7974
- var s = new Jr(), V = l.l3_enc, _ = N0(23), R = N0(23), f = N0(23), j = N0(23);
7974
+ var s = new Er(), V = l.l3_enc, _ = N0(23), R = N0(23), f = N0(23), j = N0(23);
7975
7975
  if (!(l.block_type == Je.SHORT_TYPE && u.mode_gr == 1)) {
7976
7976
  s.assign(l), l.block_type == Je.NORM_TYPE && (w(u, l, V, _, R, f, j), N(
7977
7977
  u,
@@ -8192,7 +8192,7 @@ function Ai() {
8192
8192
  l.scalefac_compress = 500 + L * 3 + ee;
8193
8193
  break;
8194
8194
  default:
8195
- gr.err.printf(`intensity stereo not implemented yet
8195
+ Fr.err.printf(`intensity stereo not implemented yet
8196
8196
  `);
8197
8197
  break;
8198
8198
  }
@@ -8232,19 +8232,19 @@ function Ai() {
8232
8232
  }
8233
8233
  };
8234
8234
  }
8235
- var Er = Ai, Wt = it, At = Wt.System;
8235
+ var Nr = Ai, Wt = it, At = Wt.System;
8236
8236
  Wt.VbrMode;
8237
8237
  Wt.Float;
8238
8238
  Wt.ShortBlock;
8239
8239
  Wt.Util;
8240
- var Nr = Wt.Arrays;
8240
+ var Pr = Wt.Arrays;
8241
8241
  Wt.new_array_n;
8242
- var Pr = Wt.new_byte;
8242
+ var Ur = Wt.new_byte;
8243
8243
  Wt.new_double;
8244
8244
  Wt.new_float;
8245
- var Ur = Wt.new_float_n, zr = Wt.new_int;
8245
+ var zr = Wt.new_float_n, Ar = 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 = Nr, 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) {
@@ -8312,7 +8312,7 @@ function mi() {
8312
8312
  };
8313
8313
  function k(p, u) {
8314
8314
  var l = p.internal_flags, s, V, _;
8315
- if (s = l.l3_side, l.header[l.h_ptr].ptr = 0, Nr.fill(l.header[l.h_ptr].buf, 0, l.sideinfo_len, 0), p.out_samplerate < 16e3 ? J(l, 4094, 12) : J(l, 4095, 12), J(l, p.version, 1), J(l, 1, 2), J(l, p.error_protection ? 0 : 1, 1), J(l, l.bitrate_index, 4), J(l, l.samplerate_index, 2), J(l, l.padding, 1), J(l, p.extension, 1), J(l, p.mode.ordinal(), 2), J(l, l.mode_ext, 2), J(l, p.copyright, 1), J(l, p.original, 1), J(l, p.emphasis, 2), p.error_protection && J(l, 0, 16), p.version == 1) {
8315
+ if (s = l.l3_side, l.header[l.h_ptr].ptr = 0, Pr.fill(l.header[l.h_ptr].buf, 0, l.sideinfo_len, 0), p.out_samplerate < 16e3 ? J(l, 4094, 12) : J(l, 4095, 12), J(l, p.version, 1), J(l, 1, 2), J(l, p.error_protection ? 0 : 1, 1), J(l, l.bitrate_index, 4), J(l, l.samplerate_index, 2), J(l, l.padding, 1), J(l, p.extension, 1), J(l, p.mode.ordinal(), 2), J(l, l.mode_ext, 2), J(l, p.copyright, 1), J(l, p.original, 1), J(l, p.emphasis, 2), p.error_protection && J(l, 0, 16), p.version == 1) {
8316
8316
  for (Ve(s.main_data_begin >= 0), J(l, s.main_data_begin, 9), l.channels_out == 2 ? J(l, s.private_bits, 3) : J(l, s.private_bits, 5), _ = 0; _ < l.channels_out; _++) {
8317
8317
  var R;
8318
8318
  for (R = 0; R < 4; R++)
@@ -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) {
@@ -8501,9 +8501,9 @@ bitsperframe: %d
8501
8501
  if (s != 0 && _ > s)
8502
8502
  return -1;
8503
8503
  if (At.arraycopy(h, 0, u, l, _), W = -1, v = 0, V != 0) {
8504
- var R = zr(1);
8504
+ var R = Ar(1);
8505
8505
  if (R[0] = p.nMusicCRC, m.updateMusicCRC(R, u, l, _), p.nMusicCRC = R[0], _ > 0 && (p.VBR_seek_table.nBytesWritten += _), p.decode_on_the_fly) {
8506
- for (var f = Ur([2, 1152]), j = _, g = -1, P; g != 0; )
8506
+ for (var f = zr([2, 1152]), j = _, g = -1, P; g != 0; )
8507
8507
  if (g = d.hip_decode1_unclipped(
8508
8508
  p.hip,
8509
8509
  u,
@@ -8534,12 +8534,12 @@ 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 = Ur(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;
8541
- const Ar = /* @__PURE__ */ bi(on);
8542
- var ot = it, Or = ot.System, Me = ot.VbrMode;
8541
+ const Or = /* @__PURE__ */ bi(on);
8542
+ var ot = it, jr = ot.System, Me = ot.VbrMode;
8543
8543
  ot.Float;
8544
8544
  var ki = ot.ShortBlock;
8545
8545
  ot.Util;
@@ -8547,21 +8547,21 @@ 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
- 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();
8553
+ var Hs = ot.new_int_n, Qr = ot.new_short_n, Yt = ot.assert, Bi = tr, Dr = nr, P0 = yi, $r = Rr, qr = Lr, ea = kr, v0 = on, Ot = Di, Ne = bt();
8554
8554
  function Qe() {
8555
8555
  var t = this, e = 128 * 1024;
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;
@@ -8575,7 +8575,7 @@ function Qe() {
8575
8575
  return a.class_id = J, c = a.internal_flags = new P0(), a.mode = MPEGMode.NOT_SET, a.original = 1, a.in_samplerate = 44100, a.num_channels = 2, a.num_samples = -1, a.bWriteVbrTag = !0, a.quality = -1, a.short_blocks = null, c.subblock_gain = -1, a.lowpassfreq = 0, a.highpassfreq = 0, a.lowpasswidth = -1, a.highpasswidth = -1, a.VBR = Me.vbr_off, a.VBR_q = 4, a.ATHcurve = -1, a.VBR_mean_bitrate_kbps = 128, a.VBR_min_bitrate_kbps = 0, a.VBR_max_bitrate_kbps = 0, a.VBR_hard_min = 0, c.VBR_min_bitrate = 1, c.VBR_max_bitrate = 13, a.quant_comp = -1, a.quant_comp_short = -1, a.msfix = -1, c.resample_ratio = 1, c.OldValue[0] = 180, c.OldValue[1] = 180, c.CurrentStep[0] = 4, c.CurrentStep[1] = 4, c.masking_lower = 1, c.nsPsy.attackthre = -1, c.nsPsy.attackthre_s = -1, a.scale = -1, a.athaa_type = -1, a.ATHtype = -1, a.athaa_loudapprox = -1, a.athaa_sensitivity = 0, a.useTemporal = null, a.interChRatio = -1, c.mf_samples_to_encode = Ne.ENCDELAY + Ne.POSTDELAY, a.encoder_padding = 0, c.mf_size = Ne.ENCDELAY - Ne.MDCTDELAY, a.findReplayGain = !1, a.decode_on_the_fly = !1, c.decode_on_the_fly = !1, c.findReplayGain = !1, c.findPeakSample = !1, c.RadioGain = 0, c.AudiophileGain = 0, c.noclipGainChange = 0, c.noclipScale = -1, a.preset = 0, a.write_id3tag_automatic = !0, 0;
8576
8576
  }
8577
8577
  this.lame_init = function() {
8578
- var a = new Qr();
8578
+ var a = new Dr();
8579
8579
  return U(a), a.lame_allocated_gfp = 1, a;
8580
8580
  };
8581
8581
  function k(a) {
@@ -8681,7 +8681,7 @@ function Qe() {
8681
8681
  }
8682
8682
  ee == 999 ? c.lowpass1 = (M - 0.75) / 31 : c.lowpass1 = (ee - 0.75) / 31, c.lowpass2 = M / 31;
8683
8683
  }
8684
- if (c.highpass2 > 0 && c.highpass2 < 0.9 * (0.75 / 31) && (c.highpass1 = 0, c.highpass2 = 0, Or.err.println(`Warning: highpass filter disabled. highpass frequency too small
8684
+ if (c.highpass2 > 0 && c.highpass2 < 0.9 * (0.75 / 31) && (c.highpass1 = 0, c.highpass2 = 0, jr.err.println(`Warning: highpass filter disabled. highpass frequency too small
8685
8685
  `)), c.highpass2 > 0) {
8686
8686
  for (var re = -1, ae = 0; ae <= 31; ae++) {
8687
8687
  var le = ae / 31;
@@ -8735,7 +8735,7 @@ function Qe() {
8735
8735
  }
8736
8736
  this.lame_init_params = function(a) {
8737
8737
  var c = a.internal_flags;
8738
- if (c.Class_ID = 0, c.ATH == null && (c.ATH = new Dr()), c.PSY == null && (c.PSY = new O()), c.rgdata == null && (c.rgdata = new $r()), c.channels_in = a.num_channels, c.channels_in == 1 && (a.mode = MPEGMode.MONO), c.channels_out = a.mode == MPEGMode.MONO ? 1 : 2, c.mode_ext = Ne.MPG_MD_MS_LR, a.mode == MPEGMode.MONO && (a.force_ms = !1), a.VBR == Me.vbr_off && a.VBR_mean_bitrate_kbps != 128 && a.brate == 0 && (a.brate = a.VBR_mean_bitrate_kbps), a.VBR == Me.vbr_off || a.VBR == Me.vbr_mtrh || a.VBR == Me.vbr_mt || (a.free_format = !1), a.VBR == Me.vbr_off && a.brate == 0 && v0.EQ(a.compression_ratio, 0) && (a.compression_ratio = 11.025), a.VBR == Me.vbr_off && a.compression_ratio > 0 && (a.out_samplerate == 0 && (a.out_samplerate = map2MP3Frequency(int(0.97 * a.in_samplerate))), a.brate = 0 | a.out_samplerate * 16 * c.channels_out / (1e3 * a.compression_ratio), c.samplerate_index = r(a.out_samplerate, a), a.free_format || (a.brate = K(
8738
+ if (c.Class_ID = 0, c.ATH == null && (c.ATH = new $r()), c.PSY == null && (c.PSY = new O()), c.rgdata == null && (c.rgdata = new qr()), c.channels_in = a.num_channels, c.channels_in == 1 && (a.mode = MPEGMode.MONO), c.channels_out = a.mode == MPEGMode.MONO ? 1 : 2, c.mode_ext = Ne.MPG_MD_MS_LR, a.mode == MPEGMode.MONO && (a.force_ms = !1), a.VBR == Me.vbr_off && a.VBR_mean_bitrate_kbps != 128 && a.brate == 0 && (a.brate = a.VBR_mean_bitrate_kbps), a.VBR == Me.vbr_off || a.VBR == Me.vbr_mtrh || a.VBR == Me.vbr_mt || (a.free_format = !1), a.VBR == Me.vbr_off && a.brate == 0 && v0.EQ(a.compression_ratio, 0) && (a.compression_ratio = 11.025), a.VBR == Me.vbr_off && a.compression_ratio > 0 && (a.out_samplerate == 0 && (a.out_samplerate = map2MP3Frequency(int(0.97 * a.in_samplerate))), a.brate = 0 | a.out_samplerate * 16 * c.channels_out / (1e3 * a.compression_ratio), c.samplerate_index = r(a.out_samplerate, a), a.free_format || (a.brate = K(
8739
8739
  a.brate,
8740
8740
  a.version,
8741
8741
  a.out_samplerate
@@ -8897,7 +8897,7 @@ function Qe() {
8897
8897
  }
8898
8898
  default: {
8899
8899
  var we;
8900
- c.sfb21_extra = !1, a.quality < 0 && (a.quality = LAME_DEFAULT_QUALITY), we = a.VBR, we == Me.vbr_off && (a.VBR_mean_bitrate_kbps = a.brate), o.apply_preset(a, a.VBR_mean_bitrate_kbps, 0), a.VBR = we, c.PSY.mask_adjust = a.maskingadjust, c.PSY.mask_adjust_short = a.maskingadjust_short, we == Me.vbr_off ? c.iteration_loop = new qr(h) : c.iteration_loop = new ABRIterationLoop(h);
8900
+ c.sfb21_extra = !1, a.quality < 0 && (a.quality = LAME_DEFAULT_QUALITY), we = a.VBR, we == Me.vbr_off && (a.VBR_mean_bitrate_kbps = a.brate), o.apply_preset(a, a.VBR_mean_bitrate_kbps, 0), a.VBR = we, c.PSY.mask_adjust = a.maskingadjust, c.PSY.mask_adjust_short = a.maskingadjust_short, we == Me.vbr_off ? c.iteration_loop = new ea(h) : c.iteration_loop = new ABRIterationLoop(h);
8901
8901
  break;
8902
8902
  }
8903
8903
  }
@@ -8928,13 +8928,13 @@ 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
- 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);
8937
+ var ee = a.internal_flags, ae = Qr([2, 1152]), le = 0, re, _e, he, oe, Le = ee.mf_samples_to_encode - Ne.POSTDELAY, ze = l(a);
8938
8938
  if (ee.mf_samples_to_encode < 1)
8939
8939
  return 0;
8940
8940
  for (re = 0, a.in_samplerate != a.out_samplerate && (Le += 16 * a.out_samplerate / a.in_samplerate), he = a.framesize - Le % a.framesize, he < 576 && (he += a.framesize), a.encoder_padding = he, oe = (Le + he) / a.framesize; oe > 0 && le >= 0; ) {
@@ -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++)
@@ -9153,8 +9153,8 @@ function Qe() {
9153
9153
  }
9154
9154
  }
9155
9155
  }
9156
- var ea = Qe;
9157
- const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
9156
+ var ta = Qe;
9157
+ const ia = /* @__PURE__ */ bi(ta), sa = (t, e = 4294967295, i = 79764919) => {
9158
9158
  const n = new Int32Array(256);
9159
9159
  let d, o, m, h = e;
9160
9160
  for (d = 0; d < 256; d++) {
@@ -9163,12 +9163,12 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
9163
9163
  }
9164
9164
  for (d = 0; d < t.length; d++) h = h << 8 ^ n[255 & (h >> 24 ^ t[d])];
9165
9165
  return h;
9166
- }, Ys = (t, e = ia) => {
9166
+ }, Ys = (t, e = sa) => {
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);
@@ -9318,14 +9318,14 @@ function qe() {
9318
9318
  });
9319
9319
  }, this.instantiate = (i, n) => (n && qe.setModule(i, n), this._wasm = new i(qe).instantiate(), this._pointers = /* @__PURE__ */ new Set(), this._wasm.ready.then(() => this));
9320
9320
  }
9321
- var sa = Worker;
9322
- const na = /* @__PURE__ */ bi(sa), ra = () => globalThis.Worker || na;
9323
- class aa extends ra() {
9321
+ var na = Worker;
9322
+ const ra = /* @__PURE__ */ bi(na), aa = () => globalThis.Worker || ra;
9323
+ class la extends aa() {
9324
9324
  constructor(e, i, n, d) {
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,
@@ -9760,7 +9760,7 @@ function K0(t = {}) {
9760
9760
  );
9761
9761
  }, this._isWebWorker = K0.isWebWorker, this._WASMAudioDecoderCommon = K0.WASMAudioDecoderCommon || qe, this._EmscriptenWASM = K0.EmscriptenWASM || w0, this._module = K0.module, this._inputSize = 2 ** 16, this._outputSize = 2889 * 16 * 2, this._ready = this._init(), this;
9762
9762
  }
9763
- class dn extends aa {
9763
+ class dn extends la {
9764
9764
  constructor(e) {
9765
9765
  super(e, "mpg123-decoder", K0, w0);
9766
9766
  }
@@ -9776,10 +9776,10 @@ class dn extends aa {
9776
9776
  }
9777
9777
  cn(K0, "MPEGDecoder");
9778
9778
  cn(dn, "MPEGDecoderWebWorker");
9779
- globalThis.MPEGMode = En;
9780
- globalThis.Lame = ta;
9781
- globalThis.BitStream = Ar;
9782
- class I1 {
9779
+ globalThis.MPEGMode = Nn;
9780
+ globalThis.Lame = ia;
9781
+ globalThis.BitStream = Or;
9782
+ class V1 {
9783
9783
  /**
9784
9784
  * Create a new MP3Encoder.
9785
9785
  *
@@ -9789,7 +9789,7 @@ class I1 {
9789
9789
  * @param config.channels - Number of audio channels (1 = mono, 2 = stereo)
9790
9790
  */
9791
9791
  constructor(e) {
9792
- this.config = e, this.mp3encoder = new gn.Mp3Encoder(
9792
+ this.config = e, this.mp3encoder = new Fn.Mp3Encoder(
9793
9793
  e.channels,
9794
9794
  e.sampleRate,
9795
9795
  e.bitRate
@@ -9797,11 +9797,11 @@ class I1 {
9797
9797
  }
9798
9798
  // Convert AudioData to interleaved Int16 samples
9799
9799
  convertAudioDataToInt16(e) {
9800
- const i = e.numberOfChannels, n = e.numberOfFrames, d = Jn(e), o = new Int16Array(n * i);
9800
+ const i = e.numberOfChannels, n = e.numberOfFrames, d = En(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,
@@ -9939,8 +9939,8 @@ class V1 {
9939
9939
  this.decoder && (await this.decoder.free(), this.decoder = null, this.isReady = !1);
9940
9940
  }
9941
9941
  }
9942
- const la = 100, oa = 0.5, ca = 0.1;
9943
- function da(t, e) {
9942
+ const oa = 100, ca = 0.5, da = 0.1;
9943
+ function ma(t, e) {
9944
9944
  const i = t.getTrackById(e.id);
9945
9945
  for (const n of i.mdia.minf.stbl.stsd.entries) {
9946
9946
  const d = n.avcC || n.hvcC || n.vpcC || n.av1C;
@@ -9953,7 +9953,7 @@ function da(t, e) {
9953
9953
  "Codec description box (avcC, hvcC, vpcC, or av1C) not found"
9954
9954
  );
9955
9955
  }
9956
- function ma(t, e) {
9956
+ function ua(t, e) {
9957
9957
  var n, d;
9958
9958
  const i = {
9959
9959
  duration: e.duration / e.timescale
@@ -9964,7 +9964,7 @@ function ma(t, e) {
9964
9964
  codec: o.codec,
9965
9965
  codedHeight: o.video.height,
9966
9966
  codedWidth: o.video.width,
9967
- description: da(t, o),
9967
+ description: ma(t, o),
9968
9968
  frameRate: o.nb_samples / m
9969
9969
  };
9970
9970
  }
@@ -9978,15 +9978,15 @@ function ma(t, e) {
9978
9978
  }
9979
9979
  return i;
9980
9980
  }
9981
- function ua(t, e) {
9981
+ function ha(t, e) {
9982
9982
  return new Promise((i, n) => {
9983
9983
  const d = t.stream().getReader();
9984
9984
  let o = 0;
9985
- const m = Fn.createFile(!1);
9985
+ const m = Jn.createFile(!1);
9986
9986
  let h = !1;
9987
9987
  m.onReady = (W) => {
9988
9988
  h = !0;
9989
- const v = ma(m, W);
9989
+ const v = ua(m, W);
9990
9990
  i({ info: W, trackData: v, mp4: m });
9991
9991
  }, m.onError = (W) => {
9992
9992
  n(
@@ -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
- function ha(t, e, i, n, d) {
10023
+ function ba(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) {
@@ -10030,7 +10030,7 @@ function ha(t, e, i, n, d) {
10030
10030
  return;
10031
10031
  }
10032
10032
  Z = N.id;
10033
- const J = m.duration / m.timescale - ca, U = Math.min(d || J, J);
10033
+ const J = m.duration / m.timescale - da, U = Math.min(d || J, J);
10034
10034
  for (const K in m.tracks) {
10035
10035
  const X = m.tracks[K];
10036
10036
  o.unsetExtractionOptions(X.id);
@@ -10051,15 +10051,15 @@ function ha(t, e, i, n, d) {
10051
10051
  }
10052
10052
  if (A.length > 0 && o.releaseUsedSamples(Z, A[A.length - 1].number), w.length > 0) {
10053
10053
  const H = w[w.length - 1].timestamp / 1e6;
10054
- (Math.abs(H - U) < oa || H > U) && (v = !0, o.stop(), o.flush(), h(w));
10054
+ (Math.abs(H - U) < ca || 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
  )
10061
10061
  );
10062
- }, o.setExtractionOptions(Z, null, { nbSamples: la });
10062
+ }, o.setExtractionOptions(Z, null, { nbSamples: oa });
10063
10063
  const k = o.seek(n, !0), I = t.slice(k.offset).stream().getReader();
10064
10064
  W = k.offset;
10065
10065
  const r = async () => {
@@ -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
@@ -10092,7 +10092,7 @@ class R1 {
10092
10092
  * Must be called before extracting segments.
10093
10093
  */
10094
10094
  async load(e) {
10095
- this.mp4Data = await ua(this.file, e);
10095
+ this.mp4Data = await ha(this.file, e);
10096
10096
  }
10097
10097
  /**
10098
10098
  * Get track information from the loaded MP4 file.
@@ -10137,7 +10137,7 @@ class R1 {
10137
10137
  async extractSegment(e, i, n) {
10138
10138
  if (!this.mp4Data)
10139
10139
  throw new Error("MP4Demuxer: Must call load() before extractSegment()");
10140
- return ha(this.file, this.mp4Data, e, i, n);
10140
+ return ba(this.file, this.mp4Data, e, i, n);
10141
10141
  }
10142
10142
  /**
10143
10143
  * Get the full MP4 info object from MP4Box.
@@ -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,57 @@ 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 = {
10206
- VIDEO: mn
10204
+ class mn {
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 = mn);
10235
+ const L1 = self.MediaStreamTrackProcessor || mn;
10236
+ 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 || {});
10237
+ const un = "video", fa = "audio", Za = "subtitle", ws = {
10238
+ VIDEO: un
10207
10239
  }, Ci = {
10208
- [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
+ [un]: I0.AVMEDIA_TYPE_VIDEO,
10241
+ [fa]: I0.AVMEDIA_TYPE_AUDIO,
10242
+ [Za]: I0.AVMEDIA_TYPE_SUBTITLE
10243
+ }, hn = "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(hn)], {
10212
10244
  type: "text/javascript;charset=utf-8"
10213
10245
  });
10214
- function Xa(t) {
10246
+ function _a(t) {
10215
10247
  let e;
10216
10248
  try {
10217
10249
  if (e = Ks && (window.URL || window.webkitURL).createObjectURL(Ks), !e)
@@ -10223,7 +10255,7 @@ function Xa(t) {
10223
10255
  (window.URL || window.webkitURL).revokeObjectURL(e);
10224
10256
  }), i;
10225
10257
  } catch {
10226
- return new Worker("data:text/javascript;base64," + un, {
10258
+ return new Worker("data:text/javascript;base64," + hn, {
10227
10259
  name: t == null ? void 0 : t.name
10228
10260
  });
10229
10261
  } finally {
@@ -10233,7 +10265,7 @@ function Xa(t) {
10233
10265
  const Ms = 1e6;
10234
10266
  class fi {
10235
10267
  constructor(e) {
10236
- oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new Xa({
10268
+ oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new _a({
10237
10269
  name: "web-demuxer"
10238
10270
  }), this.wasmWorkerLoadStatus = new Promise((i, n) => {
10239
10271
  this.wasmWorker.addEventListener("message", (d) => {
@@ -10262,9 +10294,9 @@ class fi {
10262
10294
  }
10263
10295
  const o = this.msgId, m = (h) => {
10264
10296
  let {
10265
- data: G
10297
+ data: S
10266
10298
  } = h;
10267
- G.type === e && G.msgId === o && (G.errMsg ? d(G.errMsg) : n(G.result), this.wasmWorker.removeEventListener("message", m));
10299
+ S.type === e && S.msgId === o && (S.errMsg ? d(S.errMsg) : n(S.result), this.wasmWorker.removeEventListener("message", m));
10268
10300
  };
10269
10301
  this.wasmWorker.addEventListener("message", m), this.post(e, i, o);
10270
10302
  });
@@ -10363,7 +10395,7 @@ class fi {
10363
10395
  const m = new CountQueuingStrategy({
10364
10396
  highWaterMark: 1
10365
10397
  }), h = this.msgId;
10366
- let G = 0, W, v;
10398
+ let S = 0, W, v;
10367
10399
  return new ReadableStream({
10368
10400
  start: (Z) => {
10369
10401
  if (!this.source) {
@@ -10383,7 +10415,7 @@ class fi {
10383
10415
  });
10384
10416
  },
10385
10417
  pull: () => {
10386
- G > 0 && this.post(rt.ReadNextAVPacket, void 0, h), G++;
10418
+ S > 0 && this.post(rt.ReadNextAVPacket, void 0, h), S++;
10387
10419
  },
10388
10420
  cancel: () => new Promise((Z) => {
10389
10421
  v = Z, this.post(rt.StopReadAVPacket, void 0, h);
@@ -10509,7 +10541,7 @@ function Zi() {
10509
10541
  "⚠️ 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
10542
  ), ks = !0);
10511
10543
  }
10512
- async function W1(t) {
10544
+ async function x1(t) {
10513
10545
  Zi();
10514
10546
  const e = new fi({
10515
10547
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10518,12 +10550,12 @@ async function W1(t) {
10518
10550
  const i = e.read("video", 0).getReader(), n = [];
10519
10551
  return new Promise(function(d) {
10520
10552
  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);
10553
+ const { done: h, value: S } = m;
10554
+ return S && n.push(S), h ? d(n) : i.read().then(o);
10523
10555
  });
10524
10556
  });
10525
10557
  }
10526
- async function L1(t) {
10558
+ async function H1(t) {
10527
10559
  Zi();
10528
10560
  const e = new fi({
10529
10561
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10531,9 +10563,9 @@ async function L1(t) {
10531
10563
  await e.load(t);
10532
10564
  const i = e.read("audio", 0).getReader(), n = [];
10533
10565
  await new Promise(function(h) {
10534
- i.read().then(async function G(W) {
10566
+ i.read().then(async function S(W) {
10535
10567
  const { done: v, value: Z } = W;
10536
- return Z && n.push(Z), v ? h(n) : i.read().then(G);
10568
+ return Z && n.push(Z), v ? h(n) : i.read().then(S);
10537
10569
  });
10538
10570
  });
10539
10571
  const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "audio")[0], m = {
@@ -10546,7 +10578,7 @@ async function L1(t) {
10546
10578
  config: m
10547
10579
  };
10548
10580
  }
10549
- async function x1(t) {
10581
+ async function Y1(t) {
10550
10582
  Zi();
10551
10583
  const e = new fi({
10552
10584
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10554,9 +10586,9 @@ async function x1(t) {
10554
10586
  await e.load(t);
10555
10587
  const i = e.read("video", 0).getReader(), n = [];
10556
10588
  await new Promise(function(h) {
10557
- i.read().then(async function G(W) {
10589
+ i.read().then(async function S(W) {
10558
10590
  const { done: v, value: Z } = W;
10559
- return Z && n.push(Z), v ? h(n) : i.read().then(G);
10591
+ return Z && n.push(Z), v ? h(n) : i.read().then(S);
10560
10592
  });
10561
10593
  });
10562
10594
  const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "video")[0], m = {
@@ -10570,7 +10602,7 @@ async function x1(t) {
10570
10602
  config: m
10571
10603
  };
10572
10604
  }
10573
- async function H1(t) {
10605
+ async function w1(t) {
10574
10606
  Zi();
10575
10607
  const e = new fi({
10576
10608
  wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
@@ -10579,8 +10611,8 @@ async function H1(t) {
10579
10611
  const i = e.read("audio", 0).getReader(), n = [];
10580
10612
  return new Promise(function(d) {
10581
10613
  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);
10614
+ const { done: h, value: S } = m;
10615
+ return S && n.push(S), h ? d(n) : i.read().then(o);
10584
10616
  });
10585
10617
  });
10586
10618
  }
@@ -10652,7 +10684,7 @@ const ye = (t) => {
10652
10684
  }, s0 = (t) => {
10653
10685
  const e = ye(t);
10654
10686
  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 = {
10687
+ }, 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
10688
  bt709: 1,
10657
10689
  // ITU-R BT.709
10658
10690
  bt470bg: 5,
@@ -10687,8 +10719,8 @@ const ye = (t) => {
10687
10719
  // SMPTE 170M
10688
10720
  "bt2020-ncl": 9
10689
10721
  // ITU-R BT.2020-2 (non-constant luminance)
10690
- }, Ga = (t) => !!t && !!t.primaries && !!t.transfer && !!t.matrix && t.fullRange !== void 0, hn = (t) => t instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && t instanceof SharedArrayBuffer || ArrayBuffer.isView(t);
10691
- class bn {
10722
+ }, Ga = (t) => !!t && !!t.primaries && !!t.transfer && !!t.matrix && t.fullRange !== void 0, bn = (t) => t instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && t instanceof SharedArrayBuffer || ArrayBuffer.isView(t);
10723
+ class pn {
10692
10724
  constructor() {
10693
10725
  this.currentPromise = Promise.resolve();
10694
10726
  }
@@ -10700,34 +10732,34 @@ class bn {
10700
10732
  return this.currentPromise = i, await n, e;
10701
10733
  }
10702
10734
  }
10703
- const Sa = () => {
10735
+ const va = () => {
10704
10736
  let t, e;
10705
10737
  return { promise: new Promise((n, d) => {
10706
10738
  t = n, e = d;
10707
10739
  }), resolve: t, reject: e };
10708
- }, pn = (t) => {
10740
+ }, yn = (t) => {
10709
10741
  throw new Error(`Unexpected value: ${t}`);
10710
- }, va = (t, e, i, n) => {
10742
+ }, Ia = (t, e, i, n) => {
10711
10743
  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) => {
10744
+ }, Va = "und", Ra = /^[a-z]{3}$/, Ta = (t) => Ra.test(t), Bs = 1e6 * (1 + Number.EPSILON), Wa = (t, e) => {
10713
10745
  const i = t < 0 ? -1 : 1;
10714
10746
  t = Math.abs(t);
10715
10747
  let n = 0, d = 1, o = 1, m = 0, h = t;
10716
10748
  for (; ; ) {
10717
- const G = Math.floor(h), W = G * o + n, v = G * m + d;
10749
+ const S = Math.floor(h), W = S * o + n, v = S * m + d;
10718
10750
  if (v > e)
10719
10751
  return {
10720
10752
  numerator: i * o,
10721
10753
  denominator: m
10722
10754
  };
10723
- if (n = o, d = m, o = W, m = v, h = 1 / (h - G), !isFinite(h))
10755
+ if (n = o, d = m, o = W, m = v, h = 1 / (h - S), !isFinite(h))
10724
10756
  break;
10725
10757
  }
10726
10758
  return {
10727
10759
  numerator: i * o,
10728
10760
  denominator: m
10729
10761
  };
10730
- }, yn = function* (t) {
10762
+ }, fn = function* (t) {
10731
10763
  for (const e in t) {
10732
10764
  const i = t[e];
10733
10765
  i !== void 0 && (yield { key: e, value: i });
@@ -10740,7 +10772,7 @@ const Sa = () => {
10740
10772
  * License, v. 2.0. If a copy of the MPL was not distributed with this
10741
10773
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
10742
10774
  */
10743
- class fn {
10775
+ class Zn {
10744
10776
  /** Creates a new {@link RichImageData}. */
10745
10777
  constructor(e, i) {
10746
10778
  if (this.data = e, this.mimeType = i, !(e instanceof Uint8Array))
@@ -10749,7 +10781,7 @@ class fn {
10749
10781
  throw new TypeError("mimeType must be a string.");
10750
10782
  }
10751
10783
  }
10752
- class Wa {
10784
+ class La {
10753
10785
  /** Creates a new {@link AttachedFile}. */
10754
10786
  constructor(e, i, n, d) {
10755
10787
  if (this.data = e, this.mimeType = i, this.name = n, this.description = d, !(e instanceof Uint8Array))
@@ -10762,7 +10794,7 @@ class Wa {
10762
10794
  throw new TypeError("description, when provided, must be a string.");
10763
10795
  }
10764
10796
  }
10765
- const La = (t) => {
10797
+ const xa = (t) => {
10766
10798
  if (!t || typeof t != "object")
10767
10799
  throw new TypeError("tags must be an object.");
10768
10800
  if (t.title !== void 0 && typeof t.title != "string")
@@ -10809,10 +10841,10 @@ const La = (t) => {
10809
10841
  if (!t.raw || typeof t.raw != "object")
10810
10842
  throw new TypeError("tags.raw, when provided, must be an object.");
10811
10843
  for (const e of Object.values(t.raw))
10812
- if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof fn) && !(e instanceof Wa))
10844
+ if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof Zn) && !(e instanceof La))
10813
10845
  throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.");
10814
10846
  }
10815
- }, xa = (t) => {
10847
+ }, Ha = (t) => {
10816
10848
  if (!t || typeof t != "object")
10817
10849
  throw new TypeError("disposition must be an object.");
10818
10850
  if (t.default !== void 0 && typeof t.default != "boolean")
@@ -10857,32 +10889,32 @@ const O0 = [
10857
10889
  "pcm-s8",
10858
10890
  "ulaw",
10859
10891
  "alaw"
10860
- ], Zn = [
10892
+ ], Xn = [
10861
10893
  "aac",
10862
10894
  "opus",
10863
10895
  "mp3",
10864
10896
  "vorbis",
10865
10897
  "flac"
10866
10898
  ], ui = [
10867
- ...Zn,
10899
+ ...Xn,
10868
10900
  ...k0
10869
10901
  ], hi = [
10870
10902
  "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) => {
10903
+ ], Ya = (t) => {
10904
+ 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;
10905
+ return [d, S, k, 0];
10906
+ }, wa = /^pcm-([usf])(\d+)+(be)?$/, D0 = (t) => {
10875
10907
  if (ve(k0.includes(t)), t === "ulaw")
10876
10908
  return { dataType: "ulaw", sampleSize: 1, littleEndian: !0, silentValue: 255 };
10877
10909
  if (t === "alaw")
10878
10910
  return { dataType: "alaw", sampleSize: 1, littleEndian: !0, silentValue: 213 };
10879
- const e = Ya.exec(t);
10911
+ const e = wa.exec(t);
10880
10912
  ve(e);
10881
10913
  let i;
10882
10914
  e[1] === "u" ? i = "unsigned" : e[1] === "s" ? i = "signed" : i = "float";
10883
10915
  const n = Number(e[2]) / 8, d = e[3] !== "be", o = t === "pcm-u8" ? 2 ** 7 : 0;
10884
10916
  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) => {
10917
+ }, 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
10918
  if (!t)
10887
10919
  throw new TypeError("Video chunk metadata must be provided.");
10888
10920
  if (typeof t != "object")
@@ -10893,13 +10925,13 @@ const O0 = [
10893
10925
  throw new TypeError("Video chunk metadata decoder configuration must be an object.");
10894
10926
  if (typeof t.decoderConfig.codec != "string")
10895
10927
  throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");
10896
- if (!wa.some((e) => t.decoderConfig.codec.startsWith(e)))
10928
+ if (!Ka.some((e) => t.decoderConfig.codec.startsWith(e)))
10897
10929
  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
10930
  if (!Number.isInteger(t.decoderConfig.codedWidth) || t.decoderConfig.codedWidth <= 0)
10899
10931
  throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");
10900
10932
  if (!Number.isInteger(t.decoderConfig.codedHeight) || t.decoderConfig.codedHeight <= 0)
10901
10933
  throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");
10902
- if (t.decoderConfig.description !== void 0 && !hn(t.decoderConfig.description))
10934
+ if (t.decoderConfig.description !== void 0 && !bn(t.decoderConfig.description))
10903
10935
  throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");
10904
10936
  if (t.decoderConfig.colorSpace !== void 0) {
10905
10937
  const { colorSpace: e } = t.decoderConfig;
@@ -10918,20 +10950,20 @@ const O0 = [
10918
10950
  throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.");
10919
10951
  }
10920
10952
  if (t.decoderConfig.codec.startsWith("avc1") || t.decoderConfig.codec.startsWith("avc3")) {
10921
- if (!Ka.test(t.decoderConfig.codec))
10953
+ if (!Ma.test(t.decoderConfig.codec))
10922
10954
  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
10955
  } else if (t.decoderConfig.codec.startsWith("hev1") || t.decoderConfig.codec.startsWith("hvc1")) {
10924
- if (!Ma.test(t.decoderConfig.codec))
10956
+ if (!ka.test(t.decoderConfig.codec))
10925
10957
  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
10958
  } else if (t.decoderConfig.codec.startsWith("vp8")) {
10927
10959
  if (t.decoderConfig.codec !== "vp8")
10928
10960
  throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".');
10929
10961
  } else if (t.decoderConfig.codec.startsWith("vp09")) {
10930
- if (!ka.test(t.decoderConfig.codec))
10962
+ if (!Ba.test(t.decoderConfig.codec))
10931
10963
  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))
10964
+ } else if (t.decoderConfig.codec.startsWith("av01") && !Ca.test(t.decoderConfig.codec))
10933
10965
  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) => {
10966
+ }, Fa = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"], Ja = (t) => {
10935
10967
  if (!t)
10936
10968
  throw new TypeError("Audio chunk metadata must be provided.");
10937
10969
  if (typeof t != "object")
@@ -10942,13 +10974,13 @@ const O0 = [
10942
10974
  throw new TypeError("Audio chunk metadata decoder configuration must be an object.");
10943
10975
  if (typeof t.decoderConfig.codec != "string")
10944
10976
  throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");
10945
- if (!ga.some((e) => t.decoderConfig.codec.startsWith(e)))
10977
+ if (!Fa.some((e) => t.decoderConfig.codec.startsWith(e)))
10946
10978
  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
10979
  if (!Number.isInteger(t.decoderConfig.sampleRate) || t.decoderConfig.sampleRate <= 0)
10948
10980
  throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");
10949
10981
  if (!Number.isInteger(t.decoderConfig.numberOfChannels) || t.decoderConfig.numberOfChannels <= 0)
10950
10982
  throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");
10951
- if (t.decoderConfig.description !== void 0 && !hn(t.decoderConfig.description))
10983
+ if (t.decoderConfig.description !== void 0 && !bn(t.decoderConfig.description))
10952
10984
  throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");
10953
10985
  if (t.decoderConfig.codec.startsWith("mp4a") && t.decoderConfig.codec !== "mp4a.69" && t.decoderConfig.codec !== "mp4a.6B" && t.decoderConfig.codec !== "mp4a.6b") {
10954
10986
  if (!["mp4a.40.2", "mp4a.40.02", "mp4a.40.5", "mp4a.40.05", "mp4a.40.29", "mp4a.67"].includes(t.decoderConfig.codec))
@@ -10975,7 +11007,7 @@ const O0 = [
10975
11007
  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
11008
  } else if ((t.decoderConfig.codec.startsWith("pcm") || t.decoderConfig.codec.startsWith("ulaw") || t.decoderConfig.codec.startsWith("alaw")) && !k0.includes(t.decoderConfig.codec))
10977
11009
  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) => {
11010
+ }, Ea = (t) => {
10979
11011
  if (!t)
10980
11012
  throw new TypeError("Subtitle metadata must be provided.");
10981
11013
  if (typeof t != "object")
@@ -10994,9 +11026,9 @@ const O0 = [
10994
11026
  * License, v. 2.0. If a copy of the MPL was not distributed with this
10995
11027
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
10996
11028
  */
10997
- class Ea {
11029
+ class Na {
10998
11030
  constructor(e) {
10999
- this.mutex = new bn(), this.firstMediaStreamTimestamp = null, this.trackTimestampInfo = /* @__PURE__ */ new WeakMap(), this.output = e;
11031
+ this.mutex = new pn(), this.firstMediaStreamTimestamp = null, this.trackTimestampInfo = /* @__PURE__ */ new WeakMap(), this.output = e;
11000
11032
  }
11001
11033
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
11002
11034
  onTrackClose(e) {
@@ -11067,7 +11099,7 @@ const ts = (t) => {
11067
11099
  for (let n = 0; n < i; n++)
11068
11100
  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
11101
  return new Uint8Array(e);
11070
- }, Na = (t, e) => {
11102
+ }, Pa = (t, e) => {
11071
11103
  const i = t.reduce((o, m) => o + e + m.byteLength, 0), n = new Uint8Array(i);
11072
11104
  let d = 0;
11073
11105
  for (const o of t) {
@@ -11080,7 +11112,7 @@ const ts = (t) => {
11080
11112
  m.setUint16(d, o.byteLength, !1);
11081
11113
  break;
11082
11114
  case 3:
11083
- va(m, d, o.byteLength);
11115
+ Ia(m, d, o.byteLength);
11084
11116
  break;
11085
11117
  case 4:
11086
11118
  m.setUint32(d, o.byteLength, !1);
@@ -11089,12 +11121,12 @@ const ts = (t) => {
11089
11121
  d += e, n.set(o, d), d += o.byteLength;
11090
11122
  }
11091
11123
  return n;
11092
- }, gi = (t) => t[0] & 31, Pa = (t) => {
11124
+ }, gi = (t) => t[0] & 31, Ua = (t) => {
11093
11125
  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);
11126
+ 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
11127
  if (i.length === 0 || n.length === 0)
11096
11128
  return null;
11097
- const o = i[0], m = za(o);
11129
+ const o = i[0], m = Aa(o);
11098
11130
  ve(m !== null);
11099
11131
  const h = m.profileIdc === 100 || m.profileIdc === 110 || m.profileIdc === 122 || m.profileIdc === 144;
11100
11132
  return {
@@ -11114,7 +11146,7 @@ const ts = (t) => {
11114
11146
  } catch (e) {
11115
11147
  return console.error("Error building AVC Decoder Configuration Record:", e), null;
11116
11148
  }
11117
- }, Ua = (t) => {
11149
+ }, za = (t) => {
11118
11150
  const e = [];
11119
11151
  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
11152
  for (const i of t.sequenceParameterSets) {
@@ -11140,15 +11172,15 @@ const ts = (t) => {
11140
11172
  }
11141
11173
  }
11142
11174
  return new Uint8Array(e);
11143
- }, za = (t) => {
11175
+ }, Aa = (t) => {
11144
11176
  try {
11145
11177
  const e = new A0(Oi(t));
11146
11178
  if (e.skipBits(1), e.skipBits(2), e.readBits(5) !== 7)
11147
11179
  return null;
11148
11180
  const n = e.readAlignedByte(), d = e.readAlignedByte(), o = e.readAlignedByte();
11149
11181
  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))) {
11182
+ let m = null, h = null, S = null;
11183
+ 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
11184
  for (let O = 0; O < (m !== 3 ? 8 : 12); O++)
11153
11185
  if (e.readBits(1)) {
11154
11186
  const N = O < 6 ? 16 : 64;
@@ -11181,37 +11213,37 @@ const ts = (t) => {
11181
11213
  frameMbsOnlyFlag: v,
11182
11214
  chromaFormatIdc: m,
11183
11215
  bitDepthLumaMinus8: h,
11184
- bitDepthChromaMinus8: G
11216
+ bitDepthChromaMinus8: S
11185
11217
  };
11186
11218
  } catch (e) {
11187
11219
  return console.error("Error parsing AVC SPS:", e), null;
11188
11220
  }
11189
- }, H0 = (t) => t[0] >> 1 & 63, Aa = (t) => {
11221
+ }, H0 = (t) => t[0] >> 1 & 63, Oa = (t) => {
11190
11222
  try {
11191
11223
  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
11224
  if (n.length === 0 || d.length === 0)
11193
11225
  return null;
11194
11226
  const m = n[0], h = new A0(Oi(m));
11195
11227
  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);
11228
+ 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
11229
  ye(h);
11198
11230
  const U = ye(h);
11199
11231
  U === 3 && h.skipBits(1), ye(h), ye(h), h.readBits(1) && (ye(h), ye(h), ye(h), ye(h));
11200
11232
  const k = ye(h), I = ye(h);
11201
11233
  ye(h);
11202
- const K = h.readBits(1) ? 0 : G;
11203
- for (let u = K; u <= G; u++)
11234
+ const K = h.readBits(1) ? 0 : S;
11235
+ for (let u = K; u <= S; u++)
11204
11236
  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));
11237
+ 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
11238
  const X = ye(h);
11207
- if (Qa(h, X), h.readBits(1)) {
11239
+ if (Da(h, X), h.readBits(1)) {
11208
11240
  const u = ye(h);
11209
11241
  for (let l = 0; l < u; l++)
11210
11242
  ye(h), h.skipBits(1);
11211
11243
  }
11212
11244
  h.skipBits(1), h.skipBits(1);
11213
11245
  let A = 0;
11214
- h.readBits(1) && (A = $a(h, G));
11246
+ h.readBits(1) && (A = qa(h, S));
11215
11247
  let T = 0;
11216
11248
  if (d.length > 0) {
11217
11249
  const u = d[0], l = new A0(Oi(u));
@@ -11264,7 +11296,7 @@ const ts = (t) => {
11264
11296
  bitDepthChromaMinus8: I,
11265
11297
  avgFrameRate: 0,
11266
11298
  constantFrameRate: 0,
11267
- numTemporalLayers: G + 1,
11299
+ numTemporalLayers: S + 1,
11268
11300
  temporalIdNested: W,
11269
11301
  lengthSizeMinusOne: 3,
11270
11302
  arrays: H
@@ -11272,7 +11304,7 @@ const ts = (t) => {
11272
11304
  } catch (e) {
11273
11305
  return console.error("Error building HEVC Decoder Configuration Record:", e), null;
11274
11306
  }
11275
- }, Oa = (t, e) => {
11307
+ }, ja = (t, e) => {
11276
11308
  const i = t.readBits(2), n = t.readBits(1), d = t.readBits(5);
11277
11309
  let o = 0;
11278
11310
  for (let v = 0; v < 32; v++)
@@ -11280,14 +11312,14 @@ const ts = (t) => {
11280
11312
  const m = new Uint8Array(6);
11281
11313
  for (let v = 0; v < 6; v++)
11282
11314
  m[v] = t.readBits(8);
11283
- const h = t.readBits(8), G = [], W = [];
11315
+ const h = t.readBits(8), S = [], W = [];
11284
11316
  for (let v = 0; v < e; v++)
11285
- G.push(t.readBits(1)), W.push(t.readBits(1));
11317
+ S.push(t.readBits(1)), W.push(t.readBits(1));
11286
11318
  if (e > 0)
11287
11319
  for (let v = e; v < 8; v++)
11288
11320
  t.skipBits(2);
11289
11321
  for (let v = 0; v < e; v++)
11290
- G[v] && t.skipBits(88), W[v] && t.skipBits(8);
11322
+ S[v] && t.skipBits(88), W[v] && t.skipBits(8);
11291
11323
  return {
11292
11324
  general_profile_space: i,
11293
11325
  general_tier_flag: n,
@@ -11296,7 +11328,7 @@ const ts = (t) => {
11296
11328
  general_constraint_indicator_flags: m,
11297
11329
  general_level_idc: h
11298
11330
  };
11299
- }, ja = (t) => {
11331
+ }, Qa = (t) => {
11300
11332
  for (let e = 0; e < 4; e++)
11301
11333
  for (let i = 0; i < (e === 3 ? 2 : 6); i++)
11302
11334
  if (!t.readBits(1))
@@ -11307,55 +11339,55 @@ const ts = (t) => {
11307
11339
  for (let o = 0; o < d; o++)
11308
11340
  s0(t);
11309
11341
  }
11310
- }, Qa = (t, e) => {
11342
+ }, Da = (t, e) => {
11311
11343
  const i = [];
11312
11344
  for (let n = 0; n < e; n++)
11313
- i[n] = Da(t, n, e, i);
11314
- }, Da = (t, e, i, n) => {
11345
+ i[n] = $a(t, n, e, i);
11346
+ }, $a = (t, e, i, n) => {
11315
11347
  let d = 0, o = 0, m = 0;
11316
11348
  if (e !== 0 && (o = t.readBits(1)), o) {
11317
11349
  if (e === i) {
11318
- const G = ye(t);
11319
- m = e - (G + 1);
11350
+ const S = ye(t);
11351
+ m = e - (S + 1);
11320
11352
  } else
11321
11353
  m = e - 1;
11322
11354
  t.readBits(1), ye(t);
11323
11355
  const h = n[m] ?? 0;
11324
- for (let G = 0; G <= h; G++)
11356
+ for (let S = 0; S <= h; S++)
11325
11357
  t.readBits(1) || t.readBits(1);
11326
11358
  d = n[m];
11327
11359
  } else {
11328
- const h = ye(t), G = ye(t);
11360
+ const h = ye(t), S = ye(t);
11329
11361
  for (let W = 0; W < h; W++)
11330
11362
  ye(t), t.readBits(1);
11331
- for (let W = 0; W < G; W++)
11363
+ for (let W = 0; W < S; W++)
11332
11364
  ye(t), t.readBits(1);
11333
- d = h + G;
11365
+ d = h + S;
11334
11366
  }
11335
11367
  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)) {
11368
+ }, qa = (t, e) => {
11369
+ 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
11370
  t.readBits(1), t.readBits(1), t.readBits(1);
11339
11371
  const i = ye(t);
11340
11372
  return ye(t), ye(t), ye(t), ye(t), i;
11341
11373
  }
11342
11374
  return 0;
11343
- }, qa = (t, e, i) => {
11375
+ }, el = (t, e, i) => {
11344
11376
  let n = !1, d = !1, o = !1;
11345
11377
  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
11378
  for (let m = 0; m <= i; m++) {
11347
11379
  const h = t.readBits(1) === 1;
11348
- let G = !0;
11349
- h || (G = t.readBits(1) === 1);
11380
+ let S = !0;
11381
+ h || (S = t.readBits(1) === 1);
11350
11382
  let W = !1;
11351
- G ? ye(t) : W = t.readBits(1) === 1;
11383
+ S ? ye(t) : W = t.readBits(1) === 1;
11352
11384
  let v = 1;
11353
11385
  W || (v = ye(t) + 1), n && Cs(t, v, o), d && Cs(t, v, o);
11354
11386
  }
11355
11387
  }, Cs = (t, e, i) => {
11356
11388
  for (let n = 0; n < e; n++)
11357
11389
  ye(t), ye(t), i && (ye(t), ye(t)), t.readBits(1);
11358
- }, el = (t) => {
11390
+ }, tl = (t) => {
11359
11391
  const e = [];
11360
11392
  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
11393
  for (const i of t.arrays) {
@@ -11367,8 +11399,8 @@ const ts = (t) => {
11367
11399
  }
11368
11400
  }
11369
11401
  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);
11402
+ }, il = (t) => {
11403
+ 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
11404
  let h = null;
11373
11405
  return m && (h = t.subarray(19, 21 + i)), {
11374
11406
  outputChannelCount: i,
@@ -11510,7 +11542,7 @@ class B0 {
11510
11542
  * License, v. 2.0. If a copy of the MPL was not distributed with this
11511
11543
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
11512
11544
  */
11513
- const il = (t) => {
11545
+ const sl = (t) => {
11514
11546
  let i = (t.hasVideo ? "video/" : t.hasAudio ? "audio/" : "application/") + (t.isQuickTime ? "quicktime" : "mp4");
11515
11547
  if (t.codecStrings.length > 0) {
11516
11548
  const n = [...new Set(t.codecStrings)];
@@ -11533,7 +11565,7 @@ const Fi = 8, Js = 16;
11533
11565
  * License, v. 2.0. If a copy of the MPL was not distributed with this
11534
11566
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
11535
11567
  */
11536
- const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, sl = (t) => {
11568
+ const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, nl = (t) => {
11537
11569
  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
11570
  return e.toString().padStart(2, "0") + ":" + i.toString().padStart(2, "0") + ":" + n.toString().padStart(2, "0") + "." + d.toString().padStart(3, "0");
11539
11571
  };
@@ -11595,7 +11627,7 @@ class Ns {
11595
11627
  }
11596
11628
  }
11597
11629
  }
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) => {
11630
+ 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]]), _n = (t) => (qt.setInt16(0, t, !1), [He[0], He[1]]), Sn = (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) => {
11599
11631
  const i = [];
11600
11632
  let n = t;
11601
11633
  do {
@@ -11611,7 +11643,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11611
11643
  for (const i of t)
11612
11644
  (!e || i.timestamp > e.timestamp) && (e = i);
11613
11645
  return e;
11614
- }, Sn = (t) => {
11646
+ }, vn = (t) => {
11615
11647
  const e = t * (Math.PI / 180), i = Math.round(Math.cos(e)), n = Math.round(Math.sin(e));
11616
11648
  return [
11617
11649
  i,
@@ -11624,7 +11656,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11624
11656
  0,
11625
11657
  1
11626
11658
  ];
11627
- }, vn = /* @__PURE__ */ Sn(0), In = (t) => [
11659
+ }, In = /* @__PURE__ */ vn(0), Vn = (t) => [
11628
11660
  i0(t[0]),
11629
11661
  i0(t[1]),
11630
11662
  Ji(t[2]),
@@ -11634,18 +11666,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11634
11666
  i0(t[6]),
11635
11667
  i0(t[7]),
11636
11668
  Ji(t[8])
11637
- ], Se = (t, e, i) => ({
11669
+ ], Ge = (t, e, i) => ({
11638
11670
  type: t,
11639
11671
  contents: e && new Uint8Array(e.flat(10)),
11640
11672
  children: i
11641
- }), Ye = (t, e, i, n, d) => Se(t, [Ue(e), _n(i), n ?? []], d), nl = (t) => t.isQuickTime ? Se("ftyp", [
11673
+ }), Ye = (t, e, i, n, d) => Ge(t, [Ue(e), Sn(i), n ?? []], d), rl = (t) => t.isQuickTime ? Ge("ftyp", [
11642
11674
  at("qt "),
11643
11675
  // Major brand
11644
11676
  me(512),
11645
11677
  // Minor version
11646
11678
  // Compatible brands
11647
11679
  at("qt ")
11648
- ]) : t.fragmented ? Se("ftyp", [
11680
+ ]) : t.fragmented ? Ge("ftyp", [
11649
11681
  at("iso5"),
11650
11682
  // Major brand
11651
11683
  me(512),
@@ -11654,7 +11686,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11654
11686
  at("iso5"),
11655
11687
  at("iso6"),
11656
11688
  at("mp41")
11657
- ]) : Se("ftyp", [
11689
+ ]) : Ge("ftyp", [
11658
11690
  at("isom"),
11659
11691
  // Major brand
11660
11692
  me(512),
@@ -11663,12 +11695,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11663
11695
  at("isom"),
11664
11696
  t.holdsAvc ? at("avc1") : [],
11665
11697
  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) => {
11698
+ ]), ci = (t) => ({ type: "mdat", largeSize: t }), al = (t) => ({ type: "free", size: t }), U0 = (t) => Ge("moov", void 0, [
11699
+ ll(t.creationTime, t.trackDatas),
11700
+ ...t.trackDatas.map((e) => ol(e, t.creationTime)),
11701
+ t.isFragmented ? Nl(t.trackDatas) : null,
11702
+ i1(t)
11703
+ ]), ll = (t, e) => {
11672
11704
  const i = tt(Math.max(0, ...e.filter((m) => m.samples.length > 0).map((m) => {
11673
11705
  const h = is(m.samples);
11674
11706
  return h.timestamp + h.duration;
@@ -11688,35 +11720,35 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11688
11720
  // Preferred volume
11689
11721
  Array(10).fill(0),
11690
11722
  // Reserved
11691
- In(vn),
11723
+ Vn(In),
11692
11724
  // Matrix
11693
11725
  Array(24).fill(0),
11694
11726
  // Pre-defined
11695
11727
  me(n)
11696
11728
  // Next track ID
11697
11729
  ]);
11698
- }, ll = (t, e) => {
11699
- const i = u1(t);
11700
- return Se("trak", void 0, [
11701
- ol(t, e),
11730
+ }, ol = (t, e) => {
11731
+ const i = h1(t);
11732
+ return Ge("trak", void 0, [
11702
11733
  cl(t, e),
11703
- i.name !== void 0 ? Se("udta", void 0, [
11704
- Se("name", [
11734
+ dl(t, e),
11735
+ i.name !== void 0 ? Ge("udta", void 0, [
11736
+ Ge("name", [
11705
11737
  ...$t.encode(i.name)
11706
11738
  ])
11707
11739
  ]) : null
11708
11740
  ]);
11709
- }, ol = (t, e) => {
11710
- var G;
11741
+ }, cl = (t, e) => {
11742
+ var S;
11711
11743
  const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, ji), d = !M0(e) || !M0(n), o = d ? V0 : me;
11712
11744
  let m;
11713
11745
  if (t.type === "video") {
11714
11746
  const W = t.track.metadata.rotation;
11715
- m = Sn(W ?? 0);
11747
+ m = vn(W ?? 0);
11716
11748
  } else
11717
- m = vn;
11749
+ m = In;
11718
11750
  let h = 2;
11719
- return ((G = t.track.metadata.disposition) == null ? void 0 : G.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
11751
+ return ((S = t.track.metadata.disposition) == null ? void 0 : S.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
11720
11752
  o(e),
11721
11753
  // Creation time
11722
11754
  o(e),
@@ -11729,26 +11761,26 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11729
11761
  // Duration
11730
11762
  Array(8).fill(0),
11731
11763
  // Reserved
11732
- Ge(0),
11764
+ Se(0),
11733
11765
  // Layer
11734
- Ge(t.track.id),
11766
+ Se(t.track.id),
11735
11767
  // Alternate group
11736
11768
  Gn(t.type === "audio" ? 1 : 0),
11737
11769
  // Volume
11738
- Ge(0),
11770
+ Se(0),
11739
11771
  // Reserved
11740
- In(m),
11772
+ Vn(m),
11741
11773
  // Matrix
11742
11774
  i0(t.type === "video" ? t.info.width : 0),
11743
11775
  // Track width
11744
11776
  i0(t.type === "video" ? t.info.height : 0)
11745
11777
  // Track height
11746
11778
  ]);
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) => {
11779
+ }, dl = (t, e) => Ge("mdia", void 0, [
11780
+ ml(t, e),
11781
+ ss(!0, ul[t.type], hl[t.type]),
11782
+ bl(t)
11783
+ ]), ml = (t, e) => {
11752
11784
  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
11785
  return Ye("mdhd", +d, 0, [
11754
11786
  o(e),
@@ -11759,16 +11791,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11759
11791
  // Timescale
11760
11792
  o(n),
11761
11793
  // Duration
11762
- Ge(Wn(t.track.metadata.languageCode ?? Ia)),
11794
+ Se(Ln(t.track.metadata.languageCode ?? Va)),
11763
11795
  // Language
11764
- Ge(0)
11796
+ Se(0)
11765
11797
  // Quality
11766
11798
  ]);
11767
- }, ml = {
11799
+ }, ul = {
11768
11800
  video: "vide",
11769
11801
  audio: "soun",
11770
11802
  subtitle: "text"
11771
- }, ul = {
11803
+ }, hl = {
11772
11804
  video: "MediabunnyVideoHandler",
11773
11805
  audio: "MediabunnySoundHandler",
11774
11806
  subtitle: "MediabunnyTextHandler"
@@ -11785,75 +11817,75 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11785
11817
  // Component flags mask
11786
11818
  at(i, !0)
11787
11819
  // Component name
11788
- ]), hl = (t) => Se("minf", void 0, [
11789
- fl[t.type](),
11790
- Zl(),
11820
+ ]), bl = (t) => Ge("minf", void 0, [
11821
+ Zl[t.type](),
11822
+ Xl(),
11791
11823
  Gl(t)
11792
- ]), bl = () => Ye("vmhd", 0, 1, [
11793
- Ge(0),
11824
+ ]), pl = () => Ye("vmhd", 0, 1, [
11825
+ Se(0),
11794
11826
  // Graphics mode
11795
- Ge(0),
11827
+ Se(0),
11796
11828
  // Opcolor R
11797
- Ge(0),
11829
+ Se(0),
11798
11830
  // Opcolor G
11799
- Ge(0)
11831
+ Se(0)
11800
11832
  // Opcolor B
11801
- ]), pl = () => Ye("smhd", 0, 0, [
11802
- Ge(0),
11833
+ ]), yl = () => Ye("smhd", 0, 0, [
11834
+ Se(0),
11803
11835
  // Balance
11804
- Ge(0)
11836
+ Se(0)
11805
11837
  // 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, [
11838
+ ]), fl = () => Ye("nmhd", 0, 0), Zl = {
11839
+ video: pl,
11840
+ audio: yl,
11841
+ subtitle: fl
11842
+ }, Xl = () => Ge("dinf", void 0, [
11843
+ _l()
11844
+ ]), _l = () => Ye("dref", 0, 0, [
11813
11845
  me(1)
11814
11846
  // Entry count
11815
11847
  ], [
11816
- _l()
11817
- ]), _l = () => Ye("url ", 0, 1), Gl = (t) => {
11848
+ Sl()
11849
+ ]), Sl = () => Ye("url ", 0, 1), Gl = (t) => {
11818
11850
  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,
11851
+ return Ge("stbl", void 0, [
11852
+ vl(t),
11853
+ kl(t),
11823
11854
  e ? Jl(t) : null,
11824
- Bl(t),
11855
+ e ? El(t) : null,
11825
11856
  Cl(t),
11826
11857
  gl(t),
11827
- kl(t)
11858
+ Fl(t),
11859
+ Bl(t)
11828
11860
  ]);
11829
- }, Sl = (t) => {
11861
+ }, vl = (t) => {
11830
11862
  let e;
11831
11863
  if (t.type === "video")
11832
- e = vl(r1(t.track.source._codec, t.info.decoderConfig.codec), t);
11864
+ e = Il(a1(t.track.source._codec, t.info.decoderConfig.codec), t);
11833
11865
  else if (t.type === "audio") {
11834
- 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
+ const i = Wn(t.track.source._codec, t.muxer.isQuickTime);
11867
+ ve(i), e = Ll(i, t);
11868
+ } else t.type === "subtitle" && (e = Kl(c1[t.track.source._codec], t));
11837
11869
  return ve(e), Ye("stsd", 0, 0, [
11838
11870
  me(1)
11839
11871
  // Entry count
11840
11872
  ], [
11841
11873
  e
11842
11874
  ]);
11843
- }, vl = (t, e) => Se(t, [
11875
+ }, Il = (t, e) => Ge(t, [
11844
11876
  Array(6).fill(0),
11845
11877
  // Reserved
11846
- Ge(1),
11878
+ Se(1),
11847
11879
  // Data reference index
11848
- Ge(0),
11880
+ Se(0),
11849
11881
  // Pre-defined
11850
- Ge(0),
11882
+ Se(0),
11851
11883
  // Reserved
11852
11884
  Array(12).fill(0),
11853
11885
  // Pre-defined
11854
- Ge(e.info.width),
11886
+ Se(e.info.width),
11855
11887
  // Width
11856
- Ge(e.info.height),
11888
+ Se(e.info.height),
11857
11889
  // Height
11858
11890
  me(4718592),
11859
11891
  // Horizontal resolution
@@ -11861,45 +11893,45 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11861
11893
  // Vertical resolution
11862
11894
  me(0),
11863
11895
  // Reserved
11864
- Ge(1),
11896
+ Se(1),
11865
11897
  // Frame count
11866
11898
  Array(32).fill(0),
11867
11899
  // Compressor name
11868
- Ge(24),
11900
+ Se(24),
11869
11901
  // Depth
11870
- Xn(65535)
11902
+ _n(65535)
11871
11903
  // Pre-defined
11872
11904
  ], [
11873
- a1[e.track.source._codec](e),
11874
- Ga(e.info.decoderConfig.colorSpace) ? Il(e) : null
11875
- ]), Il = (t) => Se("colr", [
11905
+ l1[e.track.source._codec](e),
11906
+ Ga(e.info.decoderConfig.colorSpace) ? Vl(e) : null
11907
+ ]), Vl = (t) => Ge("colr", [
11876
11908
  at("nclx"),
11877
11909
  // Colour type
11878
- Ge($i[t.info.decoderConfig.colorSpace.primaries]),
11910
+ Se($i[t.info.decoderConfig.colorSpace.primaries]),
11879
11911
  // Colour primaries
11880
- Ge(qi[t.info.decoderConfig.colorSpace.transfer]),
11912
+ Se(qi[t.info.decoderConfig.colorSpace.transfer]),
11881
11913
  // Transfer characteristics
11882
- Ge(es[t.info.decoderConfig.colorSpace.matrix]),
11914
+ Se(es[t.info.decoderConfig.colorSpace.matrix]),
11883
11915
  // Matrix coefficients
11884
11916
  Ue((t.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)
11885
11917
  // Full range flag
11886
- ]), Vl = (t) => t.info.decoderConfig && Se("avcC", [
11918
+ ]), Rl = (t) => t.info.decoderConfig && Ge("avcC", [
11887
11919
  // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here
11888
11920
  ...Q0(t.info.decoderConfig.description)
11889
- ]), Rl = (t) => t.info.decoderConfig && Se("hvcC", [
11921
+ ]), Tl = (t) => t.info.decoderConfig && Ge("hvcC", [
11890
11922
  // For HEVC, description is an HEVCDecoderConfigurationRecord, so nothing else to do here
11891
11923
  ...Q0(t.info.decoderConfig.description)
11892
11924
  ]), Ps = (t) => {
11893
11925
  var O, w, N, J;
11894
11926
  if (!t.info.decoderConfig)
11895
11927
  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;
11928
+ 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
11929
  return Ye("vpcC", 1, 0, [
11898
11930
  Ue(n),
11899
11931
  // Profile
11900
11932
  Ue(d),
11901
11933
  // Level
11902
- Ue(G),
11934
+ Ue(S),
11903
11935
  // Bit depth, chroma subsampling, full range
11904
11936
  Ue(W),
11905
11937
  // Colour primaries
@@ -11907,10 +11939,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11907
11939
  // Transfer characteristics
11908
11940
  Ue(Z),
11909
11941
  // Matrix coefficients
11910
- Ge(0)
11942
+ Se(0)
11911
11943
  // Codec initialization data size
11912
11944
  ]);
11913
- }, Tl = (t) => Se("av1C", Ha(t.info.decoderConfig.codec)), Wl = (t, e) => {
11945
+ }, Wl = (t) => Ge("av1C", Ya(t.info.decoderConfig.codec)), Ll = (t, e) => {
11914
11946
  var o;
11915
11947
  let i = 0, n, d = 16;
11916
11948
  if (k0.includes(e.track.source._codec)) {
@@ -11920,48 +11952,48 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11920
11952
  return i === 0 ? n = [
11921
11953
  Array(6).fill(0),
11922
11954
  // Reserved
11923
- Ge(1),
11955
+ Se(1),
11924
11956
  // Data reference index
11925
- Ge(i),
11957
+ Se(i),
11926
11958
  // Version
11927
- Ge(0),
11959
+ Se(0),
11928
11960
  // Revision level
11929
11961
  me(0),
11930
11962
  // Vendor
11931
- Ge(e.info.numberOfChannels),
11963
+ Se(e.info.numberOfChannels),
11932
11964
  // Number of channels
11933
- Ge(d),
11965
+ Se(d),
11934
11966
  // Sample size (bits)
11935
- Ge(0),
11967
+ Se(0),
11936
11968
  // Compression ID
11937
- Ge(0),
11969
+ Se(0),
11938
11970
  // Packet size
11939
- Ge(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11971
+ Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11940
11972
  // Sample rate (upper)
11941
- Ge(0)
11973
+ Se(0)
11942
11974
  // Sample rate (lower)
11943
11975
  ] : n = [
11944
11976
  Array(6).fill(0),
11945
11977
  // Reserved
11946
- Ge(1),
11978
+ Se(1),
11947
11979
  // Data reference index
11948
- Ge(i),
11980
+ Se(i),
11949
11981
  // Version
11950
- Ge(0),
11982
+ Se(0),
11951
11983
  // Revision level
11952
11984
  me(0),
11953
11985
  // Vendor
11954
- Ge(e.info.numberOfChannels),
11986
+ Se(e.info.numberOfChannels),
11955
11987
  // Number of channels
11956
- Ge(Math.min(d, 16)),
11988
+ Se(Math.min(d, 16)),
11957
11989
  // Sample size (bits)
11958
- Ge(0),
11990
+ Se(0),
11959
11991
  // Compression ID
11960
- Ge(0),
11992
+ Se(0),
11961
11993
  // Packet size
11962
- Ge(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11994
+ Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
11963
11995
  // Sample rate (upper)
11964
- Ge(0),
11996
+ Se(0),
11965
11997
  // Sample rate (lower)
11966
11998
  me(1),
11967
11999
  // Samples per packet (must be 1 for uncompressed formats)
@@ -11971,8 +12003,8 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11971
12003
  // Bytes per frame
11972
12004
  me(2)
11973
12005
  // 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
12006
+ ], Ge(t, n, [
12007
+ ((o = o1(e.track.source._codec, e.muxer.isQuickTime)) == null ? void 0 : o(e)) ?? null
11976
12008
  ]);
11977
12009
  }, Ni = (t) => {
11978
12010
  let e;
@@ -11994,7 +12026,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
11994
12026
  // Object type indication
11995
12027
  ...Ue(21),
11996
12028
  // stream type(6bits)=5 audio, flags(2bits)=1
11997
- ..._n(0),
12029
+ ...Sn(0),
11998
12030
  // 24bit buffer size
11999
12031
  ...me(0),
12000
12032
  // max bitrate
@@ -12012,7 +12044,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12012
12044
  ];
12013
12045
  }
12014
12046
  return i = [
12015
- ...Ge(1),
12047
+ ...Se(1),
12016
12048
  // ES_ID = 1
12017
12049
  ...Ue(0),
12018
12050
  // flags etc = 0
@@ -12032,43 +12064,43 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12032
12064
  ...Ei(i.length),
12033
12065
  ...i
12034
12066
  ], Ye("esds", 0, 0, i);
12035
- }, c0 = (t) => Se("wave", void 0, [
12036
- Ll(t),
12067
+ }, c0 = (t) => Ge("wave", void 0, [
12037
12068
  xl(t),
12038
- Se("\0\0\0\0")
12069
+ Hl(t),
12070
+ Ge("\0\0\0\0")
12039
12071
  // NULL tag at the end
12040
- ]), Ll = (t) => Se("frma", [
12041
- at(Tn(t.track.source._codec, t.muxer.isQuickTime))
12042
- ]), xl = (t) => {
12072
+ ]), xl = (t) => Ge("frma", [
12073
+ at(Wn(t.track.source._codec, t.muxer.isQuickTime))
12074
+ ]), Hl = (t) => {
12043
12075
  const { littleEndian: e } = D0(t.track.source._codec);
12044
- return Se("enda", [
12045
- Ge(+e)
12076
+ return Ge("enda", [
12077
+ Se(+e)
12046
12078
  ]);
12047
- }, Hl = (t) => {
12048
- var G;
12079
+ }, Yl = (t) => {
12080
+ var S;
12049
12081
  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;
12082
+ const h = (S = t.info.decoderConfig) == null ? void 0 : S.description;
12051
12083
  if (h) {
12052
12084
  ve(h.byteLength >= 18);
12053
- const W = Q0(h), v = tl(W);
12085
+ const W = Q0(h), v = il(W);
12054
12086
  e = v.outputChannelCount, i = v.preSkip, n = v.inputSampleRate, d = v.outputGain, o = v.channelMappingFamily, v.channelMappingTable && (m = v.channelMappingTable);
12055
12087
  }
12056
- return Se("dOps", [
12088
+ return Ge("dOps", [
12057
12089
  Ue(0),
12058
12090
  // Version
12059
12091
  Ue(e),
12060
12092
  // OutputChannelCount
12061
- Ge(i),
12093
+ Se(i),
12062
12094
  // PreSkip
12063
12095
  me(n),
12064
12096
  // InputSampleRate
12065
- Xn(d),
12097
+ _n(d),
12066
12098
  // OutputGain
12067
12099
  Ue(o),
12068
12100
  // ChannelMappingFamily
12069
12101
  ...m
12070
12102
  ]);
12071
- }, Yl = (t) => {
12103
+ }, wl = (t) => {
12072
12104
  var n;
12073
12105
  const e = (n = t.info.decoderConfig) == null ? void 0 : n.description;
12074
12106
  ve(e);
@@ -12082,16 +12114,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12082
12114
  Ue(n),
12083
12115
  Ue(8 * i)
12084
12116
  ]);
12085
- }, wl = (t, e) => Se(t, [
12117
+ }, Kl = (t, e) => Ge(t, [
12086
12118
  Array(6).fill(0),
12087
12119
  // Reserved
12088
- Ge(1)
12120
+ Se(1)
12089
12121
  // Data reference index
12090
12122
  ], [
12091
- c1[e.track.source._codec](e)
12092
- ]), Kl = (t) => Se("vttC", [
12123
+ d1[e.track.source._codec](e)
12124
+ ]), Ml = (t) => Ge("vttC", [
12093
12125
  ...$t.encode(t.info.config.description)
12094
- ]), Ml = (t) => Ye("stts", 0, 0, [
12126
+ ]), kl = (t) => Ye("stts", 0, 0, [
12095
12127
  me(t.timeToSampleTable.length),
12096
12128
  // Number of entries
12097
12129
  t.timeToSampleTable.map((e) => [
@@ -12100,7 +12132,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12100
12132
  me(e.sampleDelta)
12101
12133
  // Sample duration
12102
12134
  ])
12103
- ]), kl = (t) => {
12135
+ ]), Bl = (t) => {
12104
12136
  if (t.samples.every((i) => i.type === "key"))
12105
12137
  return null;
12106
12138
  const e = [...t.samples.entries()].filter(([, i]) => i.type === "key");
@@ -12110,7 +12142,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12110
12142
  e.map(([i]) => me(i + 1))
12111
12143
  // Sync sample table
12112
12144
  ]);
12113
- }, Bl = (t) => Ye("stsc", 0, 0, [
12145
+ }, Cl = (t) => Ye("stsc", 0, 0, [
12114
12146
  me(t.compactlyCodedChunkTable.length),
12115
12147
  // Number of entries
12116
12148
  t.compactlyCodedChunkTable.map((e) => [
@@ -12121,7 +12153,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12121
12153
  me(1)
12122
12154
  // Sample description index
12123
12155
  ])
12124
- ]), Cl = (t) => {
12156
+ ]), gl = (t) => {
12125
12157
  if (t.type === "audio" && t.info.requiresPcmTransformation) {
12126
12158
  const { sampleSize: e } = D0(t.track.source._codec);
12127
12159
  return Ye("stsz", 0, 0, [
@@ -12138,7 +12170,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12138
12170
  t.samples.map((e) => me(e.size))
12139
12171
  // Sample size table
12140
12172
  ]);
12141
- }, gl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
12173
+ }, Fl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
12142
12174
  me(t.finalizedChunks.length),
12143
12175
  // Number of entries
12144
12176
  t.finalizedChunks.map((e) => V0(e.offset))
@@ -12148,7 +12180,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12148
12180
  // Number of entries
12149
12181
  t.finalizedChunks.map((e) => me(e.offset))
12150
12182
  // Chunk offset table
12151
- ]), Fl = (t) => Ye("ctts", 1, 0, [
12183
+ ]), Jl = (t) => Ye("ctts", 1, 0, [
12152
12184
  me(t.compositionTimeOffsetTable.length),
12153
12185
  // Number of entries
12154
12186
  t.compositionTimeOffsetTable.map((e) => [
@@ -12157,7 +12189,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12157
12189
  d0(e.sampleCompositionTimeOffset)
12158
12190
  // Sample offset
12159
12191
  ])
12160
- ]), Jl = (t) => {
12192
+ ]), El = (t) => {
12161
12193
  let e = 1 / 0, i = -1 / 0, n = 1 / 0, d = -1 / 0;
12162
12194
  ve(t.compositionTimeOffsetTable.length > 0), ve(t.samples.length > 0);
12163
12195
  for (let m = 0; m < t.compositionTimeOffsetTable.length; m++) {
@@ -12181,7 +12213,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12181
12213
  d0(d)
12182
12214
  // Composition end time
12183
12215
  ]);
12184
- }, El = (t) => Se("mvex", void 0, t.map(Nl)), Nl = (t) => Ye("trex", 0, 0, [
12216
+ }, Nl = (t) => Ge("mvex", void 0, t.map(Pl)), Pl = (t) => Ye("trex", 0, 0, [
12185
12217
  me(t.track.id),
12186
12218
  // Track ID
12187
12219
  me(1),
@@ -12192,28 +12224,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12192
12224
  // Default sample size
12193
12225
  me(0)
12194
12226
  // 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, [
12227
+ ]), Us = (t, e) => Ge("moof", void 0, [
12228
+ Ul(t),
12229
+ ...e.map(zl)
12230
+ ]), Ul = (t) => Ye("mfhd", 0, 0, [
12199
12231
  me(t)
12200
12232
  // Sequence number
12201
- ]), Vn = (t) => {
12233
+ ]), Rn = (t) => {
12202
12234
  let e = 0, i = 0;
12203
12235
  const n = 0, d = 0, o = t.type === "delta";
12204
12236
  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),
12237
+ }, zl = (t) => Ge("traf", void 0, [
12207
12238
  Al(t),
12208
- Ol(t)
12209
- ]), zl = (t) => {
12239
+ Ol(t),
12240
+ jl(t)
12241
+ ]), Al = (t) => {
12210
12242
  ve(t.currentChunk);
12211
12243
  let e = 0;
12212
12244
  e |= 8, e |= 16, e |= 32, e |= 131072;
12213
12245
  const i = t.currentChunk.samples[1] ?? t.currentChunk.samples[0], n = {
12214
12246
  duration: i.timescaleUnitsToNextSample,
12215
12247
  size: i.size,
12216
- flags: Vn(i)
12248
+ flags: Rn(i)
12217
12249
  };
12218
12250
  return Ye("tfhd", 0, e, [
12219
12251
  me(t.track.id),
@@ -12225,12 +12257,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12225
12257
  me(n.flags)
12226
12258
  // Default sample flags
12227
12259
  ]);
12228
- }, Al = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
12260
+ }, Ol = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
12229
12261
  V0(tt(t.currentChunk.startTimestamp, t.timescale))
12230
12262
  // Base Media Decode Time
12231
- ])), Ol = (t) => {
12263
+ ])), jl = (t) => {
12232
12264
  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);
12265
+ const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Rn), 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
12266
  let N = 0;
12235
12267
  return N |= 1, N |= 4 * +W, N |= 256 * +v, N |= 512 * +Z, N |= 1024 * +O, N |= 2048 * +w, Ye("trun", 1, N, [
12236
12268
  me(t.currentChunk.samples.length),
@@ -12249,10 +12281,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12249
12281
  w ? d0(d[U]) : []
12250
12282
  ])
12251
12283
  ]);
12252
- }, jl = (t) => Se("mfra", void 0, [
12253
- ...t.map(Ql),
12254
- Dl()
12255
- ]), Ql = (t, e) => Ye("tfra", 1, 0, [
12284
+ }, Ql = (t) => Ge("mfra", void 0, [
12285
+ ...t.map(Dl),
12286
+ $l()
12287
+ ]), Dl = (t, e) => Ye("tfra", 1, 0, [
12256
12288
  me(t.track.id),
12257
12289
  // Track ID
12258
12290
  me(63),
@@ -12271,29 +12303,29 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12271
12303
  me(1)
12272
12304
  // Sample number
12273
12305
  ])
12274
- ]), Dl = () => Ye("mfro", 0, 0, [
12306
+ ]), $l = () => Ye("mfro", 0, 0, [
12275
12307
  // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box
12276
12308
  // is known
12277
12309
  me(0)
12278
12310
  // 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) => {
12311
+ ]), ql = () => Ge("vtte"), e1 = (t, e, i, n, d) => Ge("vttc", void 0, [
12312
+ d !== null ? Ge("vsid", [d0(d)]) : null,
12313
+ i !== null ? Ge("iden", [...$t.encode(i)]) : null,
12314
+ e !== null ? Ge("ctim", [...$t.encode(nl(e))]) : null,
12315
+ n !== null ? Ge("sttg", [...$t.encode(n)]) : null,
12316
+ Ge("payl", [...$t.encode(t)])
12317
+ ]), t1 = (t) => Ge("vtta", [...$t.encode(t)]), i1 = (t) => {
12286
12318
  const e = [], i = t.format._options.metadataFormat ?? "auto", n = t.output._metadataTags;
12287
12319
  if (i === "mdir" || i === "auto" && !t.isQuickTime) {
12288
- const d = s1(n);
12320
+ const d = n1(n);
12289
12321
  d && e.push(d);
12290
12322
  } else if (i === "mdta") {
12291
- const d = n1(n);
12323
+ const d = r1(n);
12292
12324
  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) => {
12296
- for (const { key: i, value: n } of yn(e))
12325
+ } else (i === "udta" || i === "auto" && t.isQuickTime) && s1(e, t.output._metadataTags);
12326
+ return e.length === 0 ? null : Ge("udta", void 0, e);
12327
+ }, s1 = (t, e) => {
12328
+ for (const { key: i, value: n } of fn(e))
12297
12329
  switch (i) {
12298
12330
  case "title":
12299
12331
  t.push(Qt("©nam", n));
@@ -12331,27 +12363,27 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12331
12363
  case "images":
12332
12364
  break;
12333
12365
  default:
12334
- pn(i);
12366
+ yn(i);
12335
12367
  }
12336
12368
  if (e.raw)
12337
12369
  for (const i in e.raw) {
12338
12370
  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))));
12371
+ 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
12372
  }
12341
12373
  }, Qt = (t, e) => {
12342
12374
  const i = $t.encode(e);
12343
- return Se(t, [
12344
- Ge(i.length),
12345
- Ge(Wn("und")),
12375
+ return Ge(t, [
12376
+ Se(i.length),
12377
+ Se(Ln("und")),
12346
12378
  Array.from(i)
12347
12379
  ]);
12348
12380
  }, zs = {
12349
12381
  "image/jpeg": 13,
12350
12382
  "image/png": 14,
12351
12383
  "image/bmp": 27
12352
- }, Rn = (t, e) => {
12384
+ }, Tn = (t, e) => {
12353
12385
  const i = [];
12354
- for (const { key: n, value: d } of yn(t))
12386
+ for (const { key: n, value: d } of fn(t))
12355
12387
  switch (n) {
12356
12388
  case "title":
12357
12389
  i.push({ key: e ? "title" : "©nam", value: Pt(d) });
@@ -12385,7 +12417,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12385
12417
  break;
12386
12418
  case "images":
12387
12419
  for (const o of d)
12388
- o.kind === "coverFront" && i.push({ key: "covr", value: Se("data", [
12420
+ o.kind === "coverFront" && i.push({ key: "covr", value: Ge("data", [
12389
12421
  me(zs[o.mimeType] ?? 0),
12390
12422
  // Type indicator
12391
12423
  me(0),
@@ -12399,28 +12431,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12399
12431
  const o = t.tracksTotal !== void 0 ? `${d}/${t.tracksTotal}` : d.toString();
12400
12432
  i.push({ key: "track", value: Pt(o) });
12401
12433
  } else
12402
- i.push({ key: "trkn", value: Se("data", [
12434
+ i.push({ key: "trkn", value: Ge("data", [
12403
12435
  me(0),
12404
12436
  // 8 bytes empty
12405
12437
  me(0),
12406
- Ge(0),
12438
+ Se(0),
12407
12439
  // Empty
12408
- Ge(d),
12409
- Ge(t.tracksTotal ?? 0),
12410
- Ge(0)
12440
+ Se(d),
12441
+ Se(t.tracksTotal ?? 0),
12442
+ Se(0)
12411
12443
  // Empty
12412
12444
  ]) });
12413
12445
  break;
12414
12446
  case "discNumber":
12415
- e || i.push({ key: "disc", value: Se("data", [
12447
+ e || i.push({ key: "disc", value: Ge("data", [
12416
12448
  me(0),
12417
12449
  // 8 bytes empty
12418
12450
  me(0),
12419
- Ge(0),
12451
+ Se(0),
12420
12452
  // Empty
12421
- Ge(d),
12422
- Ge(t.discsTotal ?? 0),
12423
- Ge(0)
12453
+ Se(d),
12454
+ Se(t.discsTotal ?? 0),
12455
+ Se(0)
12424
12456
  // Empty
12425
12457
  ]) });
12426
12458
  break;
@@ -12430,18 +12462,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12430
12462
  case "raw":
12431
12463
  break;
12432
12464
  default:
12433
- pn(n);
12465
+ yn(n);
12434
12466
  }
12435
12467
  if (t.raw)
12436
12468
  for (const n in t.raw) {
12437
12469
  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", [
12470
+ 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
12471
  me(0),
12440
12472
  // Type indicator
12441
12473
  me(0),
12442
12474
  // Locale indicator
12443
12475
  Array.from(d)
12444
- ]) }) : d instanceof fn && i.push({ key: n, value: Se("data", [
12476
+ ]) }) : d instanceof Zn && i.push({ key: n, value: Ge("data", [
12445
12477
  me(zs[d.mimeType] ?? 0),
12446
12478
  // Type indicator
12447
12479
  me(0),
@@ -12451,36 +12483,36 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12451
12483
  ]) }));
12452
12484
  }
12453
12485
  return i;
12454
- }, s1 = (t) => {
12455
- const e = Rn(t, !1);
12486
+ }, n1 = (t) => {
12487
+ const e = Tn(t, !1);
12456
12488
  return e.length === 0 ? null : Ye("meta", 0, 0, void 0, [
12457
12489
  ss(!1, "mdir", "", "appl"),
12458
12490
  // mdir handler
12459
- Se("ilst", void 0, e.map((i) => Se(i.key, void 0, [i.value])))
12491
+ Ge("ilst", void 0, e.map((i) => Ge(i.key, void 0, [i.value])))
12460
12492
  // Item list without keys box
12461
12493
  ]);
12462
- }, n1 = (t) => {
12463
- const e = Rn(t, !0);
12464
- return e.length === 0 ? null : Se("meta", void 0, [
12494
+ }, r1 = (t) => {
12495
+ const e = Tn(t, !0);
12496
+ return e.length === 0 ? null : Ge("meta", void 0, [
12465
12497
  ss(!1, "mdta", ""),
12466
12498
  // mdta handler
12467
12499
  Ye("keys", 0, 0, [
12468
12500
  me(e.length)
12469
- ], e.map((i) => Se("mdta", [
12501
+ ], e.map((i) => Ge("mdta", [
12470
12502
  ...$t.encode(i.key)
12471
12503
  ]))),
12472
- Se("ilst", void 0, e.map((i, n) => {
12504
+ Ge("ilst", void 0, e.map((i, n) => {
12473
12505
  const d = String.fromCharCode(...me(n + 1));
12474
- return Se(d, void 0, [i.value]);
12506
+ return Ge(d, void 0, [i.value]);
12475
12507
  }))
12476
12508
  ]);
12477
- }, Pt = (t) => Se("data", [
12509
+ }, Pt = (t) => Ge("data", [
12478
12510
  me(1),
12479
12511
  // Type indicator (UTF-8)
12480
12512
  me(0),
12481
12513
  // Locale indicator
12482
12514
  ...$t.encode(t)
12483
- ]), r1 = (t, e) => {
12515
+ ]), a1 = (t, e) => {
12484
12516
  switch (t) {
12485
12517
  case "avc":
12486
12518
  return e.startsWith("avc3") ? "avc3" : "avc1";
@@ -12493,13 +12525,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12493
12525
  case "av1":
12494
12526
  return "av01";
12495
12527
  }
12496
- }, a1 = {
12497
- avc: Vl,
12498
- hevc: Rl,
12528
+ }, l1 = {
12529
+ avc: Rl,
12530
+ hevc: Tl,
12499
12531
  vp8: Ps,
12500
12532
  vp9: Ps,
12501
- av1: Tl
12502
- }, Tn = (t, e) => {
12533
+ av1: Wl
12534
+ }, Wn = (t, e) => {
12503
12535
  switch (t) {
12504
12536
  case "aac":
12505
12537
  return "mp4a";
@@ -12566,18 +12598,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12566
12598
  case "pcm-f64be":
12567
12599
  return "fpcm";
12568
12600
  }
12569
- }, l1 = (t, e) => {
12601
+ }, o1 = (t, e) => {
12570
12602
  switch (t) {
12571
12603
  case "aac":
12572
12604
  return Ni;
12573
12605
  case "mp3":
12574
12606
  return Ni;
12575
12607
  case "opus":
12576
- return Hl;
12608
+ return Yl;
12577
12609
  case "vorbis":
12578
12610
  return Ni;
12579
12611
  case "flac":
12580
- return Yl;
12612
+ return wl;
12581
12613
  }
12582
12614
  if (e)
12583
12615
  switch (t) {
@@ -12622,11 +12654,11 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12622
12654
  return jt;
12623
12655
  }
12624
12656
  return null;
12625
- }, o1 = {
12626
- webvtt: "wvtt"
12627
12657
  }, c1 = {
12628
- webvtt: Kl
12629
- }, Wn = (t) => {
12658
+ webvtt: "wvtt"
12659
+ }, d1 = {
12660
+ webvtt: Ml
12661
+ }, Ln = (t) => {
12630
12662
  ve(t.length === 3);
12631
12663
  let e = 0;
12632
12664
  for (let i = 0; i < 3; i++)
@@ -12640,7 +12672,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
12640
12672
  * License, v. 2.0. If a copy of the MPL was not distributed with this
12641
12673
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
12642
12674
  */
12643
- class d1 {
12675
+ class m1 {
12644
12676
  constructor() {
12645
12677
  this.ensureMonotonicity = !1, this.trackedWrites = null, this.trackedStart = -1, this.trackedEnd = -1;
12646
12678
  }
@@ -12680,7 +12712,7 @@ class d1 {
12680
12712
  }
12681
12713
  }
12682
12714
  const Pi = 2 ** 16, Ui = 2 ** 32;
12683
- class Ln extends d1 {
12715
+ class xn extends m1 {
12684
12716
  constructor(e) {
12685
12717
  if (super(), this.pos = 0, this.maxPos = 0, this.target = e, this.supportsResize = "resize" in new ArrayBuffer(0), this.supportsResize)
12686
12718
  try {
@@ -12735,18 +12767,18 @@ class Ln extends d1 {
12735
12767
  * License, v. 2.0. If a copy of the MPL was not distributed with this
12736
12768
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
12737
12769
  */
12738
- class xn {
12770
+ class Hn {
12739
12771
  constructor() {
12740
12772
  this._output = null, this.onwrite = null;
12741
12773
  }
12742
12774
  }
12743
- class Hn extends xn {
12775
+ class Yn extends Hn {
12744
12776
  constructor() {
12745
12777
  super(...arguments), this.buffer = null;
12746
12778
  }
12747
12779
  /** @internal */
12748
12780
  _createWriter() {
12749
- return new Ln(this);
12781
+ return new xn(this);
12750
12782
  }
12751
12783
  }
12752
12784
  /*!
@@ -12756,22 +12788,22 @@ class Hn extends xn {
12756
12788
  * License, v. 2.0. If a copy of the MPL was not distributed with this
12757
12789
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
12758
12790
  */
12759
- const ji = 1e3, m1 = 2082844800, u1 = (t) => {
12791
+ const ji = 1e3, u1 = 2082844800, h1 = (t) => {
12760
12792
  const e = {}, i = t.track;
12761
12793
  return i.metadata.name !== void 0 && (e.name = i.metadata.name), e;
12762
12794
  }, tt = (t, e, i = !0) => {
12763
12795
  const n = t * e;
12764
12796
  return i ? Math.round(n) : n;
12765
12797
  };
12766
- class h1 extends Ea {
12798
+ class b1 extends Na {
12767
12799
  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;
12769
- const n = this.writer instanceof Ln ? "in-memory" : !1;
12800
+ super(e), this.auxTarget = new Yn(), 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 kn;
12801
+ const n = this.writer instanceof xn ? "in-memory" : !1;
12770
12802
  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
12803
  }
12772
12804
  async start() {
12773
12805
  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({
12806
+ if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(rl({
12775
12807
  isQuickTime: this.isQuickTime,
12776
12808
  holdsAvc: i,
12777
12809
  fragmented: this.isFragmented
@@ -12797,7 +12829,7 @@ class h1 extends Ea {
12797
12829
  const e = this.trackDatas.map((i) => i.type === "video" || i.type === "audio" ? i.info.decoderConfig.codec : {
12798
12830
  webvtt: "wvtt"
12799
12831
  }[i.track.source._codec]);
12800
- return il({
12832
+ return sl({
12801
12833
  isQuickTime: this.isQuickTime,
12802
12834
  hasVideo: this.trackDatas.some((i) => i.type === "video"),
12803
12835
  hasAudio: this.trackDatas.some((i) => i.type === "audio"),
@@ -12808,22 +12840,22 @@ class h1 extends Ea {
12808
12840
  const d = this.trackDatas.find((W) => W.track === e);
12809
12841
  if (d)
12810
12842
  return d;
12811
- Ca(n), ve(n), ve(n.decoderConfig);
12843
+ ga(n), ve(n), ve(n.decoderConfig);
12812
12844
  const o = { ...n.decoderConfig };
12813
12845
  ve(o.codedWidth !== void 0), ve(o.codedHeight !== void 0);
12814
12846
  let m = !1;
12815
12847
  if (e.source._codec === "avc" && !o.description) {
12816
- const W = Pa(i.data);
12848
+ const W = Ua(i.data);
12817
12849
  if (!W)
12818
12850
  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;
12851
+ o.description = za(W), m = !0;
12820
12852
  } else if (e.source._codec === "hevc" && !o.description) {
12821
- const W = Aa(i.data);
12853
+ const W = Oa(i.data);
12822
12854
  if (!W)
12823
12855
  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;
12856
+ o.description = tl(W), m = !0;
12825
12857
  }
12826
- const h = Ta(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, G = {
12858
+ const h = Wa(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, S = {
12827
12859
  muxer: this,
12828
12860
  track: e,
12829
12861
  type: "video",
@@ -12845,13 +12877,13 @@ class h1 extends Ea {
12845
12877
  currentChunk: null,
12846
12878
  compactlyCodedChunkTable: []
12847
12879
  };
12848
- return this.trackDatas.push(G), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), G;
12880
+ return this.trackDatas.push(S), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), S;
12849
12881
  }
12850
12882
  getAudioTrackData(e, i) {
12851
12883
  const n = this.trackDatas.find((o) => o.track === e);
12852
12884
  if (n)
12853
12885
  return n;
12854
- Fa(i), ve(i), ve(i.decoderConfig);
12886
+ Ja(i), ve(i), ve(i.decoderConfig);
12855
12887
  const d = {
12856
12888
  muxer: this,
12857
12889
  track: e,
@@ -12880,7 +12912,7 @@ class h1 extends Ea {
12880
12912
  const n = this.trackDatas.find((o) => o.track === e);
12881
12913
  if (n)
12882
12914
  return n;
12883
- Ja(i), ve(i), ve(i.config);
12915
+ Ea(i), ve(i), ve(i.config);
12884
12916
  const d = {
12885
12917
  muxer: this,
12886
12918
  track: e,
@@ -12916,10 +12948,10 @@ class h1 extends Ea {
12916
12948
  const W = ts(m);
12917
12949
  if (W.length === 0)
12918
12950
  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);
12951
+ m = Pa(W, 4);
12920
12952
  }
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);
12953
+ const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"), S = this.createSampleForTrack(o, m, h, i.duration, i.type);
12954
+ await this.registerSample(o, S);
12923
12955
  } finally {
12924
12956
  d();
12925
12957
  }
@@ -12936,7 +12968,7 @@ class h1 extends Ea {
12936
12968
  async maybePadWithSilence(e, i) {
12937
12969
  const n = Y0(e.samples), d = n ? n.timestamp + n.duration : 0, o = i - d, m = tt(o, e.timescale);
12938
12970
  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");
12971
+ 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
12972
  await this.registerSample(e, Z);
12941
12973
  }
12942
12974
  }
@@ -12959,7 +12991,7 @@ class h1 extends Ea {
12959
12991
  break;
12960
12992
  if (e.lastCueEndTimestamp < o) {
12961
12993
  this.auxWriter.seek(0);
12962
- const W = $l();
12994
+ const W = ql();
12963
12995
  this.auxBoxWriter.writeBox(W);
12964
12996
  const v = this.auxWriter.getSlice(0, this.auxWriter.getPos()), Z = this.createSampleForTrack(e, v, e.lastCueEndTimestamp, o - e.lastCueEndTimestamp, "key");
12965
12997
  await this.registerSample(e, Z), e.lastCueEndTimestamp = o;
@@ -12973,14 +13005,14 @@ class h1 extends Ea {
12973
13005
  const Z = Es.test(v.text), O = v.timestamp + v.duration;
12974
13006
  let w = e.cueToSourceId.get(v);
12975
13007
  if (w === void 0 && m < O && (w = e.nextSourceId++, e.cueToSourceId.set(v, w)), v.notes) {
12976
- const J = e1(v.notes);
13008
+ const J = t1(v.notes);
12977
13009
  this.auxBoxWriter.writeBox(J);
12978
13010
  }
12979
- const N = ql(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
13011
+ const N = e1(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
12980
13012
  this.auxBoxWriter.writeBox(N), O === m && e.cueQueue.splice(W--, 1);
12981
13013
  }
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;
13014
+ const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()), S = this.createSampleForTrack(e, h, o, m - o, "key");
13015
+ await this.registerSample(e, S), e.lastCueEndTimestamp = m;
12984
13016
  }
12985
13017
  }
12986
13018
  createSampleForTrack(e, i, n, d, o) {
@@ -13024,7 +13056,7 @@ class h1 extends Ea {
13024
13056
  const m = tt(o.timestamp - o.decodeTimestamp, e.timescale), h = tt(o.duration, e.timescale);
13025
13057
  if (e.lastTimescaleUnits !== null) {
13026
13058
  ve(e.lastSample);
13027
- const G = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(G - e.lastTimescaleUnits);
13059
+ const S = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(S - e.lastTimescaleUnits);
13028
13060
  if (ve(W >= 0), e.lastTimescaleUnits += W, e.lastSample.timescaleUnitsToNextSample = W, !this.isFragmented) {
13029
13061
  let v = Y0(e.timeToSampleTable);
13030
13062
  if (ve(v), v.sampleCount === 1) {
@@ -13139,12 +13171,12 @@ class h1 extends Ea {
13139
13171
  }
13140
13172
  }
13141
13173
  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;
13174
+ let h = m + Fi, S = 1 / 0;
13143
13175
  for (const w of n) {
13144
13176
  w.currentChunk.offset = h, w.currentChunk.moofOffset = o;
13145
13177
  for (const N of w.currentChunk.samples)
13146
13178
  h += N.size;
13147
- G = Math.min(G, w.currentChunk.startTimestamp);
13179
+ S = Math.min(S, w.currentChunk.startTimestamp);
13148
13180
  }
13149
13181
  const W = h - m, v = W >= 2 ** 32;
13150
13182
  if (v)
@@ -13154,7 +13186,7 @@ class h1 extends Ea {
13154
13186
  const Z = Us(i, n);
13155
13187
  if (this.boxWriter.writeBox(Z), this.format._options.onMoof) {
13156
13188
  const { data: w, start: N } = this.writer.stopTrackingWrites();
13157
- this.format._options.onMoof(w, N, G);
13189
+ this.format._options.onMoof(w, N, S);
13158
13190
  }
13159
13191
  ve(this.writer.getPos() === m), this.format._options.onMdat && this.writer.startTrackingWrites();
13160
13192
  const O = ci(v);
@@ -13224,9 +13256,9 @@ class h1 extends Ea {
13224
13256
  const o = U0(this), m = this.boxWriter.measureBox(o);
13225
13257
  i = this.boxWriter.measureBox(this.mdat);
13226
13258
  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)
13259
+ for (const S of this.finalizedChunks) {
13260
+ S.offset = h;
13261
+ for (const { data: W } of S.samples)
13230
13262
  ve(W), h += W.byteLength, i += W.byteLength;
13231
13263
  }
13232
13264
  if (h < 2 ** 32)
@@ -13248,7 +13280,7 @@ class h1 extends Ea {
13248
13280
  this.format._options.onMdat(d, o);
13249
13281
  }
13250
13282
  } else if (this.isFragmented) {
13251
- const i = this.writer.getPos(), n = jl(this.trackDatas);
13283
+ const i = this.writer.getPos(), n = Ql(this.trackDatas);
13252
13284
  this.boxWriter.writeBox(n);
13253
13285
  const d = this.writer.getPos() - i;
13254
13286
  this.writer.seek(this.writer.getPos() - 4), this.boxWriter.writeU32(d);
@@ -13265,7 +13297,7 @@ class h1 extends Ea {
13265
13297
  if (this.fastStart === "reserve") {
13266
13298
  ve(this.ftypSize !== null), this.writer.seek(this.ftypSize), this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
13267
13299
  const o = this.boxWriter.offsets.get(this.mdat) - this.writer.getPos();
13268
- this.boxWriter.writeBox(rl(o));
13300
+ this.boxWriter.writeBox(al(o));
13269
13301
  } else
13270
13302
  this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
13271
13303
  if (this.format._options.onMoov) {
@@ -13283,7 +13315,7 @@ class h1 extends Ea {
13283
13315
  * License, v. 2.0. If a copy of the MPL was not distributed with this
13284
13316
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
13285
13317
  */
13286
- class Yn {
13318
+ class wn {
13287
13319
  /** Returns a list of video codecs that this output format can contain. */
13288
13320
  getSupportedVideoCodecs() {
13289
13321
  return this.getSupportedCodecs().filter((e) => O0.includes(e));
@@ -13302,7 +13334,7 @@ class Yn {
13302
13334
  return "";
13303
13335
  }
13304
13336
  }
13305
- class wn extends Yn {
13337
+ class Kn extends wn {
13306
13338
  /** Internal constructor. */
13307
13339
  constructor(e = {}) {
13308
13340
  if (!e || typeof e != "object")
@@ -13337,10 +13369,10 @@ class wn extends Yn {
13337
13369
  }
13338
13370
  /** @internal */
13339
13371
  _createMuxer(e) {
13340
- return new h1(e, this);
13372
+ return new b1(e, this);
13341
13373
  }
13342
13374
  }
13343
- class Kn extends wn {
13375
+ class Mn extends Kn {
13344
13376
  /** Creates a new {@link Mp4OutputFormat} configured with the specified `options`. */
13345
13377
  constructor(e) {
13346
13378
  super(e);
@@ -13358,7 +13390,7 @@ class Kn extends wn {
13358
13390
  getSupportedCodecs() {
13359
13391
  return [
13360
13392
  ...O0,
13361
- ...Zn,
13393
+ ...Xn,
13362
13394
  // These are supported via ISO/IEC 23003-5
13363
13395
  "pcm-s16",
13364
13396
  "pcm-s16be",
@@ -13375,10 +13407,10 @@ class Kn extends wn {
13375
13407
  }
13376
13408
  /** @internal */
13377
13409
  _codecUnsupportedHint(e) {
13378
- return new Mn().getSupportedCodecs().includes(e) ? " Switching to MOV will grant support for this codec." : "";
13410
+ return new kn().getSupportedCodecs().includes(e) ? " Switching to MOV will grant support for this codec." : "";
13379
13411
  }
13380
13412
  }
13381
- class Mn extends wn {
13413
+ class kn extends Kn {
13382
13414
  /** Creates a new {@link MovOutputFormat} configured with the specified `options`. */
13383
13415
  constructor(e) {
13384
13416
  super(e);
@@ -13401,7 +13433,7 @@ class Mn extends wn {
13401
13433
  }
13402
13434
  /** @internal */
13403
13435
  _codecUnsupportedHint(e) {
13404
- return new Kn().getSupportedCodecs().includes(e) ? " Switching to MP4 will grant support for this codec." : "";
13436
+ return new Mn().getSupportedCodecs().includes(e) ? " Switching to MP4 will grant support for this codec." : "";
13405
13437
  }
13406
13438
  }
13407
13439
  /*!
@@ -13457,7 +13489,7 @@ class ns {
13457
13489
  return this._closingPromise ? this._closingPromise : this._flushAndClose(e);
13458
13490
  }
13459
13491
  }
13460
- class kn extends ns {
13492
+ class Bn extends ns {
13461
13493
  /** Internal constructor. */
13462
13494
  constructor(e) {
13463
13495
  if (super(), this._connectedTrack = null, !O0.includes(e))
@@ -13465,7 +13497,7 @@ class kn extends ns {
13465
13497
  this._codec = e;
13466
13498
  }
13467
13499
  }
13468
- class b1 extends kn {
13500
+ class p1 extends Bn {
13469
13501
  /** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */
13470
13502
  constructor(e) {
13471
13503
  super(e);
@@ -13490,7 +13522,7 @@ class b1 extends kn {
13490
13522
  return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedVideoPacket(this._connectedTrack, e, i);
13491
13523
  }
13492
13524
  }
13493
- class Bn extends ns {
13525
+ class Cn extends ns {
13494
13526
  /** Internal constructor. */
13495
13527
  constructor(e) {
13496
13528
  if (super(), this._connectedTrack = null, !ui.includes(e))
@@ -13498,7 +13530,7 @@ class Bn extends ns {
13498
13530
  this._codec = e;
13499
13531
  }
13500
13532
  }
13501
- class p1 extends Bn {
13533
+ class y1 extends Cn {
13502
13534
  /** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */
13503
13535
  constructor(e) {
13504
13536
  super(e);
@@ -13522,7 +13554,7 @@ class p1 extends Bn {
13522
13554
  return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedAudioPacket(this._connectedTrack, e, i);
13523
13555
  }
13524
13556
  }
13525
- class y1 extends ns {
13557
+ class f1 extends ns {
13526
13558
  /** Internal constructor. */
13527
13559
  constructor(e) {
13528
13560
  if (super(), this._connectedTrack = null, !hi.includes(e))
@@ -13537,27 +13569,27 @@ class y1 extends ns {
13537
13569
  * License, v. 2.0. If a copy of the MPL was not distributed with this
13538
13570
  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
13539
13571
  */
13540
- const f1 = ["video", "audio", "subtitle"], zi = (t) => {
13572
+ const Z1 = ["video", "audio", "subtitle"], zi = (t) => {
13541
13573
  if (!t || typeof t != "object")
13542
13574
  throw new TypeError("metadata must be an object.");
13543
- if (t.languageCode !== void 0 && !Ra(t.languageCode))
13575
+ if (t.languageCode !== void 0 && !Ta(t.languageCode))
13544
13576
  throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");
13545
13577
  if (t.name !== void 0 && typeof t.name != "string")
13546
13578
  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))
13579
+ if (t.disposition !== void 0 && Ha(t.disposition), t.maximumPacketCount !== void 0 && (!Number.isInteger(t.maximumPacketCount) || t.maximumPacketCount < 0))
13548
13580
  throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");
13549
13581
  };
13550
- class Z1 {
13582
+ class X1 {
13551
13583
  /**
13552
13584
  * Creates a new instance of {@link Output} which can then be used to create a new media file according to the
13553
13585
  * specified {@link OutputOptions}.
13554
13586
  */
13555
13587
  constructor(e) {
13556
- if (this.state = "pending", this._tracks = [], this._startPromise = null, this._cancelPromise = null, this._finalizePromise = null, this._mutex = new bn(), this._metadataTags = {}, !e || typeof e != "object")
13588
+ if (this.state = "pending", this._tracks = [], this._startPromise = null, this._cancelPromise = null, this._finalizePromise = null, this._mutex = new pn(), this._metadataTags = {}, !e || typeof e != "object")
13557
13589
  throw new TypeError("options must be an object.");
13558
- if (!(e.format instanceof Yn))
13590
+ if (!(e.format instanceof wn))
13559
13591
  throw new TypeError("options.format must be an OutputFormat.");
13560
- if (!(e.target instanceof xn))
13592
+ if (!(e.target instanceof Hn))
13561
13593
  throw new TypeError("options.target must be a Target.");
13562
13594
  if (e.target._output)
13563
13595
  throw new Error("Target is already used for another output.");
@@ -13565,7 +13597,7 @@ class Z1 {
13565
13597
  }
13566
13598
  /** Adds a video track to the output with the given source. Can only be called before the output is started. */
13567
13599
  addVideoTrack(e, i = {}) {
13568
- if (!(e instanceof kn))
13600
+ if (!(e instanceof Bn))
13569
13601
  throw new TypeError("source must be a VideoSource.");
13570
13602
  if (zi(i), i.rotation !== void 0 && ![0, 90, 180, 270].includes(i.rotation))
13571
13603
  throw new TypeError(`Invalid video rotation: ${i.rotation}. Has to be 0, 90, 180 or 270.`);
@@ -13577,13 +13609,13 @@ class Z1 {
13577
13609
  }
13578
13610
  /** Adds an audio track to the output with the given source. Can only be called before the output is started. */
13579
13611
  addAudioTrack(e, i = {}) {
13580
- if (!(e instanceof Bn))
13612
+ if (!(e instanceof Cn))
13581
13613
  throw new TypeError("source must be an AudioSource.");
13582
13614
  zi(i), this._addTrack("audio", e, i);
13583
13615
  }
13584
13616
  /** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */
13585
13617
  addSubtitleTrack(e, i = {}) {
13586
- if (!(e instanceof y1))
13618
+ if (!(e instanceof f1))
13587
13619
  throw new TypeError("source must be a SubtitleSource.");
13588
13620
  zi(i), this._addTrack("subtitle", e, i);
13589
13621
  }
@@ -13594,7 +13626,7 @@ class Z1 {
13594
13626
  * Can only be called before the output is started.
13595
13627
  */
13596
13628
  setMetadataTags(e) {
13597
- if (La(e), this.state !== "pending")
13629
+ if (xa(e), this.state !== "pending")
13598
13630
  throw new Error("Cannot set metadata tags after output has been started or canceled.");
13599
13631
  this._metadataTags = e;
13600
13632
  }
@@ -13610,33 +13642,33 @@ class Z1 {
13610
13642
  const h = d.total.max;
13611
13643
  if (this._tracks.length === h)
13612
13644
  throw new Error(`${this.format._name} does not support more than ${h} tracks${h === 1 ? "" : "s"} in total.`);
13613
- const G = {
13645
+ const S = {
13614
13646
  id: this._tracks.length + 1,
13615
13647
  output: this,
13616
13648
  type: e,
13617
13649
  source: i,
13618
13650
  metadata: n
13619
13651
  };
13620
- if (G.type === "video") {
13652
+ if (S.type === "video") {
13621
13653
  const W = this.format.getSupportedVideoCodecs();
13622
13654
  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") {
13655
+ throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13656
+ if (!W.includes(S.source._codec))
13657
+ 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));
13658
+ } else if (S.type === "audio") {
13627
13659
  const W = this.format.getSupportedAudioCodecs();
13628
13660
  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") {
13661
+ throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13662
+ if (!W.includes(S.source._codec))
13663
+ 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));
13664
+ } else if (S.type === "subtitle") {
13633
13665
  const W = this.format.getSupportedSubtitleCodecs();
13634
13666
  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));
13667
+ throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(S.source._codec));
13668
+ if (!W.includes(S.source._codec))
13669
+ 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
13670
  }
13639
- this._tracks.push(G), i._connectedTrack = G;
13671
+ this._tracks.push(S), i._connectedTrack = S;
13640
13672
  }
13641
13673
  /**
13642
13674
  * Starts the creation of the output file. This method should be called after all tracks have been added. Only after
@@ -13646,7 +13678,7 @@ class Z1 {
13646
13678
  */
13647
13679
  async start() {
13648
13680
  const e = this.format.getSupportedTrackCounts();
13649
- for (const n of f1) {
13681
+ for (const n of Z1) {
13650
13682
  const d = this._tracks.reduce((m, h) => m + (h.type === n ? 1 : 0), 0), o = e[n].min;
13651
13683
  if (d < o)
13652
13684
  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,19 +13739,19 @@ class Z1 {
13707
13739
  })();
13708
13740
  }
13709
13741
  }
13710
- class Y1 {
13742
+ class K1 {
13711
13743
  /**
13712
13744
  * Create a new ExampleMuxer.
13713
13745
  *
13714
13746
  * @param type - Track type: 'video' (default) or 'audio'
13715
13747
  */
13716
13748
  constructor(e) {
13717
- this.type = e || "video", this.target = new Hn();
13718
- const i = new Z1({
13719
- format: new Kn(),
13749
+ this.type = e || "video", this.target = new Yn();
13750
+ const i = new X1({
13751
+ format: new Mn(),
13720
13752
  target: this.target
13721
13753
  });
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(
13754
+ 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
13755
  "⚠️ 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
13756
  );
13725
13757
  }
@@ -13744,17 +13776,18 @@ class Y1 {
13744
13776
  }
13745
13777
  }
13746
13778
  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,
13755
- Jn as extractChannels,
13756
- H1 as getAudioChunks,
13779
+ K1 as ExampleMuxer,
13780
+ I1 as GPUFrameRenderer,
13781
+ W1 as InMemoryStorage,
13782
+ R1 as MP3Decoder,
13783
+ V1 as MP3Encoder,
13784
+ T1 as MP4Demuxer,
13785
+ L1 as MediaStreamTrackProcessor,
13786
+ H1 as demuxAudio,
13787
+ Y1 as demuxVideo,
13788
+ En as extractChannels,
13789
+ w1 as getAudioChunks,
13757
13790
  G1 as getBitrate,
13758
- S1 as getCodecString,
13759
- W1 as getVideoChunks
13791
+ v1 as getCodecString,
13792
+ x1 as getVideoChunks
13760
13793
  };