quickwin 2.3.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.en.md +1 -2
  2. package/README.md +1 -2
  3. package/constants.ts +15 -0
  4. package/enum_map.d.ts +3 -0
  5. package/examples/PdfCanvas.js +1 -1
  6. package/examples/PdfCanvas.tsx +2 -2
  7. package/examples/execd/main.js +334 -188
  8. package/examples/pdf_preview2.js +76 -67
  9. package/examples/pdf_preview2.ts +84 -64
  10. package/examples/pdf_viewer.js +4932 -1029
  11. package/examples/pdf_viewer.tsx +11 -22
  12. package/examples/test_gallery.js +308 -143
  13. package/examples/test_gallery.tsx +12 -7
  14. package/examples/test_react_lazy.js +295 -133
  15. package/examples/test_react_lazy.tsx +4 -3
  16. package/examples/test_react_listbox.js +293 -132
  17. package/examples/test_react_listbox.tsx +3 -2
  18. package/examples/test_root_window.js +283 -126
  19. package/examples/test_tab.js +295 -133
  20. package/examples/test_tab.tsx +4 -3
  21. package/examples/tray_demo.js +37 -30
  22. package/examples/tray_demo.tsx +39 -32
  23. package/lib/bitmap.js +40 -0
  24. package/lib/bitmap.ts +39 -0
  25. package/lib/certs.js +31 -3
  26. package/lib/certs.ts +32 -3
  27. package/lib/dpi.js +30 -0
  28. package/lib/dpi.ts +31 -0
  29. package/lib/dumpRects.js +14 -7
  30. package/lib/dumpRects.ts +14 -6
  31. package/lib/ffi/bind.js +5 -4
  32. package/lib/ffi/bind.ts +9 -8
  33. package/lib/react-qw/components/DateTimePicker.js +6 -7
  34. package/lib/react-qw/components/Input.js +5 -1
  35. package/lib/react-qw/components/ListView.js +8 -6
  36. package/lib/react-qw/components/ScrollView.js +28 -22
  37. package/lib/react-qw/index.js +7 -5
  38. package/lib/react-qw/index.ts +5 -5
  39. package/lib/react-qw/props.js +3 -3
  40. package/lib/react-qw/props.ts +3 -3
  41. package/lib/react-qw/reconciler.js +12 -17
  42. package/lib/react-qw/reconciler.ts +12 -16
  43. package/lib/text-measure.js +9 -6
  44. package/lib/text-measure.ts +9 -6
  45. package/lib/windows/comctl32.js +3 -2
  46. package/lib/windows/comctl32.ts +3 -2
  47. package/lib/windows/gdi32.js +28 -6
  48. package/lib/windows/gdi32.ts +30 -6
  49. package/lib/windows/kernel32.js +9 -0
  50. package/lib/windows/kernel32.ts +9 -0
  51. package/lib/windows/shell32.js +11 -2
  52. package/lib/windows/shell32.ts +13 -2
  53. package/lib/windows/structs.js +51 -0
  54. package/lib/windows/structs.ts +55 -0
  55. package/lib/windows/user32.js +6 -5
  56. package/lib/windows/user32.ts +6 -5
  57. package/main.js +13 -5
  58. package/package.json +2 -2
  59. package/quickwin.d.ts +13 -115
  60. package/qwin-nowasm-x86.exe +0 -0
  61. package/qwin-nowasm.exe +0 -0
  62. package/qwin-x86.exe +0 -0
  63. package/qwin.exe +0 -0
  64. package/test/bench_ffi_callraw.js +3 -4
  65. package/test/bench_ffi_callraw.ts +3 -4
  66. package/test/debug/mupdf_debug.js +4 -22
  67. package/test/debug/wasm_export_debug.js +2 -12
  68. package/test/debug/wasm_names.js +3 -13
  69. package/test/example.pdf +0 -0
  70. package/test/mupdf-cdn.js +40 -0
  71. package/test/mupdf-cdn.ts +43 -0
  72. package/test/test_ffi.js +8 -9
  73. package/test/test_ffi.ts +8 -9
  74. package/test/test_ffi_abi.js +6 -6
  75. package/test/test_ffi_abi.ts +8 -8
  76. package/test/test_ffi_windows.js +82 -11
  77. package/test/test_ffi_windows.ts +85 -11
  78. package/test/test_gdi_draw.js +3 -3
  79. package/test/test_gdi_draw.ts +4 -4
  80. package/test/test_mupdf_render.js +4 -22
  81. package/test/test_mupdf_render.ts +4 -23
  82. package/test/test_mupdf_twice.js +4 -19
  83. package/test/test_mupdf_twice.ts +4 -20
  84. package/test/test_mupdf_wasm.js +10 -4
  85. package/test/test_mupdf_wasm.ts +6 -4
  86. package/test/test_react_complex.js +316 -140
  87. package/test/test_react_counter.js +295 -133
  88. package/test/test_react_flex.js +297 -138
  89. package/test/test_react_hidden.js +296 -134
  90. package/test/test_react_listview_link.js +288 -131
  91. package/test/test_react_notify.js +290 -133
  92. package/test/test_react_render.js +295 -133
  93. package/vendor/mupdf-wasm/mupdf-wasm.d.ts +0 -571
  94. package/vendor/mupdf-wasm/mupdf-wasm.js +0 -2749
  95. package/vendor/mupdf-wasm/mupdf-wasm.wasm +0 -0
  96. package/vendor/mupdf-wasm/mupdf.d.ts +0 -939
  97. package/vendor/mupdf-wasm/mupdf.js +0 -3317
@@ -1367,9 +1367,9 @@ var require_scheduler_development = __commonJS({
1367
1367
  }
1368
1368
  return first;
1369
1369
  }
1370
- function compare(a2, b8) {
1371
- var diff = a2.sortIndex - b8.sortIndex;
1372
- return 0 !== diff ? diff : a2.id - b8.id;
1370
+ function compare(a2, b9) {
1371
+ var diff = a2.sortIndex - b9.sortIndex;
1372
+ return 0 !== diff ? diff : a2.id - b9.id;
1373
1373
  }
1374
1374
  function advanceTimers(currentTime) {
1375
1375
  for (var timer = peek(timerQueue); null !== timer; ) {
@@ -1667,14 +1667,14 @@ var require_react_reconciler_development = __commonJS({
1667
1667
  throw Error("Unable to find node on an unmounted component.");
1668
1668
  return alternate !== fiber ? null : fiber;
1669
1669
  }
1670
- for (var a2 = fiber, b8 = alternate; ; ) {
1670
+ for (var a2 = fiber, b9 = alternate; ; ) {
1671
1671
  var parentA = a2.return;
1672
1672
  if (null === parentA) break;
1673
1673
  var parentB = parentA.alternate;
1674
1674
  if (null === parentB) {
1675
- b8 = parentA.return;
1676
- if (null !== b8) {
1677
- a2 = b8;
1675
+ b9 = parentA.return;
1676
+ if (null !== b9) {
1677
+ a2 = b9;
1678
1678
  continue;
1679
1679
  }
1680
1680
  break;
@@ -1682,23 +1682,23 @@ var require_react_reconciler_development = __commonJS({
1682
1682
  if (parentA.child === parentB.child) {
1683
1683
  for (parentB = parentA.child; parentB; ) {
1684
1684
  if (parentB === a2) return assertIsMounted(parentA), fiber;
1685
- if (parentB === b8) return assertIsMounted(parentA), alternate;
1685
+ if (parentB === b9) return assertIsMounted(parentA), alternate;
1686
1686
  parentB = parentB.sibling;
1687
1687
  }
1688
1688
  throw Error("Unable to find node on an unmounted component.");
1689
1689
  }
1690
- if (a2.return !== b8.return) a2 = parentA, b8 = parentB;
1690
+ if (a2.return !== b9.return) a2 = parentA, b9 = parentB;
1691
1691
  else {
1692
1692
  for (var didFindChild = false, _child = parentA.child; _child; ) {
1693
1693
  if (_child === a2) {
1694
1694
  didFindChild = true;
1695
1695
  a2 = parentA;
1696
- b8 = parentB;
1696
+ b9 = parentB;
1697
1697
  break;
1698
1698
  }
1699
- if (_child === b8) {
1699
+ if (_child === b9) {
1700
1700
  didFindChild = true;
1701
- b8 = parentA;
1701
+ b9 = parentA;
1702
1702
  a2 = parentB;
1703
1703
  break;
1704
1704
  }
@@ -1709,12 +1709,12 @@ var require_react_reconciler_development = __commonJS({
1709
1709
  if (_child === a2) {
1710
1710
  didFindChild = true;
1711
1711
  a2 = parentB;
1712
- b8 = parentA;
1712
+ b9 = parentA;
1713
1713
  break;
1714
1714
  }
1715
- if (_child === b8) {
1715
+ if (_child === b9) {
1716
1716
  didFindChild = true;
1717
- b8 = parentB;
1717
+ b9 = parentB;
1718
1718
  a2 = parentA;
1719
1719
  break;
1720
1720
  }
@@ -1726,7 +1726,7 @@ var require_react_reconciler_development = __commonJS({
1726
1726
  );
1727
1727
  }
1728
1728
  }
1729
- if (a2.alternate !== b8)
1729
+ if (a2.alternate !== b9)
1730
1730
  throw Error(
1731
1731
  "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."
1732
1732
  );
@@ -15071,10 +15071,10 @@ var require_react_reconciler_development = __commonJS({
15071
15071
  setCurrentUpdatePriority(previousPriority), ReactSharedInternals.T = prevTransition;
15072
15072
  }
15073
15073
  };
15074
- exports2.discreteUpdates = function(fn, a2, b8, c2, d2) {
15074
+ exports2.discreteUpdates = function(fn, a2, b9, c2, d2) {
15075
15075
  var prevTransition = ReactSharedInternals.T, previousPriority = getCurrentUpdatePriority();
15076
15076
  try {
15077
- return setCurrentUpdatePriority(2), ReactSharedInternals.T = null, fn(a2, b8, c2, d2);
15077
+ return setCurrentUpdatePriority(2), ReactSharedInternals.T = null, fn(a2, b9, c2, d2);
15078
15078
  } finally {
15079
15079
  setCurrentUpdatePriority(previousPriority), ReactSharedInternals.T = prevTransition, executionContext === NoContext && (workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS);
15080
15080
  }
@@ -15514,7 +15514,7 @@ var URLSearchParamsImpl = class {
15514
15514
  this._list.push([key, value]);
15515
15515
  }
15516
15516
  sort() {
15517
- this._list.sort(([a2], [b8]) => a2 < b8 ? -1 : a2 > b8 ? 1 : 0);
15517
+ this._list.sort(([a2], [b9]) => a2 < b9 ? -1 : a2 > b9 ? 1 : 0);
15518
15518
  }
15519
15519
  forEach(fn) {
15520
15520
  for (const [k2, v2] of this._list)
@@ -15564,43 +15564,43 @@ var URLImpl = class _URLImpl {
15564
15564
  }
15565
15565
  if (base === void 0)
15566
15566
  throw new TypeError("Invalid URL");
15567
- const b8 = new _URLImpl(base);
15567
+ const b9 = new _URLImpl(base);
15568
15568
  if (p2.host) {
15569
- p2.scheme = b8._scheme;
15569
+ p2.scheme = b9._scheme;
15570
15570
  this._apply(p2);
15571
15571
  return;
15572
15572
  }
15573
15573
  if (!p2.path && !p2.query) {
15574
15574
  this._apply({
15575
- scheme: b8._scheme,
15576
- user: b8._username,
15577
- pass: b8._password,
15578
- host: b8._hostname,
15579
- port: b8._port,
15580
- path: b8._pathname,
15581
- query: b8._query,
15575
+ scheme: b9._scheme,
15576
+ user: b9._username,
15577
+ pass: b9._password,
15578
+ host: b9._hostname,
15579
+ port: b9._port,
15580
+ path: b9._pathname,
15581
+ query: b9._query,
15582
15582
  fragment: p2.fragment || ""
15583
15583
  });
15584
15584
  return;
15585
15585
  }
15586
- p2.scheme = b8._scheme;
15586
+ p2.scheme = b9._scheme;
15587
15587
  if (!p2.user)
15588
- p2.user = b8._username;
15588
+ p2.user = b9._username;
15589
15589
  if (!p2.pass)
15590
- p2.pass = b8._password;
15590
+ p2.pass = b9._password;
15591
15591
  if (!p2.host)
15592
- p2.host = b8._hostname;
15592
+ p2.host = b9._hostname;
15593
15593
  if (!p2.port)
15594
- p2.port = b8._port;
15594
+ p2.port = b9._port;
15595
15595
  if (!p2.fragment)
15596
15596
  p2.fragment = "";
15597
15597
  if (p2.path && !p2.path.startsWith("/")) {
15598
- const bd = b8._pathname.substring(0, b8._pathname.lastIndexOf("/") + 1);
15598
+ const bd = b9._pathname.substring(0, b9._pathname.lastIndexOf("/") + 1);
15599
15599
  p2.path = _normalizePath(bd + p2.path);
15600
15600
  } else if (!p2.path) {
15601
- p2.path = b8._pathname;
15601
+ p2.path = b9._pathname;
15602
15602
  if (!p2.query)
15603
- p2.query = b8._query;
15603
+ p2.query = b9._query;
15604
15604
  }
15605
15605
  this._apply(p2);
15606
15606
  }
@@ -15705,19 +15705,19 @@ function _normalizeLabel(label) {
15705
15705
  function _decodeUTF8(buf, fatal) {
15706
15706
  let out = "";
15707
15707
  for (let i2 = 0; i2 < buf.length; ) {
15708
- const b8 = buf[i2++];
15709
- if (b8 < 128) {
15710
- out += String.fromCharCode(b8);
15708
+ const b9 = buf[i2++];
15709
+ if (b9 < 128) {
15710
+ out += String.fromCharCode(b9);
15711
15711
  continue;
15712
15712
  }
15713
- if (b8 < 192) {
15713
+ if (b9 < 192) {
15714
15714
  out += fatal ? (() => {
15715
15715
  throw new TypeError("unexpected continuation byte");
15716
15716
  })() : "\uFFFD";
15717
15717
  continue;
15718
15718
  }
15719
15719
  let c2, min;
15720
- if (b8 < 224) {
15720
+ if (b9 < 224) {
15721
15721
  if (i2 >= buf.length) {
15722
15722
  out += fatal ? (() => {
15723
15723
  throw new TypeError("incomplete utf-8");
@@ -15729,9 +15729,9 @@ function _decodeUTF8(buf, fatal) {
15729
15729
  out += "\uFFFD";
15730
15730
  continue;
15731
15731
  }
15732
- c2 = (b8 & 31) << 6 | b22 & 63;
15732
+ c2 = (b9 & 31) << 6 | b22 & 63;
15733
15733
  min = 128;
15734
- } else if (b8 < 240) {
15734
+ } else if (b9 < 240) {
15735
15735
  if (i2 + 1 >= buf.length) {
15736
15736
  out += fatal ? (() => {
15737
15737
  throw new TypeError("incomplete utf-8");
@@ -15744,9 +15744,9 @@ function _decodeUTF8(buf, fatal) {
15744
15744
  out += "\uFFFD";
15745
15745
  continue;
15746
15746
  }
15747
- c2 = (b8 & 15) << 12 | (b22 & 63) << 6 | b32 & 63;
15747
+ c2 = (b9 & 15) << 12 | (b22 & 63) << 6 | b32 & 63;
15748
15748
  min = 2048;
15749
- } else if (b8 < 248) {
15749
+ } else if (b9 < 248) {
15750
15750
  if (i2 + 2 >= buf.length) {
15751
15751
  out += fatal ? (() => {
15752
15752
  throw new TypeError("incomplete utf-8");
@@ -15760,7 +15760,7 @@ function _decodeUTF8(buf, fatal) {
15760
15760
  out += "\uFFFD";
15761
15761
  continue;
15762
15762
  }
15763
- c2 = (b8 & 7) << 18 | (b22 & 63) << 12 | (b32 & 63) << 6 | b42 & 63;
15763
+ c2 = (b9 & 7) << 18 | (b22 & 63) << 12 | (b32 & 63) << 6 | b42 & 63;
15764
15764
  min = 65536;
15765
15765
  } else {
15766
15766
  out += fatal ? (() => {
@@ -15940,31 +15940,31 @@ function sha1Bytes(bytes) {
15940
15940
  for (let t2 = 16; t2 < 80; t2++) {
15941
15941
  w2[t2] = rotl(w2[t2 - 3] ^ w2[t2 - 8] ^ w2[t2 - 14] ^ w2[t2 - 16], 1);
15942
15942
  }
15943
- let a2 = h0, b8 = h1, c2 = h2, d2 = h3, e2 = h4;
15943
+ let a2 = h0, b9 = h1, c2 = h2, d2 = h3, e2 = h4;
15944
15944
  for (let t2 = 0; t2 < 80; t2++) {
15945
15945
  let f2, k2;
15946
15946
  if (t2 < 20) {
15947
- f2 = b8 & c2 | ~b8 & d2;
15947
+ f2 = b9 & c2 | ~b9 & d2;
15948
15948
  k2 = 1518500249;
15949
15949
  } else if (t2 < 40) {
15950
- f2 = b8 ^ c2 ^ d2;
15950
+ f2 = b9 ^ c2 ^ d2;
15951
15951
  k2 = 1859775393;
15952
15952
  } else if (t2 < 60) {
15953
- f2 = b8 & c2 | b8 & d2 | c2 & d2;
15953
+ f2 = b9 & c2 | b9 & d2 | c2 & d2;
15954
15954
  k2 = 2400959708;
15955
15955
  } else {
15956
- f2 = b8 ^ c2 ^ d2;
15956
+ f2 = b9 ^ c2 ^ d2;
15957
15957
  k2 = 3395469782;
15958
15958
  }
15959
15959
  const temp = rotl(a2, 5) + f2 + e2 + k2 + w2[t2] >>> 0;
15960
15960
  e2 = d2;
15961
15961
  d2 = c2;
15962
- c2 = rotl(b8, 30);
15963
- b8 = a2;
15962
+ c2 = rotl(b9, 30);
15963
+ b9 = a2;
15964
15964
  a2 = temp;
15965
15965
  }
15966
15966
  h0 = h0 + a2 >>> 0;
15967
- h1 = h1 + b8 >>> 0;
15967
+ h1 = h1 + b9 >>> 0;
15968
15968
  h2 = h2 + c2 >>> 0;
15969
15969
  h3 = h3 + d2 >>> 0;
15970
15970
  h4 = h4 + e2 >>> 0;
@@ -17513,7 +17513,7 @@ function Er(e2) {
17513
17513
  function Wr(e2, t2) {
17514
17514
  return Oe(e2._readableStreamController) ? (function(e3) {
17515
17515
  let t3, r2, o2, n2, i2, a2 = V(e3), s2 = false, l2 = false, d2 = false, f2 = false, h2 = false;
17516
- const b8 = u((e4) => {
17516
+ const b9 = u((e4) => {
17517
17517
  i2 = e4;
17518
17518
  });
17519
17519
  function m2(e4) {
@@ -17583,14 +17583,14 @@ function Wr(e2, t2) {
17583
17583
  const o4 = le([t3, r2]), n3 = Mr(e3, o4);
17584
17584
  i2(n3);
17585
17585
  }
17586
- return b8;
17586
+ return b9;
17587
17587
  }
17588
17588
  function R2(o3) {
17589
17589
  if (h2 = true, r2 = o3, f2) {
17590
17590
  const o4 = le([t3, r2]), n3 = Mr(e3, o4);
17591
17591
  i2(n3);
17592
17592
  }
17593
- return b8;
17593
+ return b9;
17594
17594
  }
17595
17595
  function T2() {
17596
17596
  }
@@ -17601,14 +17601,14 @@ function Wr(e2, t2) {
17601
17601
  const h2 = u((e4) => {
17602
17602
  a2 = e4;
17603
17603
  });
17604
- function b8() {
17604
+ function b9() {
17605
17605
  if (s2) return l2 = true, c(void 0);
17606
17606
  s2 = true;
17607
17607
  return te(t3, { _chunkSteps: (e4) => {
17608
17608
  y(() => {
17609
17609
  l2 = false;
17610
17610
  const t4 = e4, r3 = e4;
17611
- d2 || Rr(n2._readableStreamController, t4), f2 || Rr(i2._readableStreamController, r3), s2 = false, l2 && b8();
17611
+ d2 || Rr(n2._readableStreamController, t4), f2 || Rr(i2._readableStreamController, r3), s2 = false, l2 && b9();
17612
17612
  });
17613
17613
  }, _closeSteps: () => {
17614
17614
  s2 = false, d2 || wr(n2._readableStreamController), f2 || wr(i2._readableStreamController), d2 && f2 || a2(void 0);
@@ -17632,7 +17632,7 @@ function Wr(e2, t2) {
17632
17632
  }
17633
17633
  function S2() {
17634
17634
  }
17635
- return n2 = Dr(S2, b8, m2), i2 = Dr(S2, b8, p2), _(t3._closedPromise, (e4) => (Tr(n2._readableStreamController, e4), Tr(i2._readableStreamController, e4), d2 && f2 || a2(void 0), null)), [n2, i2];
17635
+ return n2 = Dr(S2, b9, m2), i2 = Dr(S2, b9, p2), _(t3._closedPromise, (e4) => (Tr(n2._readableStreamController, e4), Tr(i2._readableStreamController, e4), d2 && f2 || a2(void 0), null)), [n2, i2];
17636
17636
  })(e2);
17637
17637
  }
17638
17638
  function Or(r2) {
@@ -17941,7 +17941,7 @@ var TransformStream = class {
17941
17941
  if (void 0 !== i2.readableType) throw new RangeError("Invalid readableType specified");
17942
17942
  if (void 0 !== i2.writableType) throw new RangeError("Invalid writableType specified");
17943
17943
  const a2 = mt(n2, 0), s2 = pt(n2), l2 = mt(o2, 1), f2 = pt(o2);
17944
- let b8;
17944
+ let b9;
17945
17945
  !(function(e3, t3, r3, o3, n3, i3) {
17946
17946
  function a3() {
17947
17947
  return t3;
@@ -18005,7 +18005,7 @@ var TransformStream = class {
18005
18005
  return Ct(a4), Nt(a4, Object.create(WritableStreamDefaultController.prototype), e4, t4, r4, o4, n4, i4), a4;
18006
18006
  })(a3, s3, c2, l3, r3, o3), e3._readable = Dr(a3, d2, f3, n3, i3), e3._backpressure = void 0, e3._backpressureChangePromise = void 0, e3._backpressureChangePromise_resolve = void 0, ao(e3, true), e3._transformStreamController = void 0;
18007
18007
  })(this, u((e3) => {
18008
- b8 = e3;
18008
+ b9 = e3;
18009
18009
  }), l2, f2, a2, s2), (function(e3, t3) {
18010
18010
  const r3 = Object.create(TransformStreamDefaultController.prototype);
18011
18011
  let o3, n3, i3;
@@ -18021,7 +18021,7 @@ var TransformStream = class {
18021
18021
  !(function(e4, t4, r4, o4, n4) {
18022
18022
  t4._controlledTransformStream = e4, e4._transformStreamController = t4, t4._transformAlgorithm = r4, t4._flushAlgorithm = o4, t4._cancelAlgorithm = n4, t4._finishPromise = void 0, t4._finishPromise_resolve = void 0, t4._finishPromise_reject = void 0;
18023
18023
  })(e3, r3, o3, n3, i3);
18024
- })(this, i2), void 0 !== i2.start ? b8(i2.start(this._transformStreamController)) : b8(void 0);
18024
+ })(this, i2), void 0 !== i2.start ? b9(i2.start(this._transformStreamController)) : b9(void 0);
18025
18025
  }
18026
18026
  get readable() {
18027
18027
  if (!ro(this)) throw _o("readable");
@@ -19058,7 +19058,6 @@ async function sendResponse(c2, method, res) {
19058
19058
  // _build/examples/execd/main.js
19059
19059
  import * as os7 from "os";
19060
19060
  import * as std2 from "std";
19061
- import * as gui19 from "gui";
19062
19061
 
19063
19062
  // _build/lib/exec-log.js
19064
19063
  var RequestLog = class {
@@ -19081,7 +19080,7 @@ var RequestLog = class {
19081
19080
  };
19082
19081
 
19083
19082
  // _build/lib/react-qw/index.js
19084
- import * as gui17 from "gui";
19083
+ import * as gui16 from "gui";
19085
19084
 
19086
19085
  // _build/lib/windows/user32.js
19087
19086
  import * as os4 from "os";
@@ -19090,7 +19089,6 @@ import * as os4 from "os";
19090
19089
  import * as ffi from "ffi";
19091
19090
  import * as os3 from "os";
19092
19091
  import * as std from "std";
19093
- import * as win from "win";
19094
19092
 
19095
19093
  // _build/lib/ffi/ctype.js
19096
19094
  import { bufferPtr } from "ffi";
@@ -19258,7 +19256,7 @@ function loadDll(dll) {
19258
19256
  const cached = _dllCache.get(dll);
19259
19257
  if (cached !== void 0)
19260
19258
  return cached;
19261
- const loaded = win.LoadLibrary(dll);
19259
+ const loaded = ffi.LoadLibrary(dll);
19262
19260
  if (!loaded)
19263
19261
  throw new Error(`ffi-bind: LoadLibrary("${dll}") failed`);
19264
19262
  _dllCache.set(dll, loaded);
@@ -19468,7 +19466,7 @@ var BYTE = {
19468
19466
  };
19469
19467
  var builtinCodecs = { WCHAR, BYTE };
19470
19468
  function bind2(dll, name, sig, encoders, decoders) {
19471
- const proc = win.GetProcAddress(loadDll(dll), name);
19469
+ const proc = ffi.GetProcAddress(loadDll(dll), name);
19472
19470
  if (!proc)
19473
19471
  throw new Error(`ffi-bind: proc "${name}" not found in ${dll}`);
19474
19472
  const effDec = decoders ?? encoders;
@@ -19577,13 +19575,13 @@ function lower(v2) {
19577
19575
  type: { tag: "array", elementType: el.type, elementSize: el.size }
19578
19576
  };
19579
19577
  }
19580
- const b8 = /^([A-Za-z_]\w*):(\d+)$/.exec(v2);
19581
- if (b8) {
19582
- const rawUnit = b8[1];
19578
+ const b9 = /^([A-Za-z_]\w*):(\d+)$/.exec(v2);
19579
+ if (b9) {
19580
+ const rawUnit = b9[1];
19583
19581
  const unit = normToken(rawUnit);
19584
19582
  if (!isCNumberToken(unit) || unit === "f32" || unit === "f64")
19585
19583
  throw new Error(`ffi-struct: bitfield unit must be an integer type, got "${rawUnit}"`);
19586
- const width = Number(b8[2]);
19584
+ const width = Number(b9[2]);
19587
19585
  const s3 = SizeAlign[unit];
19588
19586
  const cap = s3 * 8;
19589
19587
  if (!Number.isInteger(width) || width < 1)
@@ -19942,10 +19940,10 @@ function structArray(def) {
19942
19940
  })
19943
19941
  };
19944
19942
  }
19945
- function struct(a2, b8, c2) {
19943
+ function struct(a2, b9, c2) {
19946
19944
  const isNamed = typeof a2 === "string";
19947
- const raw = isNamed ? b8 : a2;
19948
- const opts = isNamed ? c2 : b8;
19945
+ const raw = isNamed ? b9 : a2;
19946
+ const opts = isNamed ? c2 : b9;
19949
19947
  return createStruct(buildDecl("struct", raw, opts?.pack));
19950
19948
  }
19951
19949
 
@@ -19970,6 +19968,17 @@ var SIZE_DECL = {
19970
19968
  cy: "i32"
19971
19969
  };
19972
19970
  var SIZE = /* @__PURE__ */ struct("SIZE", SIZE_DECL);
19971
+ var SCROLLINFO_DECL = {
19972
+ "#": "struct",
19973
+ cbSize: "u32",
19974
+ fMask: "u32",
19975
+ nMin: "i32",
19976
+ nMax: "i32",
19977
+ nPage: "u32",
19978
+ nPos: "i32",
19979
+ nTrackPos: "i32"
19980
+ };
19981
+ var SCROLLINFO = /* @__PURE__ */ struct("SCROLLINFO", SCROLLINFO_DECL);
19973
19982
  var LOGFONTW_DECL = {
19974
19983
  "#": "struct",
19975
19984
  lfHeight: "i32",
@@ -19988,6 +19997,26 @@ var LOGFONTW_DECL = {
19988
19997
  lfFaceName: "u16[32]@utf-16le"
19989
19998
  };
19990
19999
  var LOGFONTW = /* @__PURE__ */ struct("LOGFONTW", LOGFONTW_DECL);
20000
+ var NONCLIENTMETRICSW_DECL = {
20001
+ "#": "struct",
20002
+ cbSize: "u32",
20003
+ iBorderWidth: "i32",
20004
+ iScrollWidth: "i32",
20005
+ iScrollHeight: "i32",
20006
+ iCaptionWidth: "i32",
20007
+ iCaptionHeight: "i32",
20008
+ lfCaptionFont: LOGFONTW_DECL,
20009
+ iSmCaptionWidth: "i32",
20010
+ iSmCaptionHeight: "i32",
20011
+ lfSmCaptionFont: LOGFONTW_DECL,
20012
+ iMenuWidth: "i32",
20013
+ iMenuHeight: "i32",
20014
+ lfMenuFont: LOGFONTW_DECL,
20015
+ lfStatusFont: LOGFONTW_DECL,
20016
+ lfMessageFont: LOGFONTW_DECL,
20017
+ iPaddedBorderWidth: "i32"
20018
+ };
20019
+ var NONCLIENTMETRICSW = /* @__PURE__ */ struct("NONCLIENTMETRICSW", NONCLIENTMETRICSW_DECL);
19991
20020
  var BITMAPINFOHEADER_DECL = {
19992
20021
  "#": "struct",
19993
20022
  biSize: "u32",
@@ -20279,6 +20308,7 @@ var NOTIFYICONIDENTIFIER = /* @__PURE__ */ struct("NOTIFYICONIDENTIFIER", NOTIFY
20279
20308
  var b2 = (name, sig, encoders) => bind2("user32.dll", name, sig, encoders);
20280
20309
  var _bProbe = b2("GetDesktopWindow", " -> <HWND>ptr");
20281
20310
  var LONG_PTR_SYM = os4.arch === "x64" ? "PtrW" : "W";
20311
+ var ShowWindow = /* @__PURE__ */ b2("ShowWindow", "<HWND>ptr i32@ShowWindowCmd -> i32");
20282
20312
  var SetWindowPos = /* @__PURE__ */ b2("SetWindowPos", "<HWND>ptr <>ptr@SetWindowPosHwnd i32 i32 i32 i32 u32 -> i32");
20283
20313
  var GetWindowRect = /* @__PURE__ */ b2("GetWindowRect", "<HWND>ptr <RECT>ptr -> i32");
20284
20314
  var GetClientRect = /* @__PURE__ */ b2("GetClientRect", "<HWND>ptr <RECT>ptr -> i32");
@@ -20289,6 +20319,7 @@ var FindWindow = /* @__PURE__ */ b2("FindWindowW", "<WCHAR>ptr <WCHAR>ptr -> <HW
20289
20319
  var FindWindowEx = /* @__PURE__ */ b2("FindWindowExW", "<HWND>ptr <HWND>ptr <WCHAR>ptr <WCHAR>ptr -> <HWND>ptr");
20290
20320
  var GetWindowText = /* @__PURE__ */ b2("GetWindowTextW", "<HWND>ptr <BYTE>ptr i32 -> i32");
20291
20321
  var SetWindowText = /* @__PURE__ */ b2("SetWindowTextW", "<HWND>ptr <WCHAR>ptr -> i32");
20322
+ var GetWindowTextLength = /* @__PURE__ */ b2("GetWindowTextLengthW", "<HWND>ptr -> i32");
20292
20323
  var GetClassName = /* @__PURE__ */ b2("GetClassNameW", "<HWND>ptr <BYTE>ptr i32 -> i32");
20293
20324
  var GetWindowLongPtr = /* @__PURE__ */ b2("GetWindowLong" + LONG_PTR_SYM, "<HWND>ptr i32@Gwlp -> <>ptr");
20294
20325
  var SetWindowLongPtr = /* @__PURE__ */ b2("SetWindowLong" + LONG_PTR_SYM, "<HWND>ptr i32@Gwlp <>ptr -> <>ptr");
@@ -20302,6 +20333,7 @@ var ReleaseDC = /* @__PURE__ */ b2("ReleaseDC", "<HWND>ptr <HDC>ptr! -> i32");
20302
20333
  var PrintWindow = /* @__PURE__ */ b2("PrintWindow", "<HWND>ptr <HDC>ptr! u32 -> i32");
20303
20334
  var DrawText = /* @__PURE__ */ b2("DrawTextW", "<HDC>ptr! <WCHAR>ptr i32 <RECT>ptr i32 -> i32");
20304
20335
  var InvalidateRect = /* @__PURE__ */ b2("InvalidateRect", "<HWND>ptr <RECT>ptr i32 -> i32", { RECT });
20336
+ var UpdateWindow = /* @__PURE__ */ b2("UpdateWindow", "<HWND>ptr -> i32");
20305
20337
  var SetCursor = /* @__PURE__ */ b2("SetCursor", "<HCURSOR>ptr -> <HCURSOR>ptr");
20306
20338
  var LoadCursor = /* @__PURE__ */ b2("LoadCursorW", "<HMODULE>ptr <>ptr -> <HCURSOR>ptr");
20307
20339
  var GetCursorPos = /* @__PURE__ */ b2("GetCursorPos", "<POINT>ptr -> i32");
@@ -20309,8 +20341,11 @@ var ScreenToClient = /* @__PURE__ */ b2("ScreenToClient", "<HWND>ptr <POINT>ptr
20309
20341
  var ClientToScreen = /* @__PURE__ */ b2("ClientToScreen", "<HWND>ptr <POINT>ptr -> i32");
20310
20342
  var INPUTArr = /* @__PURE__ */ structArray(INPUT);
20311
20343
  var SendInput = /* @__PURE__ */ b2("SendInput", "u32 <INPUT>ptr i32 -> u32", { INPUT: INPUTArr });
20344
+ var SetScrollInfo = /* @__PURE__ */ b2("SetScrollInfo", "<HWND>ptr u32 <SCROLLINFO>ptr i32 -> i32", { SCROLLINFO });
20345
+ var GetScrollInfo = /* @__PURE__ */ b2("GetScrollInfo", "<HWND>ptr u32 <SCROLLINFO>ptr -> i32");
20312
20346
  var ShowScrollBar = /* @__PURE__ */ b2("ShowScrollBar", "<HWND>ptr u32 i32 -> i32");
20313
20347
  var GetSystemMetrics = /* @__PURE__ */ b2("GetSystemMetrics", "i32 -> i32");
20348
+ var SystemParametersInfo = /* @__PURE__ */ b2("SystemParametersInfoW", "u32 u32 <BYTE>ptr u32 -> i32");
20314
20349
  var EnumWindows = /* @__PURE__ */ b2("EnumWindows", "<>ptr <>ptr -> i32");
20315
20350
  var EnumDisplaySettings = /* @__PURE__ */ b2("EnumDisplaySettingsW", "<WCHAR>ptr u32 <DEVMODEW>ptr -> i32");
20316
20351
  var ChangeDisplaySettings = /* @__PURE__ */ b2("ChangeDisplaySettingsW", "<DEVMODEW>ptr u32 -> i32");
@@ -20331,10 +20366,35 @@ var CreateCompatibleDC = /* @__PURE__ */ b3("CreateCompatibleDC", "<HDC>ptr -> <
20331
20366
  var CreateCompatibleBitmap = /* @__PURE__ */ b3("CreateCompatibleBitmap", "<HDC>ptr! i32 i32 -> <HGDIOBJ>ptr");
20332
20367
  var SelectObject = /* @__PURE__ */ b3("SelectObject", "<HDC>ptr! <HGDIOBJ>ptr -> <HGDIOBJ>ptr");
20333
20368
  var BitBlt = /* @__PURE__ */ b3("BitBlt", "<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 u32@RasterOp -> i32");
20334
- var GetDIBits = /* @__PURE__ */ b3("GetDIBits", "<HDC>ptr! <HGDIOBJ>ptr u32 u32 <BYTE>ptr <>ptr u32 -> i32");
20369
+ var GetDIBits = /* @__PURE__ */ b3("GetDIBits", "<HDC>ptr! <HGDIOBJ>ptr u32 u32 <BYTE>ptr <>ptr u32@ColorUse -> i32");
20370
+ var CreateDIBSection = /* @__PURE__ */ b3("CreateDIBSection", "<HDC>ptr <>ptr u32@ColorUse <>ptr <>ptr u32 -> <HGDIOBJ>ptr");
20371
+ var SetDIBits = /* @__PURE__ */ b3("SetDIBits", "<HDC>ptr <HGDIOBJ>ptr! u32 u32 <BYTE>ptr <>ptr u32@ColorUse -> i32");
20335
20372
  var GetObject = /* @__PURE__ */ b3("GetObjectW", "<HGDIOBJ>ptr i32 <BYTE>ptr -> i32");
20336
20373
  var DeleteDC = /* @__PURE__ */ b3("DeleteDC", "<HDC>ptr! -> i32");
20337
20374
 
20375
+ // _build/lib/dpi.js
20376
+ function getScaleFactor() {
20377
+ const hdc = GetDC(NULL);
20378
+ const dpi = hdc ? GetDeviceCaps(
20379
+ hdc,
20380
+ 88
20381
+ /* DeviceCap.LOGPIXELSX */
20382
+ ) : 96;
20383
+ if (hdc)
20384
+ ReleaseDC(NULL, hdc);
20385
+ return dpi / 96;
20386
+ }
20387
+ function createSystemDpiFont() {
20388
+ const ncm = NONCLIENTMETRICSW.encode({ cbSize: NONCLIENTMETRICSW.size });
20389
+ if (!SystemParametersInfo(41, NONCLIENTMETRICSW.size, ncm, 0)) {
20390
+ const legacySize = NONCLIENTMETRICSW.size - 4;
20391
+ NONCLIENTMETRICSW.encode({ cbSize: legacySize }, ncm);
20392
+ if (!SystemParametersInfo(41, legacySize, ncm, 0))
20393
+ return NULL;
20394
+ }
20395
+ return CreateFontIndirect(NONCLIENTMETRICSW.decode(ncm).lfMessageFont);
20396
+ }
20397
+
20338
20398
  // _build/lib/react-qw/props.js
20339
20399
  import * as gui from "gui";
20340
20400
  function applyProps(instance, newProps, _oldProps) {
@@ -20358,14 +20418,14 @@ function applyProps(instance, newProps, _oldProps) {
20358
20418
  EnableWindow(hwnd, !newProps.disabled ? 1 : 0);
20359
20419
  }
20360
20420
  if ("hidden" in newProps) {
20361
- gui.ShowWindow(
20421
+ ShowWindow(
20362
20422
  hwnd,
20363
20423
  newProps.hidden ? 0 : 5
20364
20424
  /* ShowWindowCmd.SHOW */
20365
20425
  );
20366
20426
  }
20367
20427
  if ("visible" in newProps) {
20368
- gui.ShowWindow(
20428
+ ShowWindow(
20369
20429
  hwnd,
20370
20430
  newProps.visible ? 5 : 0
20371
20431
  /* ShowWindowCmd.HIDE */
@@ -20485,24 +20545,21 @@ function measureTextForHwnd(hwnd, text) {
20485
20545
  if (hFont)
20486
20546
  SelectObject(hdc, oldFont);
20487
20547
  ReleaseDC(hwnd, hdc);
20488
- const wr2 = gui2.GetWindowRect(hwnd);
20489
- const cr2 = gui2.GetClientRect(hwnd);
20490
- if (wr2 && cr2) {
20491
- result.width += wr2.right - wr2.left - (cr2.right - cr2.left);
20492
- result.height += wr2.bottom - wr2.top - (cr2.bottom - cr2.top);
20548
+ const wr2 = RECT.alloc();
20549
+ const cr2 = RECT.alloc();
20550
+ const okWr = GetWindowRect(hwnd, wr2.ptr);
20551
+ const okCr = GetClientRect(hwnd, cr2.ptr);
20552
+ if (okWr && okCr) {
20553
+ const w2 = RECT.decode(wr2), c2 = RECT.decode(cr2);
20554
+ result.width += w2.right - w2.left - (c2.right - c2.left);
20555
+ result.height += w2.bottom - w2.top - (c2.bottom - c2.top);
20493
20556
  }
20494
20557
  return result;
20495
20558
  }
20496
20559
 
20497
20560
  // _build/lib/react-qw/reconciler.js
20498
- var dpiFont = gui3.CreateSystemDpiFont();
20499
- var scaleFactor = (() => {
20500
- const hdc = GetDC(NULL);
20501
- const dpi = hdc ? GetDeviceCaps(hdc, 88) : 96;
20502
- if (hdc)
20503
- ReleaseDC(NULL, hdc);
20504
- return dpi / 96;
20505
- })();
20561
+ var dpiFont = createSystemDpiFont();
20562
+ var scaleFactor = getScaleFactor();
20506
20563
  var DELAYED_CONTROLS = /* @__PURE__ */ new Set(["SysListView32", "SysTreeView32", "LISTBOX", "COMBOBOX", "msctls_trackbar32", "SysDateTimePick32", "SysLink"]);
20507
20564
  function isDelayedControl(winClass) {
20508
20565
  return DELAYED_CONTROLS.has(winClass);
@@ -20548,11 +20605,12 @@ function runFlexLayout(inst) {
20548
20605
  const visible = children.filter((c2) => !c2.props.hidden);
20549
20606
  if (visible.length === 0)
20550
20607
  return;
20551
- const rect = gui3.GetClientRect(inst.hwnd);
20552
- if (!rect) {
20608
+ const rcBuf = RECT.alloc();
20609
+ if (!GetClientRect(inst.hwnd, rcBuf.ptr)) {
20553
20610
  console.log("flex: no rect for", inst.hwnd, inst.type);
20554
20611
  return;
20555
20612
  }
20613
+ const rect = RECT.decode(rcBuf);
20556
20614
  const pw = (rect.right - rect.left) / scaleFactor;
20557
20615
  const ph = (rect.bottom - rect.top) / scaleFactor;
20558
20616
  if (pw <= 0 || ph <= 0) {
@@ -20753,7 +20811,7 @@ var hostConfig = {
20753
20811
  },
20754
20812
  hideInstance(instance) {
20755
20813
  if (instance.hwnd !== null)
20756
- gui3.ShowWindow(
20814
+ ShowWindow(
20757
20815
  instance.hwnd,
20758
20816
  0
20759
20817
  /* ShowWindowCmd.HIDE */
@@ -20761,7 +20819,7 @@ var hostConfig = {
20761
20819
  },
20762
20820
  hideTextInstance(instance) {
20763
20821
  if (instance.hwnd !== null)
20764
- gui3.ShowWindow(
20822
+ ShowWindow(
20765
20823
  instance.hwnd,
20766
20824
  0
20767
20825
  /* ShowWindowCmd.HIDE */
@@ -20769,7 +20827,7 @@ var hostConfig = {
20769
20827
  },
20770
20828
  unhideInstance(instance, _props) {
20771
20829
  if (instance.hwnd !== null)
20772
- gui3.ShowWindow(
20830
+ ShowWindow(
20773
20831
  instance.hwnd,
20774
20832
  5
20775
20833
  /* ShowWindowCmd.SHOW */
@@ -20777,7 +20835,7 @@ var hostConfig = {
20777
20835
  },
20778
20836
  unhideTextInstance(instance, _text) {
20779
20837
  if (instance.hwnd !== null)
20780
- gui3.ShowWindow(
20838
+ ShowWindow(
20781
20839
  instance.hwnd,
20782
20840
  5
20783
20841
  /* ShowWindowCmd.SHOW */
@@ -21024,11 +21082,10 @@ var DateTimePicker = (0, import_react5.forwardRef)(function DateTimePicker2({ va
21024
21082
  if (!h2)
21025
21083
  return;
21026
21084
  InvalidateRect(h2, NULL, 1);
21027
- const cr2 = gui6.GetClientRect(h2);
21028
- if (cr2) {
21029
- const w2 = cr2.right - cr2.left;
21030
- const hh = cr2.bottom - cr2.top;
21031
- gui6.SendMessage(h2, 5, 0, hh << 16 | w2);
21085
+ const cr2 = RECT.alloc();
21086
+ if (GetClientRect(h2, cr2.ptr)) {
21087
+ const { left, top, right, bottom } = RECT.decode(cr2);
21088
+ gui6.SendMessage(h2, 5, 0, bottom - top << 16 | right - left);
21032
21089
  }
21033
21090
  }, []);
21034
21091
  return (0, import_jsx_runtime4.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e2) => {
@@ -21089,7 +21146,10 @@ var Input = (0, import_react6.forwardRef)(({ value: controlledValue, defaultValu
21089
21146
  const h2 = inputRef.current;
21090
21147
  if (!h2)
21091
21148
  return;
21092
- const newText = gui7.GetWindowText(h2);
21149
+ const cap = GetWindowTextLength(h2) + 1;
21150
+ const buf = WCHAR.alloc(cap);
21151
+ GetWindowText(h2, buf, cap);
21152
+ const newText = WCHAR.decode(buf);
21093
21153
  if (!isControlled)
21094
21154
  setInternalValue(newText);
21095
21155
  onChange?.(newText);
@@ -21177,6 +21237,49 @@ var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
21177
21237
  var import_react9 = __toESM(require_react(), 1);
21178
21238
  import * as gui9 from "gui";
21179
21239
  import * as ffi3 from "ffi";
21240
+
21241
+ // _build/lib/bitmap.js
21242
+ function createBitmapFromPixels(width, height, pixels) {
21243
+ if (width <= 0 || height <= 0)
21244
+ return NULL;
21245
+ const len = width * height * 4;
21246
+ if (pixels.byteLength < len)
21247
+ return NULL;
21248
+ const bi = BITMAPINFOHEADER.encode({
21249
+ biSize: BITMAPINFOHEADER.size,
21250
+ biWidth: width,
21251
+ biHeight: -height,
21252
+ biPlanes: 1,
21253
+ biBitCount: 32
21254
+ });
21255
+ const hbm = CreateDIBSection(NULL, bi.ptr, 0, NULL, NULL, 0);
21256
+ if (!hbm)
21257
+ return NULL;
21258
+ const src = new PtrArrayBuffer(len);
21259
+ new Uint8Array(src).set(new Uint8Array(pixels, 0, len));
21260
+ if (SetDIBits(
21261
+ NULL,
21262
+ hbm,
21263
+ 0,
21264
+ height,
21265
+ src,
21266
+ bi.ptr,
21267
+ 0
21268
+ /* ColorUse.RGB_COLORS */
21269
+ ) !== height) {
21270
+ DeleteObject(hbm);
21271
+ return NULL;
21272
+ }
21273
+ return hbm;
21274
+ }
21275
+
21276
+ // _build/lib/windows/comctl32.js
21277
+ var b4 = (name, sig) => bind2("comctl32.dll", name, sig);
21278
+ var ImageListCreate = /* @__PURE__ */ b4("ImageList_Create", "i32 i32 u32 i32 i32 -> <HIMAGELIST>ptr");
21279
+ var ImageListAdd = /* @__PURE__ */ b4("ImageList_Add", "<HIMAGELIST>ptr <HGDIOBJ>ptr <HGDIOBJ>ptr -> i32");
21280
+ var ImageListDestroy = /* @__PURE__ */ b4("ImageList_Destroy", "<HIMAGELIST>ptr -> i32");
21281
+
21282
+ // _build/lib/react-qw/components/ListView.js
21180
21283
  function writeU32(ptr, offset, v2) {
21181
21284
  ffi3.writeByte(ptr + offset, v2 & 255);
21182
21285
  ffi3.writeByte(ptr + offset + 1, v2 >> 8 & 255);
@@ -21266,7 +21369,7 @@ function resolveCellStyle(columns, data, row, colIndex) {
21266
21369
  }
21267
21370
  function makeLVItem(i2, sub, text, image) {
21268
21371
  const textBuf = WCHAR.encode(text);
21269
- const b8 = LVITEMW.encode({
21372
+ const b9 = LVITEMW.encode({
21270
21373
  mask: 1 | (image !== void 0 ? 2 : 0),
21271
21374
  iItem: i2,
21272
21375
  iSubItem: sub,
@@ -21283,32 +21386,32 @@ function makeLVItem(i2, sub, text, image) {
21283
21386
  piColFmt: 0,
21284
21387
  iGroup: 0
21285
21388
  });
21286
- b8.__textBuf = textBuf;
21287
- return b8;
21389
+ b9.__textBuf = textBuf;
21390
+ return b9;
21288
21391
  }
21289
21392
  var ListView = (0, import_react9.forwardRef)(function ListViewInner({ columns, data, style, icons, iconSize, getIcon }, ref) {
21290
21393
  const lvRef = (0, import_react9.useRef)(null);
21291
- const iconListRef = (0, import_react9.useRef)(0);
21394
+ const iconListRef = (0, import_react9.useRef)(NULL);
21292
21395
  (0, import_react9.useEffect)(() => {
21293
21396
  const h2 = lvRef.current;
21294
21397
  if (!h2)
21295
21398
  return;
21296
21399
  const il = iconListRef.current;
21297
- iconListRef.current = 0;
21400
+ iconListRef.current = NULL;
21298
21401
  if (il) {
21299
21402
  gui9.SendMessage(h2, 4099, 1, 0);
21300
- gui9.ImageListDestroy(il);
21403
+ ImageListDestroy(il);
21301
21404
  }
21302
21405
  if (!icons || icons.length === 0)
21303
21406
  return;
21304
21407
  const size = iconSize ?? 32;
21305
- const img = gui9.ImageListCreate(size, size, 32, icons.length, 1);
21408
+ const img = ImageListCreate(size, size, 32, icons.length, 1);
21306
21409
  if (!img)
21307
21410
  return;
21308
21411
  for (const p2 of icons) {
21309
- const hbm = gui9.CreateBitmapFromPixels(size, size, p2);
21412
+ const hbm = createBitmapFromPixels(size, size, p2);
21310
21413
  if (hbm) {
21311
- gui9.ImageListAdd(img, hbm);
21414
+ ImageListAdd(img, hbm, NULL);
21312
21415
  DeleteObject(hbm);
21313
21416
  }
21314
21417
  }
@@ -21489,22 +21592,19 @@ var RadioButton = (0, import_react11.forwardRef)(({ checked: controlledChecked,
21489
21592
  // _build/lib/react-qw/components/ScrollView.js
21490
21593
  var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
21491
21594
  var import_react12 = __toESM(require_react(), 1);
21492
- import * as gui12 from "gui";
21493
21595
  var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth, contentHeight }, ref) => {
21494
21596
  const svRef = (0, import_react12.useRef)(null);
21495
21597
  const contentRef = (0, import_react12.useRef)(null);
21496
21598
  const scrollXRef = (0, import_react12.useRef)(0);
21497
21599
  const scrollYRef = (0, import_react12.useRef)(0);
21498
21600
  function updateScroll(sv, content) {
21499
- const svRect = gui12.GetClientRect(sv);
21500
- if (!svRect)
21601
+ const svBuf = RECT.alloc();
21602
+ if (!GetClientRect(sv, svBuf.ptr))
21501
21603
  return;
21502
- const svW = svRect.right - svRect.left;
21503
- const svH = svRect.bottom - svRect.top;
21504
- const hdc = GetDC(NULL);
21505
- const scale = hdc ? GetDeviceCaps(hdc, 88) / 96 : 1;
21506
- if (hdc)
21507
- ReleaseDC(NULL, hdc);
21604
+ const { left, top, right, bottom } = RECT.decode(svBuf);
21605
+ const svW = right - left;
21606
+ const svH = bottom - top;
21607
+ const scale = getScaleFactor();
21508
21608
  const natW = Math.round((contentWidth ?? svW / scale) * scale);
21509
21609
  const natH = Math.round((contentHeight ?? svH / scale) * scale);
21510
21610
  scrollXRef.current = Math.max(0, Math.min(scrollXRef.current, natW - svW));
@@ -21521,14 +21621,28 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
21521
21621
  );
21522
21622
  forceFlexLayout(content);
21523
21623
  if (natW > svW) {
21524
- gui12.SetScrollInfo(sv, 0, { min: 0, max: natW - 1, page: svW, pos: scrollXRef.current }, true);
21624
+ SetScrollInfo(sv, 0, {
21625
+ cbSize: SCROLLINFO.size,
21626
+ fMask: 1 | 2 | 4,
21627
+ nMin: 0,
21628
+ nMax: natW - 1,
21629
+ nPage: svW,
21630
+ nPos: scrollXRef.current
21631
+ }, 1);
21525
21632
  ShowScrollBar(sv, 0, 1);
21526
21633
  } else {
21527
21634
  scrollXRef.current = 0;
21528
21635
  ShowScrollBar(sv, 0, 0);
21529
21636
  }
21530
21637
  if (natH > svH) {
21531
- gui12.SetScrollInfo(sv, 1, { min: 0, max: natH - 1, page: svH, pos: scrollYRef.current }, true);
21638
+ SetScrollInfo(sv, 1, {
21639
+ cbSize: SCROLLINFO.size,
21640
+ fMask: 1 | 2 | 4,
21641
+ nMin: 0,
21642
+ nMax: natH - 1,
21643
+ nPage: svH,
21644
+ nPos: scrollYRef.current
21645
+ }, 1);
21532
21646
  ShowScrollBar(sv, 1, 1);
21533
21647
  } else {
21534
21648
  scrollYRef.current = 0;
@@ -21558,15 +21672,21 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
21558
21672
  1 | 4
21559
21673
  /* SetWindowPosFlag.SWP_NOZORDER */
21560
21674
  );
21561
- gui12.SetScrollInfo(sv, bar, { pos: newPos }, true);
21675
+ SetScrollInfo(sv, bar, { cbSize: SCROLLINFO.size, fMask: 4, nPos: newPos }, 1);
21562
21676
  }
21563
21677
  function handleScroll(e2, bar) {
21564
21678
  const sv = svRef.current;
21565
21679
  const content = contentRef.current;
21566
21680
  if (!sv || !content)
21567
21681
  return;
21568
- const info = gui12.GetScrollInfo(sv, bar);
21569
- const maxPos = info.max - info.page + 1;
21682
+ const si = SCROLLINFO.encode({
21683
+ cbSize: SCROLLINFO.size,
21684
+ fMask: 23
21685
+ /* ScrollInfoFlag.ALL */
21686
+ });
21687
+ GetScrollInfo(sv, bar, si.ptr);
21688
+ const info = SCROLLINFO.decode(si);
21689
+ const maxPos = info.nMax - info.nPage + 1;
21570
21690
  const code = e2.wParam & 65535;
21571
21691
  const ref_ = bar === 1 ? scrollYRef : scrollXRef;
21572
21692
  let newPos = ref_.current;
@@ -21577,9 +21697,9 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
21577
21697
  else if (code === 1)
21578
21698
  newPos += 20;
21579
21699
  else if (code === 2)
21580
- newPos -= info.page;
21700
+ newPos -= info.nPage;
21581
21701
  else if (code === 3)
21582
- newPos += info.page;
21702
+ newPos += info.nPage;
21583
21703
  else
21584
21704
  return;
21585
21705
  newPos = Math.max(0, Math.min(maxPos, newPos));
@@ -21599,8 +21719,14 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
21599
21719
  if (!isHorz && contentHeight === void 0)
21600
21720
  return;
21601
21721
  const bar = isHorz ? 0 : 1;
21602
- const info = gui12.GetScrollInfo(sv, bar);
21603
- const maxPos = info.max - info.page + 1;
21722
+ const si = SCROLLINFO.encode({
21723
+ cbSize: SCROLLINFO.size,
21724
+ fMask: 23
21725
+ /* ScrollInfoFlag.ALL */
21726
+ });
21727
+ GetScrollInfo(sv, bar, si.ptr);
21728
+ const info = SCROLLINFO.decode(si);
21729
+ const maxPos = info.nMax - info.nPage + 1;
21604
21730
  const ref_ = isHorz ? scrollXRef : scrollYRef;
21605
21731
  let newPos = ref_.current + dy;
21606
21732
  newPos = Math.max(0, Math.min(maxPos, newPos));
@@ -21648,7 +21774,7 @@ var ScrollView = (0, import_react12.forwardRef)(({ children, style, contentWidth
21648
21774
  // _build/lib/react-qw/components/Slider.js
21649
21775
  var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
21650
21776
  var import_react13 = __toESM(require_react(), 1);
21651
- import * as gui13 from "gui";
21777
+ import * as gui12 from "gui";
21652
21778
  var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 100, vertical = false, disabled, style }, ref) => {
21653
21779
  const wrapperRef = (0, import_react13.useRef)(null);
21654
21780
  const sliderRef = (0, import_react13.useRef)(null);
@@ -21657,14 +21783,14 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
21657
21783
  if (!h2)
21658
21784
  return;
21659
21785
  const lParam = min & 65535 | (max & 65535) << 16;
21660
- gui13.SendMessage(h2, 1030, 0, lParam);
21661
- gui13.SendMessage(h2, 1029, 1, value);
21786
+ gui12.SendMessage(h2, 1030, 0, lParam);
21787
+ gui12.SendMessage(h2, 1029, 1, value);
21662
21788
  }, [min, max]);
21663
21789
  (0, import_react13.useEffect)(() => {
21664
21790
  const h2 = sliderRef.current;
21665
21791
  if (!h2)
21666
21792
  return;
21667
- gui13.SendMessage(h2, 1029, 1, value);
21793
+ gui12.SendMessage(h2, 1029, 1, value);
21668
21794
  }, [value]);
21669
21795
  const tbStyle = 268435456 | 65536 | 1 | (vertical ? 2 : 0);
21670
21796
  return (0, import_jsx_runtime12.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style, ref: (h2) => {
@@ -21681,7 +21807,7 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
21681
21807
  const h2 = sliderRef.current;
21682
21808
  if (!h2)
21683
21809
  return 0;
21684
- const pos = gui13.SendMessage(h2, 1024, 0, 0);
21810
+ const pos = gui12.SendMessage(h2, 1024, 0, 0);
21685
21811
  onChange?.(pos);
21686
21812
  return 0;
21687
21813
  }
@@ -21694,7 +21820,7 @@ var Slider = (0, import_react13.forwardRef)(({ value, onChange, min = 0, max = 1
21694
21820
  // _build/lib/react-qw/components/Tab.js
21695
21821
  var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
21696
21822
  var import_react14 = __toESM(require_react(), 1);
21697
- import * as gui14 from "gui";
21823
+ import * as gui13 from "gui";
21698
21824
  var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex, defaultSelectedIndex = 0, onChange, style }, ref) => {
21699
21825
  const [internalIndex, setInternalIndex] = (0, import_react14.useState)(defaultSelectedIndex);
21700
21826
  const isControlled = controlledIndex !== void 0;
@@ -21704,7 +21830,7 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
21704
21830
  const h2 = tabHwnd.current;
21705
21831
  if (!h2)
21706
21832
  return;
21707
- gui14.SendMessage(h2, 4873, 0, 0);
21833
+ gui13.SendMessage(h2, 4873, 0, 0);
21708
21834
  for (let i2 = 0; i2 < tabs.length; i2++) {
21709
21835
  const titleBuf = WCHAR.encode(tabs[i2].title);
21710
21836
  const tci = TCITEMW.encode({
@@ -21717,14 +21843,14 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
21717
21843
  lParam: 0
21718
21844
  });
21719
21845
  const tciPtr = tci.ptr;
21720
- gui14.SendMessage(h2, 4926, i2, tciPtr);
21846
+ gui13.SendMessage(h2, 4926, i2, tciPtr);
21721
21847
  }
21722
- gui14.SendMessage(h2, 4876, sel, 0);
21848
+ gui13.SendMessage(h2, 4876, sel, 0);
21723
21849
  }, [tabs]);
21724
21850
  (0, import_react14.useEffect)(() => {
21725
21851
  const h2 = tabHwnd.current;
21726
21852
  if (h2)
21727
- gui14.SendMessage(h2, 4876, sel, 0);
21853
+ gui13.SendMessage(h2, 4876, sel, 0);
21728
21854
  }, [sel]);
21729
21855
  return (0, import_jsx_runtime13.jsxs)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e2) => {
21730
21856
  if (e2.msg === 78) {
@@ -21733,7 +21859,7 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
21733
21859
  return;
21734
21860
  const code = nmCode(e2.lParam);
21735
21861
  if (code === -552 || code === -2) {
21736
- const newSel = gui14.SendMessage(h2, 4875, 0, 0);
21862
+ const newSel = gui13.SendMessage(h2, 4875, 0, 0);
21737
21863
  if (newSel !== sel) {
21738
21864
  if (!isControlled)
21739
21865
  setInternalIndex(newSel);
@@ -21746,12 +21872,12 @@ var Tab = (0, import_react14.forwardRef)(({ tabs, selectedIndex: controlledIndex
21746
21872
 
21747
21873
  // _build/lib/react-qw/components/Tooltip.js
21748
21874
  var import_react15 = __toESM(require_react(), 1);
21749
- import * as gui15 from "gui";
21875
+ import * as gui14 from "gui";
21750
21876
 
21751
21877
  // _build/lib/react-qw/components/TreeView.js
21752
21878
  var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
21753
21879
  var import_react16 = __toESM(require_react(), 1);
21754
- import * as gui16 from "gui";
21880
+ import * as gui15 from "gui";
21755
21881
  function buildTvItem(textPtr, cChildren) {
21756
21882
  let mask = 1;
21757
21883
  if (cChildren > 0)
@@ -21776,20 +21902,20 @@ function insertItems(hTree, nodes, parentHandle, hItemMap, keyMap) {
21776
21902
  const itemBuf = buildTvItem(textBuf.ptr, cChildren);
21777
21903
  const item = TVITEM.decode(itemBuf);
21778
21904
  const tvins = TVINSERTSTRUCT.encode({ hParent: parentHandle, hInsertAfter: -65536, item });
21779
- const hItem = gui16.SendMessage(hTree, 4402, 0, tvins.ptr);
21905
+ const hItem = gui15.SendMessage(hTree, 4402, 0, tvins.ptr);
21780
21906
  hItemMap.set(hItem, node);
21781
21907
  if (node.key)
21782
21908
  keyMap.set(node.key, hItem);
21783
21909
  if (node.children && node.children.length > 0) {
21784
21910
  insertItems(hTree, node.children, hItem, hItemMap, keyMap);
21785
- gui16.SendMessage(hTree, 4354, 2, hItem);
21911
+ gui15.SendMessage(hTree, 4354, 2, hItem);
21786
21912
  }
21787
21913
  }
21788
21914
  }
21789
21915
  function deleteAllItems(hTree) {
21790
- const n2 = gui16.SendMessage(hTree, 4357, 0, 0);
21916
+ const n2 = gui15.SendMessage(hTree, 4357, 0, 0);
21791
21917
  if (n2 > 0)
21792
- gui16.SendMessage(
21918
+ gui15.SendMessage(
21793
21919
  hTree,
21794
21920
  4353,
21795
21921
  1,
@@ -21821,7 +21947,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
21821
21947
  const h2 = tvRef.current;
21822
21948
  if (!h2)
21823
21949
  return;
21824
- gui16.SendMessage(
21950
+ gui15.SendMessage(
21825
21951
  h2,
21826
21952
  4396,
21827
21953
  0,
@@ -21837,7 +21963,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
21837
21963
  return;
21838
21964
  const hItem = keyMapRef.current.get(selKey);
21839
21965
  if (hItem !== void 0)
21840
- gui16.SendMessage(h2, 4363, 9, hItem);
21966
+ gui15.SendMessage(h2, 4363, 9, hItem);
21841
21967
  }, [selKey]);
21842
21968
  return (0, import_jsx_runtime14.jsx)("w", { type: "STATIC", ws: 268435456 | 33554432, style: { ...style, flexDirection: "column", alignItems: "stretch" }, ref, onEvent: (e2) => {
21843
21969
  if (e2.msg === 78) {
@@ -21846,7 +21972,7 @@ var TreeView = (0, import_react16.forwardRef)(function TreeViewInner({ data, onS
21846
21972
  const h2 = tvRef.current;
21847
21973
  if (!h2)
21848
21974
  return;
21849
- const hCaret = gui16.SendMessage(h2, 4362, 9, 0);
21975
+ const hCaret = gui15.SendMessage(h2, 4362, 9, 0);
21850
21976
  const node = hItemMapRef.current.get(hCaret) ?? null;
21851
21977
  const key = node?.key ?? null;
21852
21978
  if (!isControlled)
@@ -21864,24 +21990,24 @@ var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
21864
21990
  var import_react17 = __toESM(require_react(), 1);
21865
21991
 
21866
21992
  // _build/lib/windows/comdlg32.js
21867
- var b4 = (name, sig) => bind2("comdlg32.dll", name, sig);
21868
- var GetOpenFileName = /* @__PURE__ */ b4("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
21993
+ var b5 = (name, sig) => bind2("comdlg32.dll", name, sig);
21994
+ var GetOpenFileName = /* @__PURE__ */ b5("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
21869
21995
 
21870
21996
  // _build/lib/windows/shell32.js
21871
- var b5 = (name, sig, encoders) => bind2("shell32.dll", name, sig, encoders);
21872
- var SHBrowseForFolder = /* @__PURE__ */ b5("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
21873
- var SHGetPathFromIDList = /* @__PURE__ */ b5("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
21997
+ var b6 = (name, sig, encoders) => bind2("shell32.dll", name, sig, encoders);
21998
+ var SHBrowseForFolder = /* @__PURE__ */ b6("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
21999
+ var SHGetPathFromIDList = /* @__PURE__ */ b6("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
21874
22000
  var Shell_NotifyIconGetRect = (() => {
21875
22001
  try {
21876
- return b5("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
22002
+ return b6("Shell_NotifyIconGetRect", "<NOTIFYICONIDENTIFIER>ptr <RECT>ptr -> i32", { NOTIFYICONIDENTIFIER });
21877
22003
  } catch {
21878
22004
  return null;
21879
22005
  }
21880
22006
  })();
21881
22007
 
21882
22008
  // _build/lib/windows/ole32.js
21883
- var b6 = (name, sig) => bind2("ole32.dll", name, sig);
21884
- var CoTaskMemFree = /* @__PURE__ */ b6("CoTaskMemFree", "<>ptr -> void");
22009
+ var b7 = (name, sig) => bind2("ole32.dll", name, sig);
22010
+ var CoTaskMemFree = /* @__PURE__ */ b7("CoTaskMemFree", "<>ptr -> void");
21885
22011
 
21886
22012
  // _build/lib/react-qw/components/PathPicker.js
21887
22013
  function openFileDialog(owner, filter, title, multiple) {
@@ -21976,7 +22102,7 @@ var rootMap = /* @__PURE__ */ new Map();
21976
22102
  function ensureDefaultClass() {
21977
22103
  if (defaultClassRegistered)
21978
22104
  return DEFAULT_CLASS;
21979
- gui17.RegisterClass(DEFAULT_CLASS, (hwnd, msg, wParam, lParam) => {
22105
+ gui16.RegisterClass(DEFAULT_CLASS, (hwnd, msg, wParam, lParam) => {
21980
22106
  const entry = rootMap.get(hwnd);
21981
22107
  if (msg === 2 && entry) {
21982
22108
  rootMap.delete(hwnd);
@@ -22002,15 +22128,27 @@ function createRoot(container) {
22002
22128
  const ws = (cfg2.ws ?? 0) | 13565952;
22003
22129
  const w2 = (cfg2.width ?? 800) * scaleFactor;
22004
22130
  const h2 = (cfg2.height ?? 600) * scaleFactor;
22005
- const [sw, sh] = [GetSystemMetrics(0), GetSystemMetrics(1)];
22131
+ const [sw, sh] = [GetSystemMetrics(
22132
+ 0
22133
+ /* SysMetrics.CXSCREEN */
22134
+ ), GetSystemMetrics(
22135
+ 1
22136
+ /* SysMetrics.CYSCREEN */
22137
+ )];
22006
22138
  const x2 = cfg2.x === void 0 ? (sw - w2) / 2 | 0 : cfg2.x === -2147483648 ? -2147483648 : cfg2.x * scaleFactor;
22007
22139
  const y2 = cfg2.y === void 0 ? (sh - h2) / 2 | 0 : cfg2.y === -2147483648 ? -2147483648 : cfg2.y * scaleFactor;
22008
- const hwin = gui17.CreateWindow(className, cfg2.text || "", ws, x2, y2, w2, h2, null, null);
22140
+ const hwin = gui16.CreateWindow(className, cfg2.text || "", ws, x2, y2, w2, h2, null, null);
22009
22141
  if (!hwin)
22010
22142
  throw new Error("CreateWindow failed");
22011
22143
  hwnd = hwin;
22012
- if (!cfg2.noShowWindow)
22013
- gui17.ShowWindow(hwnd);
22144
+ if (!cfg2.noShowWindow) {
22145
+ ShowWindow(
22146
+ hwnd,
22147
+ 1
22148
+ /* ShowWindowCmd.SHOWNORMAL */
22149
+ );
22150
+ UpdateWindow(hwnd);
22151
+ }
22014
22152
  } else {
22015
22153
  hwnd = container;
22016
22154
  }
@@ -22034,20 +22172,20 @@ function createRoot(container) {
22034
22172
  var import_react18 = __toESM(require_react(), 1);
22035
22173
 
22036
22174
  // _build/lib/windows/kernel32.js
22037
- var b7 = (name, sig, encoders) => bind2("kernel32.dll", name, sig, encoders);
22038
- var CloseHandle = /* @__PURE__ */ b7("CloseHandle", "<>ptr -> i32");
22039
- var OpenProcess = /* @__PURE__ */ b7("OpenProcess", "u32 i32 u32 -> <HPROCESS>ptr");
22040
- var GetCurrentProcess = /* @__PURE__ */ b7("GetCurrentProcess", " -> <HPROCESS>ptr");
22041
- var VirtualAllocEx = /* @__PURE__ */ b7("VirtualAllocEx", "<HPROCESS>ptr <>ptr <>ptr u32 u32 -> <>ptr");
22042
- var VirtualFreeEx = /* @__PURE__ */ b7("VirtualFreeEx", "<HPROCESS>ptr <>ptr <>ptr u32 -> i32");
22043
- var ReadProcessMemory = /* @__PURE__ */ b7("ReadProcessMemory", "<HPROCESS>ptr <>ptr <BYTE>ptr <>ptr <>ptr -> i32");
22044
- var MoveFileEx = /* @__PURE__ */ b7("MoveFileExW", "<WCHAR>ptr! <WCHAR>ptr! u32 -> i32");
22045
- var GetLastError = /* @__PURE__ */ b7("GetLastError", " -> u32");
22046
- var IsWow64Process = /* @__PURE__ */ b7("IsWow64Process", "<HPROCESS>ptr <BYTE>ptr -> i32");
22175
+ var b8 = (name, sig, encoders) => bind2("kernel32.dll", name, sig, encoders);
22176
+ var CloseHandle = /* @__PURE__ */ b8("CloseHandle", "<>ptr -> i32");
22177
+ var OpenProcess = /* @__PURE__ */ b8("OpenProcess", "u32 i32 u32 -> <HPROCESS>ptr");
22178
+ var GetCurrentProcess = /* @__PURE__ */ b8("GetCurrentProcess", " -> <HPROCESS>ptr");
22179
+ var VirtualAllocEx = /* @__PURE__ */ b8("VirtualAllocEx", "<HPROCESS>ptr <>ptr <>ptr u32 u32 -> <>ptr");
22180
+ var VirtualFreeEx = /* @__PURE__ */ b8("VirtualFreeEx", "<HPROCESS>ptr <>ptr <>ptr u32 -> i32");
22181
+ var ReadProcessMemory = /* @__PURE__ */ b8("ReadProcessMemory", "<HPROCESS>ptr <>ptr <BYTE>ptr <>ptr <>ptr -> i32");
22182
+ var MoveFileEx = /* @__PURE__ */ b8("MoveFileExW", "<WCHAR>ptr! <WCHAR>ptr! u32 -> i32");
22183
+ var GetLastError = /* @__PURE__ */ b8("GetLastError", " -> u32");
22184
+ var IsWow64Process = /* @__PURE__ */ b8("IsWow64Process", "<HPROCESS>ptr <BYTE>ptr -> i32");
22047
22185
 
22048
22186
  // _build/examples/execd/tray.js
22049
22187
  import * as os6 from "os";
22050
- import * as gui18 from "gui";
22188
+ import * as gui17 from "gui";
22051
22189
  var TB_GETBUTTON = 1047;
22052
22190
  var TB_BUTTONCOUNT = 1048;
22053
22191
  var TB_GETITEMRECT = 1053;
@@ -22078,7 +22216,7 @@ function findToolbars(root) {
22078
22216
  return out;
22079
22217
  }
22080
22218
  function readToolbar(tb, area, out) {
22081
- const count = gui18.SendMessage(tb, TB_BUTTONCOUNT, 0, 0);
22219
+ const count = gui17.SendMessage(tb, TB_BUTTONCOUNT, 0, 0);
22082
22220
  if (!Number.isInteger(count) || count <= 0 || count > 512)
22083
22221
  return;
22084
22222
  const pidBuf = BYTE.alloc(4);
@@ -22097,7 +22235,7 @@ function readToolbar(tb, area, out) {
22097
22235
  const tbBuf = BYTE.alloc(REMOTE_BUF), trBuf = BYTE.alloc(REMOTE_BUF), tipBuf = BYTE.alloc(REMOTE_BUF);
22098
22236
  const dvTb = new DataView(tbBuf), dvTr = new DataView(trBuf);
22099
22237
  for (let i2 = 0; i2 < count; i2++) {
22100
- if (!gui18.SendMessage(tb, TB_GETBUTTON, i2, remote))
22238
+ if (!gui17.SendMessage(tb, TB_GETBUTTON, i2, remote))
22101
22239
  continue;
22102
22240
  if (!ReadProcessMemory(proc, remote, tbBuf, TBBUTTON_SZ, NULL))
22103
22241
  continue;
@@ -22111,14 +22249,14 @@ function readToolbar(tb, area, out) {
22111
22249
  if (!hWnd || !IsWindow(hWnd))
22112
22250
  continue;
22113
22251
  let rect = null;
22114
- if (gui18.SendMessage(tb, TB_GETITEMRECT, i2, remote) && ReadProcessMemory(proc, remote, trBuf, 16, NULL)) {
22252
+ if (gui17.SendMessage(tb, TB_GETITEMRECT, i2, remote) && ReadProcessMemory(proc, remote, trBuf, 16, NULL)) {
22115
22253
  const L2 = dvTr.getInt32(0, true), T2 = dvTr.getInt32(4, true);
22116
22254
  const R2 = dvTr.getInt32(8, true), B2 = dvTr.getInt32(12, true);
22117
22255
  if (!(L2 === 0 && T2 === 0 && R2 === 0 && B2 === 0)) {
22118
22256
  const tl = POINT.encode({ x: L2, y: T2 }), br2 = POINT.encode({ x: R2, y: B2 });
22119
22257
  if (ClientToScreen(tb, tl.ptr) && ClientToScreen(tb, br2.ptr)) {
22120
- const a2 = POINT.decode(tl), b8 = POINT.decode(br2);
22121
- rect = { left: a2.x, top: a2.y, right: b8.x, bottom: b8.y };
22258
+ const a2 = POINT.decode(tl), b9 = POINT.decode(br2);
22259
+ rect = { left: a2.x, top: a2.y, right: b9.x, bottom: b9.y };
22122
22260
  }
22123
22261
  }
22124
22262
  }
@@ -22188,25 +22326,25 @@ function probeTrayIcon(hWnd, uID) {
22188
22326
 
22189
22327
  // _build/examples/execd/main.js
22190
22328
  function parseArgs() {
22191
- let gui20 = true;
22329
+ let gui18 = true;
22192
22330
  let token = null;
22193
22331
  const args = typeof scriptArgs === "undefined" ? [] : scriptArgs;
22194
22332
  const normToken2 = (v2) => v2 === "" ? null : v2;
22195
22333
  for (let i2 = 0; i2 < args.length; i2++) {
22196
22334
  const a2 = args[i2] ?? "";
22197
22335
  if (a2 === "--nogui") {
22198
- gui20 = false;
22336
+ gui18 = false;
22199
22337
  } else if (a2 === "--gui") {
22200
- gui20 = (args[++i2] ?? "") !== "0";
22338
+ gui18 = (args[++i2] ?? "") !== "0";
22201
22339
  } else if (a2.startsWith("--gui=")) {
22202
- gui20 = a2.slice(6) !== "0";
22340
+ gui18 = a2.slice(6) !== "0";
22203
22341
  } else if (a2 === "--token") {
22204
22342
  token = normToken2(args[++i2] ?? "");
22205
22343
  } else if (a2.startsWith("--token=")) {
22206
22344
  token = normToken2(a2.slice(8));
22207
22345
  }
22208
22346
  }
22209
- return { gui: gui20, token };
22347
+ return { gui: gui18, token };
22210
22348
  }
22211
22349
  var cfg = parseArgs();
22212
22350
  var log = new RequestLog(100);
@@ -22270,7 +22408,7 @@ function initGui() {
22270
22408
  height: 420
22271
22409
  });
22272
22410
  root.render((0, import_jsx_runtime16.jsx)(LogPanel, {}));
22273
- gui19.ShowWindow(
22411
+ ShowWindow(
22274
22412
  root.hwnd,
22275
22413
  9
22276
22414
  /* ShowWindowCmd.RESTORE */
@@ -22302,7 +22440,7 @@ function authCheck(req) {
22302
22440
  }
22303
22441
  function runInWorker(cmd, signal, timeoutMs) {
22304
22442
  const spawnCmd = cmd;
22305
- const worker = new os7.Worker("data:text/javascript;base64,aW1wb3J0KmFzIE90IGZyb20ib3MiO2ltcG9ydCphcyBQdCBmcm9tInN0ZCI7aW1wb3J0KmFzIEMgZnJvbSJmZmkiO2ltcG9ydCphcyBkdCBmcm9tIm9zIjtpbXBvcnQqYXMgbXQgZnJvbSJzdGQiO2ltcG9ydCphcyAkIGZyb20id2luIjt2YXIgQXQ9eyJ1dGYtOCI6InV0Zi04Iix1dGY4OiJ1dGYtOCIsInVuaWNvZGUtMS0xLXV0Zi04IjoidXRmLTgiLCJ1dGYtMTYiOiJ1dGYtMTZsZSIsInV0Zi0xNmxlIjoidXRmLTE2bGUiLCJ1dGYtMTZiZSI6InV0Zi0xNmJlIn07ZnVuY3Rpb24gc3QodCl7aWYoIXQpcmV0dXJuInV0Zi04IjtsZXQgZT1BdFt0LnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtpZihlKXJldHVybiBlO3Rocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgZW5jb2RpbmcgbGFiZWwgIiR7dH0iIGlzIG5vdCBzdXBwb3J0ZWRgKX1mdW5jdGlvbiBNdCh0LGUpe2xldCByPSIiO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KXtsZXQgbz10W24rK107aWYobzwxMjgpe3IrPVN0cmluZy5mcm9tQ2hhckNvZGUobyk7Y29udGludWV9aWYobzwxOTIpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZSIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1sZXQgaSxjO2lmKG88MjI0KXtpZihuPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbisrXTtpZigocyYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShvJjMxKTw8NnxzJjYzLGM9MTI4fWVsc2UgaWYobzwyNDApe2lmKG4rMT49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W24rK10sdT10W24rK107aWYoKHMmMTkyKSE9PTEyOHx8KHUmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obyYxNSk8PDEyfChzJjYzKTw8Nnx1JjYzLGM9MjA0OH1lbHNlIGlmKG88MjQ4KXtpZihuKzI+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtuKytdLHU9dFtuKytdLHA9dFtuKytdO2lmKChzJjE5MikhPT0xMjh8fCh1JjE5MikhPT0xMjh8fChwJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG8mNyk8PDE4fChzJjYzKTw8MTJ8KHUmNjMpPDw2fHAmNjMsYz02NTUzNn1lbHNle3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCB1dGYtOCBzdGFydCIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1pZihpPGN8fGk+PTU1Mjk2JiZpPD01NzM0M3x8aT4xMTE0MTExKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdXRmLTggY29kZXBvaW50Iil9KSgpOiJcdUZGRkQiO2NvbnRpbnVlfWk8PTY1NTM1P3IrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk6KGktPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8aT4+MTAsNTYzMjB8aSYxMDIzKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gV3QodCxlLHIpe2xldCBuPW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSxvPSIiO2ZvcihsZXQgaT0wO2krMTx0Lmxlbmd0aDtpKz0yKXtsZXQgYz1uLmdldFVpbnQxNihpLGUpO2lmKGM+PTU1Mjk2JiZjPD01NjMxOSl7aWYoaSs9MixpKzE+PXQubGVuZ3RoKXtvKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInRydW5jYXRlZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz1uLmdldFVpbnQxNihpLGUpO3M+PTU2MzIwJiZzPD01NzM0Mz9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMscyk6KG8rPXI/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIixpLT0yKX1lbHNlIGM+PTU2MzIwJiZjPD01NzM0Mz9vKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHJhaWxpbmcgc3Vycm9nYXRlIil9KSgpOiJcdUZGRkQiOm8rPVN0cmluZy5mcm9tQ2hhckNvZGUoYyl9cmV0dXJuIG99dmFyIFY9Y2xhc3N7X2VuY29kaW5nO19mYXRhbDtfaWdub3JlQk9NO2NvbnN0cnVjdG9yKGUscil7dGhpcy5fZW5jb2Rpbmc9c3QoZSksdGhpcy5fZmF0YWw9cj8uZmF0YWw/PyExLHRoaXMuX2lnbm9yZUJPTT1yPy5pZ25vcmVCT00/PyExfWdldCBlbmNvZGluZygpe3JldHVybiB0aGlzLl9lbmNvZGluZ31nZXQgZmF0YWwoKXtyZXR1cm4gdGhpcy5fZmF0YWx9Z2V0IGlnbm9yZUJPTSgpe3JldHVybiB0aGlzLl9pZ25vcmVCT019ZGVjb2RlKGUpe2lmKCFlKXJldHVybiIiO2xldCByPWUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP25ldyBVaW50OEFycmF5KGUpOm5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO2lmKHRoaXMuX2VuY29kaW5nPT09InV0Zi04IilyZXR1cm4gTXQocix0aGlzLl9mYXRhbCk7bGV0IG49dGhpcy5fZW5jb2Rpbmc9PT0idXRmLTE2bGUiLG89MDtpZihyLmxlbmd0aD49MiYmIXRoaXMuX2lnbm9yZUJPTSl7bGV0IGk9bj9yWzBdOnJbMV0scz0obj9yWzFdOnJbMF0pPDw4fGk7KHM9PT02NTI3OXx8cz09PTY1NTM0KSYmKG89Mil9cmV0dXJuIFd0KHIuc2xpY2Uobyksbix0aGlzLl9mYXRhbCl9fSx2PWNsYXNze19lbmNvZGluZztjb25zdHJ1Y3RvcihlKXt0aGlzLl9lbmNvZGluZz1zdChlKX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fZW5jb2Rpbmd9ZW5jb2RlKGUpe2lmKCFlKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtpZih0aGlzLl9lbmNvZGluZz09PSJ1dGYtOCIpe2xldCBpPVtdO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXtsZXQgcz1lLmNoYXJDb2RlQXQoYyk7aWYoczwxMjgpaS5wdXNoKHMpO2Vsc2UgaWYoczwyMDQ4KWkucHVzaCgxOTJ8cz4+NiwxMjh8cyY2Myk7ZWxzZSBpZihzPDU1Mjk2fHxzPj01NzM0NClpLnB1c2goMjI0fHM+PjEyLDEyOHxzPj42JjYzLDEyOHxzJjYzKTtlbHNle2MrKztsZXQgdT1lLmNoYXJDb2RlQXQoYyk7cz02NTUzNisoKHMmMTAyMyk8PDEwKXx1JjEwMjMsaS5wdXNoKDI0MHxzPj4xOCwxMjh8cz4+MTImNjMsMTI4fHM+PjYmNjMsMTI4fHMmNjMpfX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaSl9bGV0IHI9dGhpcy5fZW5jb2Rpbmc9PT0idXRmLTE2bGUiLG49bmV3IEFycmF5QnVmZmVyKGUubGVuZ3RoKjIpLG89bmV3IERhdGFWaWV3KG4pO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKW8uc2V0VWludDE2KGkqMixlLmNoYXJDb2RlQXQoaSkscik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pfX07dHlwZW9mIGdsb2JhbFRoaXMuVGV4dERlY29kZXI+InUiJiYoZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj1WKTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RW5jb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHRFbmNvZGVyPXYpO2ltcG9ydHtidWZmZXJQdHIgYXMgUnR9ZnJvbSJmZmkiO2ltcG9ydCphcyBjdCBmcm9tIm9zIjt2YXIga3Q9WyJ2b2lkIiwidTgiLCJpOCIsInUxNiIsImkxNiIsInUzMiIsImkzMiIsInU2NCIsImk2NCIsImYzMiIsImY2NCIsInB0ciJdLGo9L148KFtBLVphLXpfXVx3KnwpPnB0cighfEBbQS1aYS16X11cdyopPyQvO2Z1bmN0aW9uIE4odCl7cmV0dXJuIGoudGVzdCh0KX12YXIgdXQ9L148KFtBLVphLXpfXVx3Kik+JC87ZnVuY3Rpb24geSh0KXtyZXR1cm4gdXQudGVzdCh0KX1mdW5jdGlvbiBXKHQpe3JldHVybiB1dC5leGVjKHQpPy5bMV18fCIifWZ1bmN0aW9uIFgodCl7cmV0dXJuIGouZXhlYyh0KT8uWzFdfHwiIn12YXIgYXQ9dD0+e2lmKE4odCkpcmV0dXJuInB0ciI7aWYoeSh0KSl0aHJvdyBuZXcgRXJyb3IoYGZmaTogY1Rva2VuVG9UeXBlOiBieS12YWx1ZSB0b2tlbiAiJHt0fSIgaGFzIG5vIHNjYWxhciBzbG90IHR5cGVgKTtyZXR1cm4gdH0sRD1jdC5hcmNoPT09Ing2NCI/ODo0LFI9e3U4OjEsaTg6MSx1MTY6MixpMTY6Mix1MzI6NCxpMzI6NCx1NjQ6OCxpNjQ6OCxmMzI6NCxmNjQ6OH0sTz0wO2Z1bmN0aW9uIGsodCl7aWYoTih0KSl7bGV0IG89ai5leGVjKHQpLGk9bz8uWzFdfHwiIjtyZXR1cm4gbz8uWzJdPy5zdGFydHNXaXRoKCJAIik/YDwke2l9PnB0cmA6dH1pZih5KHQpKXJldHVybiB0O2xldCBlPXQuaW5kZXhPZigiQCIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dDtpZigoZTwwfHwvXltBLVphLXpfXVx3KiQvLnRlc3QodC5zbGljZShlKzEpKSkmJnIhPT0icHRyIiYma3QuaW5jbHVkZXMocikpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuOiAiK3QpfWZ1bmN0aW9uIHoodCxlLHIpe3N3aXRjaChyKXtjYXNlInU4IjpyZXR1cm4gdC5nZXRVaW50OChlKTtjYXNlImk4IjpyZXR1cm4gdC5nZXRJbnQ4KGUpO2Nhc2UidTE2IjpyZXR1cm4gdC5nZXRVaW50MTYoZSwhMCk7Y2FzZSJpMTYiOnJldHVybiB0LmdldEludDE2KGUsITApO2Nhc2UidTMyIjpyZXR1cm4gdC5nZXRVaW50MzIoZSwhMCk7Y2FzZSJpMzIiOnJldHVybiB0LmdldEludDMyKGUsITApO2Nhc2UidTY0IjpyZXR1cm4gdC5nZXRCaWdVaW50NjQoZSwhMCk7Y2FzZSJpNjQiOnJldHVybiB0LmdldEJpZ0ludDY0KGUsITApO2Nhc2UiZjMyIjpyZXR1cm4gdC5nZXRGbG9hdDMyKGUsITApO2Nhc2UiZjY0IjpyZXR1cm4gdC5nZXRGbG9hdDY0KGUsITApO2Nhc2UicHRyIjpyZXR1cm4gRD09PTg/TnVtYmVyKHQuZ2V0QmlnSW50NjQoZSwhMCkpOnQuZ2V0SW50MzIoZSwhMCl9fWZ1bmN0aW9uIFoodCxlLHtrOnIsdjpufSl7c3dpdGNoKHIpe2Nhc2UidTgiOnQuc2V0VWludDgoZSxOdW1iZXIobikpO2JyZWFrO2Nhc2UiaTgiOnQuc2V0SW50OChlLE51bWJlcihuKSk7YnJlYWs7Y2FzZSJ1MTYiOnQuc2V0VWludDE2KGUsTnVtYmVyKG4pLCEwKTticmVhaztjYXNlImkxNiI6dC5zZXRJbnQxNihlLE51bWJlcihuKSwhMCk7YnJlYWs7Y2FzZSJ1MzIiOnQuc2V0VWludDMyKGUsbj4+PjAsITApO2JyZWFrO2Nhc2UiaTMyIjp0LnNldFVpbnQzMihlLG4+Pj4wLCEwKTticmVhaztjYXNlInU2NCI6dC5zZXRCaWdVaW50NjQoZSxuLCEwKTticmVhaztjYXNlImk2NCI6dC5zZXRCaWdJbnQ2NChlLG4sITApO2JyZWFrO2Nhc2UiZjMyIjp0LnNldEZsb2F0MzIoZSxuLCEwKTticmVhaztjYXNlImY2NCI6dC5zZXRGbG9hdDY0KGUsbiwhMCk7YnJlYWs7Y2FzZSJwdHIiOntpZihuPT1udWxsKXRocm93IG5ldyBFcnJvcigiZmZpOiBnb3QgbnVsbC91bmRlZmluZWQgZm9yIGEgcHRyIHNsb3Q7IHBhc3MgdGhlIGltcG9ydGVkIE5VTEwgY29uc3RhbnQgZm9yIGVtcHR5Iik7RD09PTg/dC5zZXRCaWdVaW50NjQoZSxCaWdJbnQuYXNVaW50Tig2NCxCaWdJbnQobikpLCEwKTp0LnNldFVpbnQzMihlLG4+Pj4wLCEwKTticmVha319fWZ1bmN0aW9uIF8odCxlLHIpe2xldHtrOm4sdjpvfT1yO2lmKG49PT0idTgifHxuPT09Imk4Inx8bj09PSJ1MTYifHxuPT09ImkxNiIpe3Quc2V0VWludDMyKGUsTnVtYmVyKG8pPj4+MCwhMCk7cmV0dXJufVoodCxlLHIpfXZhciB4PWNsYXNzIGV4dGVuZHMgQXJyYXlCdWZmZXJ7cHRyO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMucHRyPVJ0KHRoaXMpfX07ZnVuY3Rpb24gcSh0LGUpe3JldHVybiBlW3RdfXZhciBwdD1uZXcgTWFwO2Z1bmN0aW9uIF90KHQpe2xldCBlPXB0LmdldCh0KTtpZihlIT09dm9pZCAwKXJldHVybiBlO2xldCByPSQuTG9hZExpYnJhcnkodCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogTG9hZExpYnJhcnkoIiR7dH0iKSBmYWlsZWRgKTtyZXR1cm4gcHQuc2V0KHQscikscn1mdW5jdGlvbiBVdCh0KXtsZXQgZT10LnNwbGl0KCIgLT4gIik7aWYoZS5sZW5ndGghPT0yKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IGludmFsaWQgc2lnbmF0dXJlICIke3R9IiAoZXhwZWN0ZWQgImFyZzEgYXJnMiAtPiByZXQiKWApO2xldCByPWVbMF0uc3BsaXQoIiAiKS5maWx0ZXIoaT0+aSE9PSIiKSxuPVtdO2ZvcihsZXQgaSBvZiByKXtsZXQgYz1rKGkpO2lmKGM9PT0idm9pZCIpdGhyb3cgbmV3IEVycm9yKCJWb2lkIGNhbiBub3QgaW4gYXJncyIpO24ucHVzaChjKX1sZXQgbz1rKGVbMV0pO2lmKHkobykpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogIiR7dH0iOiBieS12YWx1ZSBzdHJ1Y3QgYXQgdGhlIHJldHVybiBwb3NpdGlvbiAoPCR7VyhvKX0+KSBpcyBub3Qgc3VwcG9ydGVkIFx1MjAxNCBhcmd1bWVudCBwb3NpdGlvbnMgb25seTsgcGFzcyBhIHN0cnVjdCBvdXQgdGhyb3VnaCBhbiBvdXQtcGFyYW0gc2xvdCBpbnN0ZWFkICg8Tj5wdHIgKyBjYWxsZXIgYnVmZmVyKWApO3JldHVybnthcmdUb2tlbnM6bixyZXRUb2tlbjpvLHNpZzp0fX1mdW5jdGlvbiBCdCh0LGUscixuKXtsZXQgbz1VdChlKTtmb3IobGV0IGkgb2Ygby5hcmdUb2tlbnMpe2lmKCF5KGkpKWNvbnRpbnVlO2xldCBjPVcoaSkscz1xKGMscik7aWYoIXN8fHR5cGVvZiBzLmVuY29kZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke2V9OiBieS12YWx1ZSBwb3NpdGlvbiA8JHtjfT4gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0IChhdmFpbGFibGU6ICR7T2JqZWN0LmtleXMocikuam9pbigiLCAiKXx8Im5vbmUifSlgKTtpZih0eXBlb2Ygcy5zaXplIT0ibnVtYmVyInx8cy5zaXplPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtlfTogYnktdmFsdWUgcG9zaXRpb24gPCR7Y30+IHJlcXVpcmVzIGEgc3RydWN0IGxheW91dCB3aXRoIHNpemUgPj0gMSAoZ290ICR7cy5zaXplfTsgbm9uLXN0cnVjdCBjb2RlY3MgZXhwb3NlIG5vIHNpemUpYCl9cmV0dXJuKC4uLmkpPT56dCh0LG8saSxyLG4pfXZhciBIdD17dTg6NCxpODo0LHUxNjo0LGkxNjo0LHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4LHB0cjpEfSxmdD00O2Z1bmN0aW9uIHp0KHQse2FyZ1Rva2VuczplLHJldFRva2VuOnIsc2lnOm59LG8saSxjKXtsZXQgcz1kdC5hcmNoPT09Ing2NCIsdT0oYSxkKT0+e2lmKHkoYSkpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogZ2V0V2lkdGg6IGJ5LXZhbHVlIHRva2VuICIke2F9IiAoZGlzcGF0Y2hlZCBieSB3aWR0aE9mKWApO3JldHVybiBkPzg6TihhKT9EOkh0W2FdfSxwPWE9PntpZih5KGEpKXtpZihzKXJldHVybiA4O2xldCBkPXEoVyhhKSxpKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtXKGEpfT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7bGV0IG09ZC5zaXplO3JldHVybiBtJTQ9PT0wP206bSs0LW0lNH1yZXR1cm4gdShhLHMpfSxoPTA7Zm9yKGxldCBhIG9mIGUpaCs9cChhKTtzJiZlLmxlbmd0aDxmdCYmKGg9ZnQqOCk7bGV0IEY9bmV3IEFycmF5QnVmZmVyKGgpLGc9bmV3IERhdGFWaWV3KEYpLFQ9W10sRT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgZD1lW2FdLG09ZC5lbmRzV2l0aCgiISIpLGY9b1thXTtpZihOKGQpKXtsZXQgbD1YKGQpO2lmKHR5cGVvZiBmPT0ibnVtYmVyIil7aWYobSYmZj09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtufTogYXJnIyR7YSsxfSA8JHtsfT5wdHIhIGdvdCAwIChudWxsIHBvaW50ZXIgZm9yYmlkZGVuIGhlcmU7IHRoZSB0b2tlbiBtYXJrcyB0aGlzIHBvc2l0aW9uIG5vbi1udWxsKWApO18oZyxFLHtrOiJwdHIiLHY6Zn0pfWVsc2V7aWYoZj09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtsfT5wdHIgZ290ICR7U3RyaW5nKGYpfTsgcGFzcyB0aGUgaW1wb3J0ZWQgTlVMTCBjb25zdGFudCBmb3IgYW4gZW1wdHkgcG9pbnRlcmApO2xldCBJPWlbbF07aWYoIUkpdGhyb3cgbmV3IEVycm9yKGw9PT0iIj9gZmZpLWJpbmQ6IDw+cHRyIGV4cGVjdHMgbnVtYmVyIChOVUxMIHwgUHRyKSwgZ290ICR7dHlwZW9mIGZ9OyB1c2UgPEJZVEU+cHRyIHdpdGggYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pKSwgb3IgZmZpLmJ1ZmZlclB0cihidWYpIGZvciBhbiBhZGRyZXNzYDpgZmZpLWJpbmQ6IHVua25vd24gbGF5b3V0ICI8JHtsfT5wdHIiIChhdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCAiKXx8Im5vbmUifSlgKTtpZighSS5lbmNvZGUpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7bH0+cHRyIGhhcyBubyBlbmNvZGVyIChvdXQtb25seSBjb2RlYylgKTtsZXQgTD1JLmVuY29kZShmKTtULnB1c2goTCk7bGV0IEE9TC5wdHI7aWYodHlwZW9mIEEhPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiZmZpLWJpbmQ6IGNvZGVjLmVuY29kZSBtdXN0IHJldHVybiBhIFB0ckFycmF5QnVmZmVyLCBnb3QgcGxhaW4gQXJyYXlCdWZmZXIiKTtpZihtJiZBPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke259OiBhcmcjJHthKzF9IDwke2x9PnB0ciEgZW5jb2RlIHByb2R1Y2VkIDAgKG51bGwgcG9pbnRlciBmb3JiaWRkZW4gaGVyZSlgKTtfKGcsRSx7azoicHRyIix2OkF9KX19ZWxzZSBpZih5KGQpKXtsZXQgbD1XKGQpLEk9cShsLGkpO2lmKCFJKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7bn06IGFyZyMke2ErMX0gPCR7bH0+IGJ5LXZhbHVlIHBvc2l0aW9uIGhhcyBubyByZWdpc3RlcmVkIGxheW91dGApO2lmKGY9PW51bGwpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7bH0+IHZhbHVlIHBvc2l0aW9uIGdvdCAke1N0cmluZyhmKX07IHBhc3MgYSBzdHJ1Y3Qgb2JqZWN0ICh1c2UgPCR7bH0+cHRyIHRvIHBhc3MgYSBwb2ludGVyKWApO2xldCBMPUkuc2l6ZTtpZighc3x8TDw9OCYmKEwmTC0xKT09PTApSS5lbmNvZGUoZixGLEUpO2Vsc2V7bGV0IEE9bmV3IEFycmF5QnVmZmVyKEwrMTUpLG90PUMuYnVmZmVyUHRyKEEpLGl0PSgxNi1vdCUxNiklMTY7SS5lbmNvZGUoZixBLGl0KSxULnB1c2goQSksXyhnLEUse2s6InB0ciIsdjpvdCtpdH0pfX1lbHNlIF8oZyxFLHtrOmQsdjpmfSk7RSs9cChkKX1sZXQgUD1uZXcgQXJyYXlCdWZmZXIoOCk7Qy5mZmlDYWxsKHQsRixQLHI9PT0iZjMyInx8cj09PSJmNjQiPzE6MCk7bGV0IFM9JHQoYXQociksUCk7aWYoci5lbmRzV2l0aCgiISIpJiZTPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke259OiByZXR1cm4gJHtyfSBnb3QgMCAodGhlIHRva2VuIHByb21pc2VzIEMgbmV2ZXIgcmV0dXJucyBudWxsIGhlcmUpYCk7aWYoTihyKSYmUyE9PTApe2xldCBhPVgocik7aWYoYSE9PSIiKXtsZXQgZD1jW2FdO2lmKGQ/LmRlY29kZSlyZXR1cm4gZC5kZWNvZGUoUyl9fXJldHVybiBTfWZ1bmN0aW9uICR0KHQsZSl7aWYodCE9PSJ2b2lkIilyZXR1cm4geihuZXcgRGF0YVZpZXcoZSksMCx0KX12YXIgRz17ZW5jb2RlOnQ9PntsZXQgZT1uZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIikuZW5jb2RlKHQrIlwwIikscj1uZXcgeChlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheShyKS5zZXQoZSkscn0sZGVjb2RlOnQ9PntpZih0eXBlb2YgdD09Im51bWJlciIpe2xldCBvPSIiLGk9dCxjPWk7Zm9yKDs7KXtsZXQgcz1DLnJlYWRCeXRlKGkpLHU9Qy5yZWFkQnl0ZShpKzEpO2lmKHM9PT0wJiZ1PT09MClyZXR1cm4gbztpZihvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHN8dTw8OCksaSs9MixpLWM+MTw8MjEpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogV0NIQVIgZGVjb2RlIGV4Y2VlZGVkIDRNaUIgd2l0aG91dCBOVUwiKX19bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCkscj1lLmxlbmd0aCYtMixuPSIiO2ZvcihsZXQgbz0wO288cjtvKz0yKXtsZXQgaT1lW29dfGVbbysxXTw8ODtpZihpPT09MClyZXR1cm4gbjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBufSxhbGxvYzoodD0yNTYpPT5uZXcgeCh0KjIpfSxHdD17ZW5jb2RlOnQ9PntpZighKHQgaW5zdGFuY2VvZiB4KSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiA8QllURT5wdHIgd2FudHMgYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pIC8gQllURS5hbGxvYyAvIHN0cnVjdC5lbmNvZGUpLCBub3QgYSBwbGFpbiBBcnJheUJ1ZmZlciIpO3JldHVybiB0fSxhbGxvYzp0PT5uZXcgeCh0KX0sbHQ9e1dDSEFSOkcsQllURTpHdH07ZnVuY3Rpb24gRXQodCxlLHIsbixvKXtsZXQgaT0kLkdldFByb2NBZGRyZXNzKF90KHQpLGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IHByb2MgIiR7ZX0iIG5vdCBmb3VuZCBpbiAke3R9YCk7bGV0IGM9bz8/bjtyZXR1cm4gQnQoaSxyLHsuLi5sdCwuLi5ufSx7Li4ubHQsLi4uYz8/e319KX12YXIgZmU9bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHQ9PnttdC5wcmludGYoYFtmZmldIGNsb3N1cmUgbGVha2VkIChHQ2VkIHdpdGhvdXQgZGlzcG9zZSk6IHNpZz0iJXMiIHB0cj0weCV4CmAsdC5zaWcsdC5wdHIpfSk7aW1wb3J0KmFzIGh0IGZyb20iZmZpIjtmdW5jdGlvbiBVKHQsZSl7cmV0dXJuIHQrZS0xJn4oZS0xKX12YXIgeHQ9dD0+Ult0XSE9PXZvaWQgMDtmdW5jdGlvbiBLKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIil7bGV0IGU9L14odTh8dTE2KVxbKFxkKylcXUAodXRmLTh8dXRmLTE2bGUpJC8uZXhlYyh0KTtpZihlKXtsZXQgYz1OdW1iZXIoZVsyXSk7aWYoIU51bWJlci5pc0ludGVnZXIoYyl8fGM8MSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHN0cmluZyBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke2N9YCk7bGV0IHM9ZVsxXT09PSJ1OCI/MToyO3JldHVybntzaXplOnMqYyxhbGlnbjpzLHR5cGU6e3RhZzoic3RyaW5nIixlbmNvZGluZzplWzNdfX19bGV0IHI9L14oW15cW1xdXSspXFsoXGQrKVxdJC8uZXhlYyh0KTtpZihyKXtsZXQgYz1OdW1iZXIoclsyXSk7aWYoIU51bWJlci5pc0ludGVnZXIoYyl8fGM8MSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGFycmF5IGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7Y31gKTtsZXQgcz1LKHJbMV0pO2lmKHMudHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOnMuc2l6ZSpjLGFsaWduOnMuYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6cy50eXBlLGVsZW1lbnRTaXplOnMuc2l6ZX19fWxldCBuPS9eKFtBLVphLXpfXVx3Kik6KFxkKykkLy5leGVjKHQpO2lmKG4pe2xldCBjPW5bMV0scz1rKGMpO2lmKCF4dChzKXx8cz09PSJmMzIifHxzPT09ImY2NCIpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB1bml0IG11c3QgYmUgYW4gaW50ZWdlciB0eXBlLCBnb3QgIiR7Y30iYCk7bGV0IHU9TnVtYmVyKG5bMl0pLHA9UltzXSxoPXAqODtpZighTnVtYmVyLmlzSW50ZWdlcih1KXx8dTwxKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogYml0ZmllbGQgd2lkdGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke3V9YCk7aWYodT5oKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogYml0ZmllbGQgd2lkdGggJHt1fSBleGNlZWRzIHVuaXQgd2lkdGggJHtofWApO3JldHVybntzaXplOnAsYWxpZ246cCx0eXBlOnt0YWc6ImJpdGZpZWxkIix1bml0OnMsYml0OjAsd2lkdGg6dX19fWxldCBvPWsodCk7aWYoTihvKSlyZXR1cm57c2l6ZTpELGFsaWduOkQsdHlwZTp7dGFnOiJiYXNpYyIsa2luZDoicHRyIn19O2lmKCF4dChvKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHVua25vd24ga2luZCAiJHt0fSJgKTtsZXQgaT1SW29dO3JldHVybntzaXplOmksYWxpZ246aSx0eXBlOnt0YWc6ImJhc2ljIixraW5kOm99fX1pZih0JiZ0eXBlb2YgdD09Im9iamVjdCIpe2xldCBlPXQscj1lWyIjIl07aWYocj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IG5lc3RlZCBvYmplY3QgdmFsdWUgcmVxdWlyZXMgYSAnIycga2V5ICgnc3RydWN0JyB8ICd1bmlvbicgfCAnYXJyYXknKSIpO2lmKHI9PT0iYXJyYXkiJiYiI3BhY2siaW4gZSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6ICcjcGFjaycgaXMgb25seSBhbGxvd2VkIG9uIHN0cnVjdC91bmlvbiwgZ290ICcke3J9J2ApO2lmKHI9PT0iYXJyYXkiKXtsZXQgbj1lLmxlbmd0aDtpZighTnVtYmVyLmlzSW50ZWdlcihuKXx8bjwxKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogYXJyYXkgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtTdHJpbmcobil9YCk7bGV0IG89SyhlLmVsZW1lbnQpO2lmKG8udHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOm8uc2l6ZSpuLGFsaWduOm8uYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6by50eXBlLGVsZW1lbnRTaXplOm8uc2l6ZX19fWlmKHI9PT0ic3RydWN0Inx8cj09PSJ1bmlvbiIpe2xldCBuPXd0KHQpO3JldHVybntzaXplOm4uc2l6ZSxhbGlnbjpuLm1heEVmZmVjdGl2ZUFsaWduLHR5cGU6e3RhZzpyLGZpZWxkczpuLmZpZWxkc319fXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biAnIycgZGVjbGFyYXRpb24gJHtKU09OLnN0cmluZ2lmeShTdHJpbmcocikpfWApfXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogaW52YWxpZCBtZW1iZXIgdmFsdWU6ICR7U3RyaW5nKHQpfWApfWZ1bmN0aW9uIHd0KHQpe2xldCBlPXRbIiMiXT09PSJzdHJ1Y3QiLHI9dFsiI3BhY2siXT8/OCxuPTEsbz0wLGk9W10sYz0wLHM9LTEsdT0wLHA9MCxoPSgpPT57czwwfHwoYz1VKHMrTWF0aC5jZWlsKHUvOCkscCkscz0tMSl9O2ZvcihsZXRbRixnXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtpZihGLnN0YXJ0c1dpdGgoIiMiKSljb250aW51ZTtsZXQgVD0vXihbXkBdKylAKFxkKykkLy5leGVjKEYpLEU9VD9UWzFdOkYsUD1UP051bWJlcihUWzJdKTowLHtzaXplOncsYWxpZ246Uyx0eXBlOmF9PUsoZyksZD10eXBlb2YgZz09InN0cmluZyImJmcuZW5kc1dpdGgoIiEiKSxtPVM7aWYocj4wJiYobT1NYXRoLm1pbihyLG0pKSxQJiYobT1NYXRoLm1heChtLFApKSxhLnRhZz09PSJiaXRmaWVsZCIpe2lmKEUuc3RhcnRzV2l0aCgiJCIpKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGQgbWVtYmVycyBtdXN0IGJlIG5hbWVkIik7aWYoIWUpe2kucHVzaCh7bmFtZTpFLG9mZnNldDowLHNpemU6dyx0eXBlOnsuLi5hLGJpdDowfX0pLG49TWF0aC5tYXgobixtKSxvPU1hdGgubWF4KG8sdyk7Y29udGludWV9bGV0IGw9YS53aWR0aDsoczwwfHx3IT09cHx8dStsPnAqOCkmJihzPj0wJiZoKCkscz1VKGMsbSksdT0wLHA9dyksaS5wdXNoKHtuYW1lOkUsb2Zmc2V0OnMsc2l6ZTp3LHR5cGU6ey4uLmEsYml0OnV9fSksdSs9bCxuPU1hdGgubWF4KG4sbSksbz1NYXRoLm1heChvLHcpO2NvbnRpbnVlfWgoKTtsZXQgZj1VKGMsbSk7aWYoIUUuc3RhcnRzV2l0aCgiJCIpKWkucHVzaCh7bmFtZTpFLG9mZnNldDpmLHNpemU6dyx0eXBlOmEsLi4uZD97bm9ubnVsbDohMH06e319KTtlbHNle2lmKGEudGFnIT09InN0cnVjdCImJmEudGFnIT09InVuaW9uIil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGFub255bW91cyBtZW1iZXIgIiR7RX0iIG11c3QgYmUgYSBzdHJ1Y3QvdW5pb25gKTtmb3IobGV0IGwgb2YgYS5maWVsZHMpaS5wdXNoKHsuLi5sLG9mZnNldDpsLm9mZnNldCtmfSl9ZSYmKGM9Zit3KSxuPU1hdGgubWF4KG4sbSksbz1NYXRoLm1heChvLHcpfXJldHVybiBoKCkse3NpemU6VShlP2M6byxuKSxtYXhFZmZlY3RpdmVBbGlnbjpuLGZpZWxkczppfX1mdW5jdGlvbiBndCh0LGUscil7bGV0IG49UltyXTtyZXR1cm4gbj09PTE/QmlnSW50KHQuZ2V0VWludDgoZSkpOm49PT0yP0JpZ0ludCh0LmdldFVpbnQxNihlLCEwKSk6bj09PTQ/QmlnSW50KHQuZ2V0VWludDMyKGUsITApKTp0LmdldEJpZ1VpbnQ2NChlLCEwKX1mdW5jdGlvbiBZdCh0LGUscixuKXtsZXQgbz1SW3JdO2lmKG89PT0xKXt0LnNldFVpbnQ4KGUsTnVtYmVyKG4mMHhmZm4pKTtyZXR1cm59aWYobz09PTIpe3Quc2V0VWludDE2KGUsTnVtYmVyKG4mMHhmZmZmbiksITApO3JldHVybn1pZihvPT09NCl7dC5zZXRVaW50MzIoZSxOdW1iZXIobiYweGZmZmZmZmZmbiksITApO3JldHVybn10LnNldEJpZ1VpbnQ2NChlLG4mMHhmZmZmZmZmZmZmZmZmZmZmbiwhMCl9ZnVuY3Rpb24gVnQodCxlLHIpe2xldCBuPUJpZ0ludChyLndpZHRoKSxvPWd0KHQsZSxyLnVuaXQpPj5CaWdJbnQoci5iaXQpJigxbjw8biktMW47cmV0dXJuIHIudW5pdFswXT09PSJpIiYmbyYxbjw8bi0xbiYmKG8tPTFuPDxuKSxyLndpZHRoPjUzP286TnVtYmVyKG8pfWZ1bmN0aW9uIHZ0KHQsZSxyLG4pe2xldCBvPUJpZ0ludChyLndpZHRoKSxpPUJpZ0ludChyLmJpdCksYz0oMW48PG8pLTFuLHM9Yzw8aSx1PWd0KHQsZSxyLnVuaXQpLHA9KHR5cGVvZiBuPT0iYmlnaW50Ij9uOkJpZ0ludChNYXRoLnRydW5jKG4pKSkmYztZdCh0LGUsci51bml0LHUmfnN8cDw8aSl9dmFyIGp0PXsidXRmLTgiOm5ldyBUZXh0RW5jb2RlcigidXRmLTgiKSwidXRmLTE2bGUiOm5ldyBUZXh0RW5jb2RlcigidXRmLTE2bGUiKX0sWHQ9eyJ1dGYtOCI6bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMH0pLCJ1dGYtMTZsZSI6bmV3IFRleHREZWNvZGVyKCJ1dGYtMTZsZSIse2lnbm9yZUJPTTohMH0pfTtmdW5jdGlvbiBadCh0LGUscixuKXtsZXQgbz1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrZSxyKSxpPW49PT0idXRmLTE2bGUiPzI6MSxjPXI7Zm9yKGxldCBzPTA7cytpPD1yO3MrPWkpaWYob1tzXT09PTAmJihpPT09MXx8b1tzKzFdPT09MCkpe2M9czticmVha31yZXR1cm4gWHRbbl0uZGVjb2RlKG8uc3ViYXJyYXkoMCxjKSl9ZnVuY3Rpb24gcXQodCxlLHIsbixvKXtsZXQgaT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrZSxyKTtpLmZpbGwoMCk7bGV0IHM9ci0obj09PSJ1dGYtMTZsZSI/MjoxKTtpZihzPD0wKXJldHVybjtsZXQgdT1qdFtuXS5lbmNvZGUoU3RyaW5nKG8/PyIiKSk7aS5zZXQodS5zdWJhcnJheSgwLE1hdGgubWluKHUubGVuZ3RoLHMpKSl9ZnVuY3Rpb24gS3QodCxlLHIsbil7bGV0IG89bi5lbGVtZW50U2l6ZT4wP3Ivbi5lbGVtZW50U2l6ZTowLGk9W107Zm9yKGxldCBjPTA7YzxvO2MrKylpLnB1c2goVHQodCxlK2Mqbi5lbGVtZW50U2l6ZSxuLmVsZW1lbnRUeXBlLG4uZWxlbWVudFNpemUpKTtyZXR1cm4gaX1mdW5jdGlvbiBRdCh0LGUscixuLG8pe2xldCBpPW4uZWxlbWVudFNpemU+MD9yL24uZWxlbWVudFNpemU6MCxjPW8/P1tdO2ZvcihsZXQgcz0wO3M8aTtzKyspRnQodCxlK3Mqbi5lbGVtZW50U2l6ZSxuLmVsZW1lbnRUeXBlLG4uZWxlbWVudFNpemUsY1tzXSl9ZnVuY3Rpb24gVHQodCxlLHIsbil7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpyZXR1cm4geih0LGUsci5raW5kKTtjYXNlImJpdGZpZWxkIjpyZXR1cm4gVnQodCxlLHIpO2Nhc2Uic3RyaW5nIjpyZXR1cm4gWnQodCxlLG4sci5lbmNvZGluZyk7Y2FzZSJzdHJ1Y3QiOmNhc2UidW5pb24iOnJldHVybiBRKHQsZSxyLmZpZWxkcyk7Y2FzZSJhcnJheSI6cmV0dXJuIEt0KHQsZSxuLHIpfX1mdW5jdGlvbiBGdCh0LGUscixuLG8pe3N3aXRjaChyLnRhZyl7Y2FzZSJiYXNpYyI6Wih0LGUse2s6ci5raW5kLHY6b30pO2JyZWFrO2Nhc2UiYml0ZmllbGQiOnZ0KHQsZSxyLG8/PzApO2JyZWFrO2Nhc2Uic3RyaW5nIjpxdCh0LGUsbixyLmVuY29kaW5nLG8pO2JyZWFrO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpTdCh0LGUsci5maWVsZHMsbz8/e30pO2JyZWFrO2Nhc2UiYXJyYXkiOlF0KHQsZSxuLHIsbyk7YnJlYWt9fWZ1bmN0aW9uIFEodCxlLHIpe2xldCBuPXt9O2ZvcihsZXQgbyBvZiByKXtsZXQgaT1UdCh0LGUrby5vZmZzZXQsby50eXBlLG8uc2l6ZSk7aWYoby5ub25udWxsJiZpPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGRlY29kZTogJyEnIGZpZWxkICIke28ubmFtZX0iIGdvdCAwIChDIGRpZCBub3QgZmlsbCBpdCwgb3IgZGVjb2RlIHdhcyBjYWxsZWQgb24gYW4gdW5maWxsZWQgc2xvdClgKTtuW28ubmFtZV09aX1yZXR1cm4gbn1mdW5jdGlvbiBTdCh0LGUscixuKXtmb3IobGV0IG8gb2YgciluW28ubmFtZV0hPT12b2lkIDAmJkZ0KHQsZStvLm9mZnNldCxvLnR5cGUsby5zaXplLG5bby5uYW1lXSl9ZnVuY3Rpb24gSnQodCl7bGV0e2ZpZWxkczplLHNpemU6cixtYXhFZmZlY3RpdmVBbGlnbjpufT13dCh0KTtyZXR1cm57ZmllbGRzOmUsc2l6ZTpyLHN0cnVjdEFsaWduOm4sZGVjb2RlOm89PlEodHlwZW9mIG89PSJudW1iZXIiP25ldyBEYXRhVmlldyhodC5yZWFkQnl0ZXMobyxyKSk6bmV3IERhdGFWaWV3KG8pLDAsZSksYWxsb2M6KG89PntpZihvIT09dm9pZCAwJiYoIU51bWJlci5pc0ludGVnZXIobyl8fG88MSkpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBhbGxvYyhuKSByZXF1aXJlcyBhbiBpbnRlZ2VyIG4gPj0gMSAoUEFCKDApIG5ldmVyIGVzY2FwZXMgXHUyMDE0IHBhc3MgTlVMTCBmb3IgYW4gZW1wdHkgcG9pbnRlciBwb3NpdGlvbikiKTtyZXR1cm4gbmV3IHgocioobz8/MSkpfSksZW5jb2RlOigobyxpLGMpPT57aWYobz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGVuY29kZSh2KSByZXF1aXJlcyBhbiBhcmd1bWVudDsgdXNlIGFsbG9jKCkgZm9yIGEgemVyb2VkIG91dC1wYXJhbSBzbG90Iik7bGV0IHM9aT8/bmV3IHgocik7cmV0dXJuIFN0KG5ldyBEYXRhVmlldyhzKSxjPz8wLGUsbyksc30pLG9mZnNldE9mOm89Pntmb3IobGV0IGkgb2YgZSlpZihpLm5hbWU9PT1vKXJldHVybiBpLm9mZnNldDt0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IG5vIGZpZWxkICIke299ImApfX19ZnVuY3Rpb24gdGUodCxlLHIpe2xldCBuPWVbIiMiXTtpZihuIT09dm9pZCAwJiZuIT09dCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6ICR7dH0oKSByZWNlaXZlZCBhICcke1N0cmluZyhuKX0nIGRlY2xhcmF0aW9uIChraW5kIG1pc21hdGNoIFx1MjAxNCB1c2UgJHtufSgpIGZvciBpdClgKTtsZXQgbz1lWyIjcGFjayJdO2lmKHI9PT12b2lkIDAmJm8hPT12b2lkIDApcj1vO2Vsc2UgaWYociE9PXZvaWQgMCYmbyE9PXZvaWQgMCYmciE9PW8pdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiAjcGFjayBjb25mbGljdDogb3B0cy5wYWNrPSR7cn0gdnMgZGVjbGFyYXRpb24gJHtTdHJpbmcobyl9YCk7bGV0IGk9eyIjIjp0fTtyIT09dm9pZCAwJiYoaVsiI3BhY2siXT1yKTtmb3IobGV0W2Msc11vZiBPYmplY3QuZW50cmllcyhlKSljLnN0YXJ0c1dpdGgoIiMiKXx8KGlbY109cyk7cmV0dXJuIGl9ZnVuY3Rpb24gQih0LGUscil7bGV0IG49dHlwZW9mIHQ9PSJzdHJpbmciO3JldHVybiBKdCh0ZSgic3RydWN0IixuP2U6dCwobj9yOmUpPy5wYWNrKSl9dmFyIGVlPXsiIyI6InN0cnVjdCIsY2I6InUzMiIsbHBSZXNlcnZlZDoiPD5wdHIiLGxwRGVza3RvcDoiPD5wdHIiLGxwVGl0bGU6Ijw+cHRyIixkd1g6InUzMiIsZHdZOiJ1MzIiLGR3WFNpemU6InUzMiIsZHdZU2l6ZToidTMyIixkd1hDb3VudENoYXJzOiJ1MzIiLGR3WUNvdW50Q2hhcnM6InUzMiIsZHdGaWxsQXR0cmlidXRlOiJ1MzIiLGR3RmxhZ3M6InUzMiIsd1Nob3dXaW5kb3c6InUxNkBTaG93V2luZG93Q21kIixjYlJlc2VydmVkMjoidTE2IixscFJlc2VydmVkMjoiPD5wdHIiLGhTdGRJbnB1dDoiPEhGSUxFPnB0ciIsaFN0ZE91dHB1dDoiPEhGSUxFPnB0ciIsaFN0ZEVycm9yOiI8SEZJTEU+cHRyIn0sWT1CKCJTVEFSVFVQSU5GT1ciLGVlKSxyZT17IiMiOiJzdHJ1Y3QiLGhQcm9jZXNzOiI8SFBST0NFU1M+cHRyISIsaFRocmVhZDoiPEhUSFJFQUQ+cHRyISIsZHdQcm9jZXNzSWQ6InUzMiIsZHdUaHJlYWRJZDoidTMyIn0sSj1CKCJQUk9DRVNTX0lORk9STUFUSU9OIixyZSk7dmFyIGI9KHQsZSxyKT0+RXQoImtlcm5lbDMyLmRsbCIsdCxlLHIpLEl0PWIoIkNyZWF0ZVBpcGUiLCI8PnB0ciA8PnB0ciA8PnB0ciB1MzIgLT4gaTMyIiksdHQ9YigiU2V0SGFuZGxlSW5mb3JtYXRpb24iLCI8SEZJTEU+cHRyISB1MzIgdTMyIC0+IGkzMiIpLEN0PWIoIkNyZWF0ZVByb2Nlc3NXIiwiPFdDSEFSPnB0ciA8V0NIQVI+cHRyIDw+cHRyIDw+cHRyIGkzMiB1MzIgPD5wdHIgPFdDSEFSPnB0ciA8U1RBUlRVUElORk9XPnB0ciA8UFJPQ0VTU19JTkZPUk1BVElPTj5wdHIgLT4gaTMyIix7U1RBUlRVUElORk9XOll9KSxidD1iKCJXYWl0Rm9yU2luZ2xlT2JqZWN0IiwiPD5wdHIgdTMyIC0+IHUzMiIpLE50PWIoIkdldEV4aXRDb2RlUHJvY2VzcyIsIjxIUFJPQ0VTUz5wdHIhIDxCWVRFPnB0ciAtPiBpMzIiKSxNPWIoIkNsb3NlSGFuZGxlIiwiPD5wdHIgLT4gaTMyIik7dmFyIHl0PWIoIlJlYWRGaWxlIiwiPEhGSUxFPnB0ciEgPEJZVEU+cHRyIHUzMiA8QllURT5wdHIgPD5wdHIgLT4gaTMyIik7dmFyIGV0PWIoIkdldExhc3RFcnJvciIsIiAtPiB1MzIiKSxEdD1iKCJHZXRTeXN0ZW1EaXJlY3RvcnlXIiwiPEJZVEU+cHRyIHUzMiAtPiB1MzIiKTt2YXIgbmU9dD0+e3RyeXtsZXQgZT1QdC5vcGVuKCJkaWFnLmxvZyIsImEiKTtlJiYoZS5wdXRzKGAke0RhdGUubm93KCl9ICR7dH0KYCksZS5jbG9zZSgpKX1jYXRjaHt9fSxydD0xLG9lPTI1NixpZT00Mjk0OTY3Mjk1LEg9T3QuV29ya2VyLnBhcmVudCxMdD0iQzpcXFdpbmRvd3NcXFN5c3RlbTMyIjt0cnl7bGV0IHQ9Ry5hbGxvYygyNTYpLHI9RHQodCwyNTYpPjA/Ry5kZWNvZGUodCk6IiI7ciYmKEx0PXIpfWNhdGNoKHQpe25lKCJTWVMtRElSLUZBSUw6ICIrU3RyaW5nKHQpKX12YXIgbnQ9QigiUElQRV9IQU5ETEVTIix7aFJlYWQ6IjxIRklMRT5wdHIhIixoV3JpdGU6IjxIRklMRT5wdHIhIn0pO2Z1bmN0aW9uIHNlKHQsZSl7bGV0IHI9bnQuYWxsb2MoKTtpZighSXQoci5wdHIsci5wdHIrbnQub2Zmc2V0T2YoImhXcml0ZSIpLE8sMCkpdGhyb3cgbmV3IEVycm9yKCJDcmVhdGVQaXBlIGVycj0iK2V0KCkpO2xldHtoUmVhZDpuLGhXcml0ZTpvfT1udC5kZWNvZGUocik7dHQobyxydCxydCksdHQobixydCwwKTtsZXQgaT1KLmFsbG9jKCksYz1gJHtMdH1cXGNtZC5leGUgL3UgL2MgJHtlfWA7aWYoIUN0KE8sYyxPLE8sMSwwLE8sTyx7Y2I6WS5zaXplLGR3RmxhZ3M6b2UsaFN0ZE91dHB1dDpvLGhTdGRFcnJvcjpvfSxpLnB0cikpdGhyb3cgTShuKSxNKG8pLG5ldyBFcnJvcigiQ3JlYXRlUHJvY2Vzc1cgZXJyPSIrZXQoKSsiIGNtZD0iK2MpO2xldHtoUHJvY2VzczpzLGhUaHJlYWQ6dSxkd1Byb2Nlc3NJZDpwfT1KLmRlY29kZShpKTtNKHUpLE0obyksSC5wb3N0TWVzc2FnZSh7dHlwZToiaW5mbyIsaWQ6dCxwaWQ6cH0pO2xldCBoPW5ldyB4KDQwOTYpLEY9bmV3IFVpbnQ4QXJyYXkoaCksZz1uZXcgeCg0KSxUPW5ldyBVaW50MzJBcnJheShnKTtmb3IoO1RbMF09MCwhIXl0KG4saCw0MDk2LGcsTyk7KXtsZXQgUz1UWzBdO2lmKFM9PT0wKWJyZWFrO0gucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6Ri5zbGljZSgwLFMpfSl9YnQocyxpZSk7bGV0IEU9bmV3IHgoNCksUD1uZXcgSW50MzJBcnJheShFKTtOdChzLEUpO2xldCB3PVBbMF07cmV0dXJuIE0obiksTShzKSx3fUgub25tZXNzYWdlPXQ9PntsZXQgZT10LmRhdGE7aWYoZS50eXBlPT09InJ1biImJnR5cGVvZiBlLmNtZD09InN0cmluZyIpe2xldCByPS0xLG49bnVsbDt0cnl7cj1zZShlLmlkLGUuY21kKX1jYXRjaChvKXtuPVN0cmluZyhvKX1ILnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOmUuaWQsY29kZTpyLGVycm9yOm59KX1ILm9ubWVzc2FnZT1udWxsfTsK");
22443
+ const worker = new os7.Worker("data:text/javascript;base64,aW1wb3J0KmFzIER0IGZyb20ib3MiO2ltcG9ydCphcyBPdCBmcm9tInN0ZCI7aW1wb3J0KmFzIGcgZnJvbSJmZmkiO2ltcG9ydCphcyBsdCBmcm9tIm9zIjtpbXBvcnQqYXMgZHQgZnJvbSJzdGQiO3ZhciBMdD17InV0Zi04IjoidXRmLTgiLHV0Zjg6InV0Zi04IiwidW5pY29kZS0xLTEtdXRmLTgiOiJ1dGYtOCIsInV0Zi0xNiI6InV0Zi0xNmxlIiwidXRmLTE2bGUiOiJ1dGYtMTZsZSIsInV0Zi0xNmJlIjoidXRmLTE2YmUifTtmdW5jdGlvbiBpdCh0KXtpZighdClyZXR1cm4idXRmLTgiO2xldCBlPUx0W3QudHJpbSgpLnRvTG93ZXJDYXNlKCldO2lmKGUpcmV0dXJuIGU7dGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSBlbmNvZGluZyBsYWJlbCAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIE10KHQsZSl7bGV0IHI9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDspe2xldCBvPXRbbisrXTtpZihvPDEyOCl7cis9U3RyaW5nLmZyb21DaGFyQ29kZShvKTtjb250aW51ZX1pZihvPDE5Mil7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBieXRlIil9KSgpOiJcdUZGRkQiO2NvbnRpbnVlfWxldCBpLGM7aWYobzwyMjQpe2lmKG4+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtuKytdO2lmKChzJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG8mMzEpPDw2fHMmNjMsYz0xMjh9ZWxzZSBpZihvPDI0MCl7aWYobisxPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbisrXSx1PXRbbisrXTtpZigocyYxOTIpIT09MTI4fHwodSYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShvJjE1KTw8MTJ8KHMmNjMpPDw2fHUmNjMsYz0yMDQ4fWVsc2UgaWYobzwyNDgpe2lmKG4rMj49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W24rK10sdT10W24rK10scD10W24rK107aWYoKHMmMTkyKSE9PTEyOHx8KHUmMTkyKSE9PTEyOHx8KHAmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obyY3KTw8MTh8KHMmNjMpPDwxMnwodSY2Myk8PDZ8cCY2MyxjPTY1NTM2fWVsc2V7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHV0Zi04IHN0YXJ0Iil9KSgpOiJcdUZGRkQiO2NvbnRpbnVlfWlmKGk8Y3x8aT49NTUyOTYmJmk8PTU3MzQzfHxpPjExMTQxMTEpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCB1dGYtOCBjb2RlcG9pbnQiKX0pKCk6Ilx1RkZGRCI7Y29udGludWV9aTw9NjU1MzU/cis9U3RyaW5nLmZyb21DaGFyQ29kZShpKTooaS09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxpPj4xMCw1NjMyMHxpJjEwMjMpKX1yZXR1cm4gcn1mdW5jdGlvbiBBdCh0LGUscil7bGV0IG49bmV3IERhdGFWaWV3KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpLG89IiI7Zm9yKGxldCBpPTA7aSsxPHQubGVuZ3RoO2krPTIpe2xldCBjPW4uZ2V0VWludDE2KGksZSk7aWYoYz49NTUyOTYmJmM8PTU2MzE5KXtpZihpKz0yLGkrMT49dC5sZW5ndGgpe28rPXI/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigidHJ1bmNhdGVkIHN1cnJvZ2F0ZSBwYWlyIil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPW4uZ2V0VWludDE2KGksZSk7cz49NTYzMjAmJnM8PTU3MzQzP28rPVN0cmluZy5mcm9tQ2hhckNvZGUoYyxzKToobys9cj8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1cnJvZ2F0ZSBwYWlyIil9KSgpOiJcdUZGRkQiLGktPTIpfWVsc2UgYz49NTYzMjAmJmM8PTU3MzQzP28rPXI/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0cmFpbGluZyBzdXJyb2dhdGUiKX0pKCk6Ilx1RkZGRCI6bys9U3RyaW5nLmZyb21DaGFyQ29kZShjKX1yZXR1cm4gb312YXIgWT1jbGFzc3tfZW5jb2Rpbmc7X2ZhdGFsO19pZ25vcmVCT007Y29uc3RydWN0b3IoZSxyKXt0aGlzLl9lbmNvZGluZz1pdChlKSx0aGlzLl9mYXRhbD1yPy5mYXRhbD8/ITEsdGhpcy5faWdub3JlQk9NPXI/Lmlnbm9yZUJPTT8/ITF9Z2V0IGVuY29kaW5nKCl7cmV0dXJuIHRoaXMuX2VuY29kaW5nfWdldCBmYXRhbCgpe3JldHVybiB0aGlzLl9mYXRhbH1nZXQgaWdub3JlQk9NKCl7cmV0dXJuIHRoaXMuX2lnbm9yZUJPTX1kZWNvZGUoZSl7aWYoIWUpcmV0dXJuIiI7bGV0IHI9ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZTplIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/bmV3IFVpbnQ4QXJyYXkoZSk6bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7aWYodGhpcy5fZW5jb2Rpbmc9PT0idXRmLTgiKXJldHVybiBNdChyLHRoaXMuX2ZhdGFsKTtsZXQgbj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbz0wO2lmKHIubGVuZ3RoPj0yJiYhdGhpcy5faWdub3JlQk9NKXtsZXQgaT1uP3JbMF06clsxXSxzPShuP3JbMV06clswXSk8PDh8aTsocz09PTY1Mjc5fHxzPT09NjU1MzQpJiYobz0yKX1yZXR1cm4gQXQoci5zbGljZShvKSxuLHRoaXMuX2ZhdGFsKX19LFY9Y2xhc3N7X2VuY29kaW5nO2NvbnN0cnVjdG9yKGUpe3RoaXMuX2VuY29kaW5nPWl0KGUpfWdldCBlbmNvZGluZygpe3JldHVybiB0aGlzLl9lbmNvZGluZ31lbmNvZGUoZSl7aWYoIWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKHRoaXMuX2VuY29kaW5nPT09InV0Zi04Iil7bGV0IGk9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2xldCBzPWUuY2hhckNvZGVBdChjKTtpZihzPDEyOClpLnB1c2gocyk7ZWxzZSBpZihzPDIwNDgpaS5wdXNoKDE5MnxzPj42LDEyOHxzJjYzKTtlbHNlIGlmKHM8NTUyOTZ8fHM+PTU3MzQ0KWkucHVzaCgyMjR8cz4+MTIsMTI4fHM+PjYmNjMsMTI4fHMmNjMpO2Vsc2V7YysrO2xldCB1PWUuY2hhckNvZGVBdChjKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfHUmMTAyMyxpLnB1c2goMjQwfHM+PjE4LDEyOHxzPj4xMiY2MywxMjh8cz4+NiY2MywxMjh8cyY2Myl9fXJldHVybiBuZXcgVWludDhBcnJheShpKX1sZXQgcj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbj1uZXcgQXJyYXlCdWZmZXIoZS5sZW5ndGgqMiksbz1uZXcgRGF0YVZpZXcobik7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspby5zZXRVaW50MTYoaSoyLGUuY2hhckNvZGVBdChpKSxyKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobil9fTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHREZWNvZGVyPVkpO3R5cGVvZiBnbG9iYWxUaGlzLlRleHRFbmNvZGVyPiJ1IiYmKGdsb2JhbFRoaXMuVGV4dEVuY29kZXI9Vik7aW1wb3J0e2J1ZmZlclB0ciBhcyBXdH1mcm9tImZmaSI7aW1wb3J0KmFzIHN0IGZyb20ib3MiO3ZhciBSdD1bInZvaWQiLCJ1OCIsImk4IiwidTE2IiwiaTE2IiwidTMyIiwiaTMyIiwidTY0IiwiaTY0IiwiZjMyIiwiZjY0IiwicHRyIl0sdj0vXjwoW0EtWmEtel9dXHcqfCk+cHRyKCF8QFtBLVphLXpfXVx3Kik/JC87ZnVuY3Rpb24gYih0KXtyZXR1cm4gdi50ZXN0KHQpfXZhciBjdD0vXjwoW0EtWmEtel9dXHcqKT4kLztmdW5jdGlvbiB5KHQpe3JldHVybiBjdC50ZXN0KHQpfWZ1bmN0aW9uIFcodCl7cmV0dXJuIGN0LmV4ZWModCk/LlsxXXx8IiJ9ZnVuY3Rpb24gaih0KXtyZXR1cm4gdi5leGVjKHQpPy5bMV18fCIifXZhciB1dD10PT57aWYoYih0KSlyZXR1cm4icHRyIjtpZih5KHQpKXRocm93IG5ldyBFcnJvcihgZmZpOiBjVG9rZW5Ub1R5cGU6IGJ5LXZhbHVlIHRva2VuICIke3R9IiBoYXMgbm8gc2NhbGFyIHNsb3QgdHlwZWApO3JldHVybiB0fSxEPXN0LmFyY2g9PT0ieDY0Ij84OjQsUj17dTg6MSxpODoxLHUxNjoyLGkxNjoyLHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4fSxPPTA7ZnVuY3Rpb24gayh0KXtpZihiKHQpKXtsZXQgbz12LmV4ZWModCksaT1vPy5bMV18fCIiO3JldHVybiBvPy5bMl0/LnN0YXJ0c1dpdGgoIkAiKT9gPCR7aX0+cHRyYDp0fWlmKHkodCkpcmV0dXJuIHQ7bGV0IGU9dC5pbmRleE9mKCJAIikscj1lPj0wP3Quc2xpY2UoMCxlKTp0O2lmKChlPDB8fC9eW0EtWmEtel9dXHcqJC8udGVzdCh0LnNsaWNlKGUrMSkpKSYmciE9PSJwdHIiJiZSdC5pbmNsdWRlcyhyKSlyZXR1cm4gcjt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gdG9rZW46ICIrdCl9ZnVuY3Rpb24geih0LGUscil7c3dpdGNoKHIpe2Nhc2UidTgiOnJldHVybiB0LmdldFVpbnQ4KGUpO2Nhc2UiaTgiOnJldHVybiB0LmdldEludDgoZSk7Y2FzZSJ1MTYiOnJldHVybiB0LmdldFVpbnQxNihlLCEwKTtjYXNlImkxNiI6cmV0dXJuIHQuZ2V0SW50MTYoZSwhMCk7Y2FzZSJ1MzIiOnJldHVybiB0LmdldFVpbnQzMihlLCEwKTtjYXNlImkzMiI6cmV0dXJuIHQuZ2V0SW50MzIoZSwhMCk7Y2FzZSJ1NjQiOnJldHVybiB0LmdldEJpZ1VpbnQ2NChlLCEwKTtjYXNlImk2NCI6cmV0dXJuIHQuZ2V0QmlnSW50NjQoZSwhMCk7Y2FzZSJmMzIiOnJldHVybiB0LmdldEZsb2F0MzIoZSwhMCk7Y2FzZSJmNjQiOnJldHVybiB0LmdldEZsb2F0NjQoZSwhMCk7Y2FzZSJwdHIiOnJldHVybiBEPT09OD9OdW1iZXIodC5nZXRCaWdJbnQ2NChlLCEwKSk6dC5nZXRJbnQzMihlLCEwKX19ZnVuY3Rpb24gWCh0LGUse2s6cix2Om59KXtzd2l0Y2gocil7Y2FzZSJ1OCI6dC5zZXRVaW50OChlLE51bWJlcihuKSk7YnJlYWs7Y2FzZSJpOCI6dC5zZXRJbnQ4KGUsTnVtYmVyKG4pKTticmVhaztjYXNlInUxNiI6dC5zZXRVaW50MTYoZSxOdW1iZXIobiksITApO2JyZWFrO2Nhc2UiaTE2Ijp0LnNldEludDE2KGUsTnVtYmVyKG4pLCEwKTticmVhaztjYXNlInUzMiI6dC5zZXRVaW50MzIoZSxuPj4+MCwhMCk7YnJlYWs7Y2FzZSJpMzIiOnQuc2V0VWludDMyKGUsbj4+PjAsITApO2JyZWFrO2Nhc2UidTY0Ijp0LnNldEJpZ1VpbnQ2NChlLG4sITApO2JyZWFrO2Nhc2UiaTY0Ijp0LnNldEJpZ0ludDY0KGUsbiwhMCk7YnJlYWs7Y2FzZSJmMzIiOnQuc2V0RmxvYXQzMihlLG4sITApO2JyZWFrO2Nhc2UiZjY0Ijp0LnNldEZsb2F0NjQoZSxuLCEwKTticmVhaztjYXNlInB0ciI6e2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKCJmZmk6IGdvdCBudWxsL3VuZGVmaW5lZCBmb3IgYSBwdHIgc2xvdDsgcGFzcyB0aGUgaW1wb3J0ZWQgTlVMTCBjb25zdGFudCBmb3IgZW1wdHkiKTtEPT09OD90LnNldEJpZ1VpbnQ2NChlLEJpZ0ludC5hc1VpbnROKDY0LEJpZ0ludChuKSksITApOnQuc2V0VWludDMyKGUsbj4+PjAsITApO2JyZWFrfX19ZnVuY3Rpb24gXyh0LGUscil7bGV0e2s6bix2Om99PXI7aWYobj09PSJ1OCJ8fG49PT0iaTgifHxuPT09InUxNiJ8fG49PT0iaTE2Iil7dC5zZXRVaW50MzIoZSxOdW1iZXIobyk+Pj4wLCEwKTtyZXR1cm59WCh0LGUscil9dmFyIHg9Y2xhc3MgZXh0ZW5kcyBBcnJheUJ1ZmZlcntwdHI7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5wdHI9V3QodGhpcyl9fTtmdW5jdGlvbiBaKHQsZSl7cmV0dXJuIGVbdF19dmFyIGF0PW5ldyBNYXA7ZnVuY3Rpb24ga3QodCl7bGV0IGU9YXQuZ2V0KHQpO2lmKGUhPT12b2lkIDApcmV0dXJuIGU7bGV0IHI9Zy5Mb2FkTGlicmFyeSh0KTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBMb2FkTGlicmFyeSgiJHt0fSIpIGZhaWxlZGApO3JldHVybiBhdC5zZXQodCxyKSxyfWZ1bmN0aW9uIF90KHQpe2xldCBlPXQuc3BsaXQoIiAtPiAiKTtpZihlLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogaW52YWxpZCBzaWduYXR1cmUgIiR7dH0iIChleHBlY3RlZCAiYXJnMSBhcmcyIC0+IHJldCIpYCk7bGV0IHI9ZVswXS5zcGxpdCgiICIpLmZpbHRlcihpPT5pIT09IiIpLG49W107Zm9yKGxldCBpIG9mIHIpe2xldCBjPWsoaSk7aWYoYz09PSJ2b2lkIil0aHJvdyBuZXcgRXJyb3IoIlZvaWQgY2FuIG5vdCBpbiBhcmdzIik7bi5wdXNoKGMpfWxldCBvPWsoZVsxXSk7aWYoeShvKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAiJHt0fSI6IGJ5LXZhbHVlIHN0cnVjdCBhdCB0aGUgcmV0dXJuIHBvc2l0aW9uICg8JHtXKG8pfT4pIGlzIG5vdCBzdXBwb3J0ZWQgXHUyMDE0IGFyZ3VtZW50IHBvc2l0aW9ucyBvbmx5OyBwYXNzIGEgc3RydWN0IG91dCB0aHJvdWdoIGFuIG91dC1wYXJhbSBzbG90IGluc3RlYWQgKDxOPnB0ciArIGNhbGxlciBidWZmZXIpYCk7cmV0dXJue2FyZ1Rva2VuczpuLHJldFRva2VuOm8sc2lnOnR9fWZ1bmN0aW9uIFV0KHQsZSxyLG4pe2xldCBvPV90KGUpO2ZvcihsZXQgaSBvZiBvLmFyZ1Rva2Vucyl7aWYoIXkoaSkpY29udGludWU7bGV0IGM9VyhpKSxzPVooYyxyKTtpZighc3x8dHlwZW9mIHMuZW5jb2RlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7ZX06IGJ5LXZhbHVlIHBvc2l0aW9uIDwke2N9PiBoYXMgbm8gcmVnaXN0ZXJlZCBsYXlvdXQgKGF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhyKS5qb2luKCIsICIpfHwibm9uZSJ9KWApO2lmKHR5cGVvZiBzLnNpemUhPSJudW1iZXIifHxzLnNpemU8MSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke2V9OiBieS12YWx1ZSBwb3NpdGlvbiA8JHtjfT4gcmVxdWlyZXMgYSBzdHJ1Y3QgbGF5b3V0IHdpdGggc2l6ZSA+PSAxIChnb3QgJHtzLnNpemV9OyBub24tc3RydWN0IGNvZGVjcyBleHBvc2Ugbm8gc2l6ZSlgKX1yZXR1cm4oLi4uaSk9PkJ0KHQsbyxpLHIsbil9dmFyIEh0PXt1ODo0LGk4OjQsdTE2OjQsaTE2OjQsdTMyOjQsaTMyOjQsdTY0OjgsaTY0OjgsZjMyOjQsZjY0OjgscHRyOkR9LHB0PTQ7ZnVuY3Rpb24gQnQodCx7YXJnVG9rZW5zOmUscmV0VG9rZW46cixzaWc6bn0sbyxpLGMpe2xldCBzPWx0LmFyY2g9PT0ieDY0Iix1PShhLGQpPT57aWYoeShhKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBnZXRXaWR0aDogYnktdmFsdWUgdG9rZW4gIiR7YX0iIChkaXNwYXRjaGVkIGJ5IHdpZHRoT2YpYCk7cmV0dXJuIGQ/ODpiKGEpP0Q6SHRbYV19LHA9YT0+e2lmKHkoYSkpe2lmKHMpcmV0dXJuIDg7bGV0IGQ9WihXKGEpLGkpO2lmKCFkKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IDwke1coYSl9PiBieS12YWx1ZSBwb3NpdGlvbiBoYXMgbm8gcmVnaXN0ZXJlZCBsYXlvdXRgKTtsZXQgbT1kLnNpemU7cmV0dXJuIG0lND09PTA/bTptKzQtbSU0fXJldHVybiB1KGEscyl9LGg9MDtmb3IobGV0IGEgb2YgZSloKz1wKGEpO3MmJmUubGVuZ3RoPHB0JiYoaD1wdCo4KTtsZXQgRj1uZXcgQXJyYXlCdWZmZXIoaCksVD1uZXcgRGF0YVZpZXcoRiksST1bXSxFPTA7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2xldCBkPWVbYV0sbT1kLmVuZHNXaXRoKCIhIiksZj1vW2FdO2lmKGIoZCkpe2xldCBsPWooZCk7aWYodHlwZW9mIGY9PSJudW1iZXIiKXtpZihtJiZmPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke259OiBhcmcjJHthKzF9IDwke2x9PnB0ciEgZ290IDAgKG51bGwgcG9pbnRlciBmb3JiaWRkZW4gaGVyZTsgdGhlIHRva2VuIG1hcmtzIHRoaXMgcG9zaXRpb24gbm9uLW51bGwpYCk7XyhULEUse2s6InB0ciIsdjpmfSl9ZWxzZXtpZihmPT1udWxsKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IDwke2x9PnB0ciBnb3QgJHtTdHJpbmcoZil9OyBwYXNzIHRoZSBpbXBvcnRlZCBOVUxMIGNvbnN0YW50IGZvciBhbiBlbXB0eSBwb2ludGVyYCk7bGV0IEM9aVtsXTtpZighQyl0aHJvdyBuZXcgRXJyb3IobD09PSIiP2BmZmktYmluZDogPD5wdHIgZXhwZWN0cyBudW1iZXIgKE5VTEwgfCBQdHIpLCBnb3QgJHt0eXBlb2YgZn07IHVzZSA8QllURT5wdHIgd2l0aCBhIFB0ckFycmF5QnVmZmVyIChuZXcgUHRyQXJyYXlCdWZmZXIobikpLCBvciBmZmkuYnVmZmVyUHRyKGJ1ZikgZm9yIGFuIGFkZHJlc3NgOmBmZmktYmluZDogdW5rbm93biBsYXlvdXQgIjwke2x9PnB0ciIgKGF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhpKS5qb2luKCIsICIpfHwibm9uZSJ9KWApO2lmKCFDLmVuY29kZSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtsfT5wdHIgaGFzIG5vIGVuY29kZXIgKG91dC1vbmx5IGNvZGVjKWApO2xldCBMPUMuZW5jb2RlKGYpO0kucHVzaChMKTtsZXQgTT1MLnB0cjtpZih0eXBlb2YgTSE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogY29kZWMuZW5jb2RlIG11c3QgcmV0dXJuIGEgUHRyQXJyYXlCdWZmZXIsIGdvdCBwbGFpbiBBcnJheUJ1ZmZlciIpO2lmKG0mJk09PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7bn06IGFyZyMke2ErMX0gPCR7bH0+cHRyISBlbmNvZGUgcHJvZHVjZWQgMCAobnVsbCBwb2ludGVyIGZvcmJpZGRlbiBoZXJlKWApO18oVCxFLHtrOiJwdHIiLHY6TX0pfX1lbHNlIGlmKHkoZCkpe2xldCBsPVcoZCksQz1aKGwsaSk7aWYoIUMpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtufTogYXJnIyR7YSsxfSA8JHtsfT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7aWYoZj09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtsfT4gdmFsdWUgcG9zaXRpb24gZ290ICR7U3RyaW5nKGYpfTsgcGFzcyBhIHN0cnVjdCBvYmplY3QgKHVzZSA8JHtsfT5wdHIgdG8gcGFzcyBhIHBvaW50ZXIpYCk7bGV0IEw9Qy5zaXplO2lmKCFzfHxMPD04JiYoTCZMLTEpPT09MClDLmVuY29kZShmLEYsRSk7ZWxzZXtsZXQgTT1uZXcgQXJyYXlCdWZmZXIoTCsxNSksbnQ9Zy5idWZmZXJQdHIoTSksb3Q9KDE2LW50JTE2KSUxNjtDLmVuY29kZShmLE0sb3QpLEkucHVzaChNKSxfKFQsRSx7azoicHRyIix2Om50K290fSl9fWVsc2UgXyhULEUse2s6ZCx2OmZ9KTtFKz1wKGQpfWxldCBQPW5ldyBBcnJheUJ1ZmZlcig4KTtnLmZmaUNhbGwodCxGLFAscj09PSJmMzIifHxyPT09ImY2NCI/MTowKTtsZXQgUz16dCh1dChyKSxQKTtpZihyLmVuZHNXaXRoKCIhIikmJlM9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7bn06IHJldHVybiAke3J9IGdvdCAwICh0aGUgdG9rZW4gcHJvbWlzZXMgQyBuZXZlciByZXR1cm5zIG51bGwgaGVyZSlgKTtpZihiKHIpJiZTIT09MCl7bGV0IGE9aihyKTtpZihhIT09IiIpe2xldCBkPWNbYV07aWYoZD8uZGVjb2RlKXJldHVybiBkLmRlY29kZShTKX19cmV0dXJuIFN9ZnVuY3Rpb24genQodCxlKXtpZih0IT09InZvaWQiKXJldHVybiB6KG5ldyBEYXRhVmlldyhlKSwwLHQpfXZhciAkPXtlbmNvZGU6dD0+e2xldCBlPW5ldyBUZXh0RW5jb2RlcigidXRmLTE2bGUiKS5lbmNvZGUodCsiXDAiKSxyPW5ldyB4KGUuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHIpLnNldChlKSxyfSxkZWNvZGU6dD0+e2lmKHR5cGVvZiB0PT0ibnVtYmVyIil7bGV0IG89IiIsaT10LGM9aTtmb3IoOzspe2xldCBzPWcucmVhZEJ5dGUoaSksdT1nLnJlYWRCeXRlKGkrMSk7aWYocz09PTAmJnU9PT0wKXJldHVybiBvO2lmKG8rPVN0cmluZy5mcm9tQ2hhckNvZGUoc3x1PDw4KSxpKz0yLGktYz4xPDwyMSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiBXQ0hBUiBkZWNvZGUgZXhjZWVkZWQgNE1pQiB3aXRob3V0IE5VTCIpfX1sZXQgZT1uZXcgVWludDhBcnJheSh0KSxyPWUubGVuZ3RoJi0yLG49IiI7Zm9yKGxldCBvPTA7bzxyO28rPTIpe2xldCBpPWVbb118ZVtvKzFdPDw4O2lmKGk9PT0wKXJldHVybiBuO24rPVN0cmluZy5mcm9tQ2hhckNvZGUoaSl9cmV0dXJuIG59LGFsbG9jOih0PTI1Nik9Pm5ldyB4KHQqMil9LCR0PXtlbmNvZGU6dD0+e2lmKCEodCBpbnN0YW5jZW9mIHgpKXRocm93IG5ldyBFcnJvcigiZmZpLWJpbmQ6IDxCWVRFPnB0ciB3YW50cyBhIFB0ckFycmF5QnVmZmVyIChuZXcgUHRyQXJyYXlCdWZmZXIobikgLyBCWVRFLmFsbG9jIC8gc3RydWN0LmVuY29kZSksIG5vdCBhIHBsYWluIEFycmF5QnVmZmVyIik7cmV0dXJuIHR9LGFsbG9jOnQ9Pm5ldyB4KHQpfSxmdD17V0NIQVI6JCxCWVRFOiR0fTtmdW5jdGlvbiBtdCh0LGUscixuLG8pe2xldCBpPWcuR2V0UHJvY0FkZHJlc3Moa3QodCksZSk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogcHJvYyAiJHtlfSIgbm90IGZvdW5kIGluICR7dH1gKTtsZXQgYz1vPz9uO3JldHVybiBVdChpLHIsey4uLmZ0LC4uLm59LHsuLi5mdCwuLi5jPz97fX0pfXZhciBwZT1uZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2R0LnByaW50ZihgW2ZmaV0gY2xvc3VyZSBsZWFrZWQgKEdDZWQgd2l0aG91dCBkaXNwb3NlKTogc2lnPSIlcyIgcHRyPTB4JXgKYCx0LnNpZyx0LnB0cil9KTtpbXBvcnQqYXMgeHQgZnJvbSJmZmkiO2Z1bmN0aW9uIFUodCxlKXtyZXR1cm4gdCtlLTEmfihlLTEpfXZhciBFdD10PT5SW3RdIT09dm9pZCAwO2Z1bmN0aW9uIHEodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtsZXQgZT0vXih1OHx1MTYpXFsoXGQrKVxdQCh1dGYtOHx1dGYtMTZsZSkkLy5leGVjKHQpO2lmKGUpe2xldCBjPU51bWJlcihlWzJdKTtpZighTnVtYmVyLmlzSW50ZWdlcihjKXx8YzwxKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogc3RyaW5nIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7Y31gKTtsZXQgcz1lWzFdPT09InU4Ij8xOjI7cmV0dXJue3NpemU6cypjLGFsaWduOnMsdHlwZTp7dGFnOiJzdHJpbmciLGVuY29kaW5nOmVbM119fX1sZXQgcj0vXihbXlxbXF1dKylcWyhcZCspXF0kLy5leGVjKHQpO2lmKHIpe2xldCBjPU51bWJlcihyWzJdKTtpZighTnVtYmVyLmlzSW50ZWdlcihjKXx8YzwxKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogYXJyYXkgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtjfWApO2xldCBzPXEoclsxXSk7aWYocy50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6cy5zaXplKmMsYWxpZ246cy5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpzLnR5cGUsZWxlbWVudFNpemU6cy5zaXplfX19bGV0IG49L14oW0EtWmEtel9dXHcqKTooXGQrKSQvLmV4ZWModCk7aWYobil7bGV0IGM9blsxXSxzPWsoYyk7aWYoIUV0KHMpfHxzPT09ImYzMiJ8fHM9PT0iZjY0Iil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIHVuaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIGdvdCAiJHtjfSJgKTtsZXQgdT1OdW1iZXIoblsyXSkscD1SW3NdLGg9cCo4O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHUpfHx1PDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7dX1gKTtpZih1PmgpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCAke3V9IGV4Y2VlZHMgdW5pdCB3aWR0aCAke2h9YCk7cmV0dXJue3NpemU6cCxhbGlnbjpwLHR5cGU6e3RhZzoiYml0ZmllbGQiLHVuaXQ6cyxiaXQ6MCx3aWR0aDp1fX19bGV0IG89ayh0KTtpZihiKG8pKXJldHVybntzaXplOkQsYWxpZ246RCx0eXBlOnt0YWc6ImJhc2ljIixraW5kOiJwdHIifX07aWYoIUV0KG8pKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biBraW5kICIke3R9ImApO2xldCBpPVJbb107cmV0dXJue3NpemU6aSxhbGlnbjppLHR5cGU6e3RhZzoiYmFzaWMiLGtpbmQ6b319fWlmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGU9dCxyPWVbIiMiXTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogbmVzdGVkIG9iamVjdCB2YWx1ZSByZXF1aXJlcyBhICcjJyBrZXkgKCdzdHJ1Y3QnIHwgJ3VuaW9uJyB8ICdhcnJheScpIik7aWYocj09PSJhcnJheSImJiIjcGFjayJpbiBlKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJyNwYWNrJyBpcyBvbmx5IGFsbG93ZWQgb24gc3RydWN0L3VuaW9uLCBnb3QgJyR7cn0nYCk7aWYocj09PSJhcnJheSIpe2xldCBuPWUubGVuZ3RoO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke1N0cmluZyhuKX1gKTtsZXQgbz1xKGUuZWxlbWVudCk7aWYoby50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6by5zaXplKm4sYWxpZ246by5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpvLnR5cGUsZWxlbWVudFNpemU6by5zaXplfX19aWYocj09PSJzdHJ1Y3QifHxyPT09InVuaW9uIil7bGV0IG49aHQodCk7cmV0dXJue3NpemU6bi5zaXplLGFsaWduOm4ubWF4RWZmZWN0aXZlQWxpZ24sdHlwZTp7dGFnOnIsZmllbGRzOm4uZmllbGRzfX19dGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiB1bmtub3duICcjJyBkZWNsYXJhdGlvbiAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhyKSl9YCl9dGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBpbnZhbGlkIG1lbWJlciB2YWx1ZTogJHtTdHJpbmcodCl9YCl9ZnVuY3Rpb24gaHQodCl7bGV0IGU9dFsiIyJdPT09InN0cnVjdCIscj10WyIjcGFjayJdPz84LG49MSxvPTAsaT1bXSxjPTAscz0tMSx1PTAscD0wLGg9KCk9PntzPDB8fChjPVUocytNYXRoLmNlaWwodS84KSxwKSxzPS0xKX07Zm9yKGxldFtGLFRdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKEYuc3RhcnRzV2l0aCgiIyIpKWNvbnRpbnVlO2xldCBJPS9eKFteQF0rKUAoXGQrKSQvLmV4ZWMoRiksRT1JP0lbMV06RixQPUk/TnVtYmVyKElbMl0pOjAse3NpemU6dyxhbGlnbjpTLHR5cGU6YX09cShUKSxkPXR5cGVvZiBUPT0ic3RyaW5nIiYmVC5lbmRzV2l0aCgiISIpLG09UztpZihyPjAmJihtPU1hdGgubWluKHIsbSkpLFAmJihtPU1hdGgubWF4KG0sUCkpLGEudGFnPT09ImJpdGZpZWxkIil7aWYoRS5zdGFydHNXaXRoKCIkIikpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZCBtZW1iZXJzIG11c3QgYmUgbmFtZWQiKTtpZighZSl7aS5wdXNoKHtuYW1lOkUsb2Zmc2V0OjAsc2l6ZTp3LHR5cGU6ey4uLmEsYml0OjB9fSksbj1NYXRoLm1heChuLG0pLG89TWF0aC5tYXgobyx3KTtjb250aW51ZX1sZXQgbD1hLndpZHRoOyhzPDB8fHchPT1wfHx1K2w+cCo4KSYmKHM+PTAmJmgoKSxzPVUoYyxtKSx1PTAscD13KSxpLnB1c2goe25hbWU6RSxvZmZzZXQ6cyxzaXplOncsdHlwZTp7Li4uYSxiaXQ6dX19KSx1Kz1sLG49TWF0aC5tYXgobixtKSxvPU1hdGgubWF4KG8sdyk7Y29udGludWV9aCgpO2xldCBmPVUoYyxtKTtpZighRS5zdGFydHNXaXRoKCIkIikpaS5wdXNoKHtuYW1lOkUsb2Zmc2V0OmYsc2l6ZTp3LHR5cGU6YSwuLi5kP3tub25udWxsOiEwfTp7fX0pO2Vsc2V7aWYoYS50YWchPT0ic3RydWN0IiYmYS50YWchPT0idW5pb24iKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogYW5vbnltb3VzIG1lbWJlciAiJHtFfSIgbXVzdCBiZSBhIHN0cnVjdC91bmlvbmApO2ZvcihsZXQgbCBvZiBhLmZpZWxkcylpLnB1c2goey4uLmwsb2Zmc2V0Omwub2Zmc2V0K2Z9KX1lJiYoYz1mK3cpLG49TWF0aC5tYXgobixtKSxvPU1hdGgubWF4KG8sdyl9cmV0dXJuIGgoKSx7c2l6ZTpVKGU/YzpvLG4pLG1heEVmZmVjdGl2ZUFsaWduOm4sZmllbGRzOml9fWZ1bmN0aW9uIGd0KHQsZSxyKXtsZXQgbj1SW3JdO3JldHVybiBuPT09MT9CaWdJbnQodC5nZXRVaW50OChlKSk6bj09PTI/QmlnSW50KHQuZ2V0VWludDE2KGUsITApKTpuPT09ND9CaWdJbnQodC5nZXRVaW50MzIoZSwhMCkpOnQuZ2V0QmlnVWludDY0KGUsITApfWZ1bmN0aW9uIEd0KHQsZSxyLG4pe2xldCBvPVJbcl07aWYobz09PTEpe3Quc2V0VWludDgoZSxOdW1iZXIobiYweGZmbikpO3JldHVybn1pZihvPT09Mil7dC5zZXRVaW50MTYoZSxOdW1iZXIobiYweGZmZmZuKSwhMCk7cmV0dXJufWlmKG89PT00KXt0LnNldFVpbnQzMihlLE51bWJlcihuJjB4ZmZmZmZmZmZuKSwhMCk7cmV0dXJufXQuc2V0QmlnVWludDY0KGUsbiYweGZmZmZmZmZmZmZmZmZmZmZuLCEwKX1mdW5jdGlvbiBZdCh0LGUscil7bGV0IG49QmlnSW50KHIud2lkdGgpLG89Z3QodCxlLHIudW5pdCk+PkJpZ0ludChyLmJpdCkmKDFuPDxuKS0xbjtyZXR1cm4gci51bml0WzBdPT09ImkiJiZvJjFuPDxuLTFuJiYoby09MW48PG4pLHIud2lkdGg+NTM/bzpOdW1iZXIobyl9ZnVuY3Rpb24gVnQodCxlLHIsbil7bGV0IG89QmlnSW50KHIud2lkdGgpLGk9QmlnSW50KHIuYml0KSxjPSgxbjw8byktMW4scz1jPDxpLHU9Z3QodCxlLHIudW5pdCkscD0odHlwZW9mIG49PSJiaWdpbnQiP246QmlnSW50KE1hdGgudHJ1bmMobikpKSZjO0d0KHQsZSxyLnVuaXQsdSZ+c3xwPDxpKX12YXIgdnQ9eyJ1dGYtOCI6bmV3IFRleHRFbmNvZGVyKCJ1dGYtOCIpLCJ1dGYtMTZsZSI6bmV3IFRleHRFbmNvZGVyKCJ1dGYtMTZsZSIpfSxqdD17InV0Zi04IjpuZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwfSksInV0Zi0xNmxlIjpuZXcgVGV4dERlY29kZXIoInV0Zi0xNmxlIix7aWdub3JlQk9NOiEwfSl9O2Z1bmN0aW9uIFh0KHQsZSxyLG4pe2xldCBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtlLHIpLGk9bj09PSJ1dGYtMTZsZSI/MjoxLGM9cjtmb3IobGV0IHM9MDtzK2k8PXI7cys9aSlpZihvW3NdPT09MCYmKGk9PT0xfHxvW3MrMV09PT0wKSl7Yz1zO2JyZWFrfXJldHVybiBqdFtuXS5kZWNvZGUoby5zdWJhcnJheSgwLGMpKX1mdW5jdGlvbiBadCh0LGUscixuLG8pe2xldCBpPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtlLHIpO2kuZmlsbCgwKTtsZXQgcz1yLShuPT09InV0Zi0xNmxlIj8yOjEpO2lmKHM8PTApcmV0dXJuO2xldCB1PXZ0W25dLmVuY29kZShTdHJpbmcobz8/IiIpKTtpLnNldCh1LnN1YmFycmF5KDAsTWF0aC5taW4odS5sZW5ndGgscykpKX1mdW5jdGlvbiBxdCh0LGUscixuKXtsZXQgbz1uLmVsZW1lbnRTaXplPjA/ci9uLmVsZW1lbnRTaXplOjAsaT1bXTtmb3IobGV0IGM9MDtjPG87YysrKWkucHVzaCh3dCh0LGUrYypuLmVsZW1lbnRTaXplLG4uZWxlbWVudFR5cGUsbi5lbGVtZW50U2l6ZSkpO3JldHVybiBpfWZ1bmN0aW9uIEt0KHQsZSxyLG4sbyl7bGV0IGk9bi5lbGVtZW50U2l6ZT4wP3Ivbi5lbGVtZW50U2l6ZTowLGM9bz8/W107Zm9yKGxldCBzPTA7czxpO3MrKylUdCh0LGUrcypuLmVsZW1lbnRTaXplLG4uZWxlbWVudFR5cGUsbi5lbGVtZW50U2l6ZSxjW3NdKX1mdW5jdGlvbiB3dCh0LGUscixuKXtzd2l0Y2goci50YWcpe2Nhc2UiYmFzaWMiOnJldHVybiB6KHQsZSxyLmtpbmQpO2Nhc2UiYml0ZmllbGQiOnJldHVybiBZdCh0LGUscik7Y2FzZSJzdHJpbmciOnJldHVybiBYdCh0LGUsbixyLmVuY29kaW5nKTtjYXNlInN0cnVjdCI6Y2FzZSJ1bmlvbiI6cmV0dXJuIEsodCxlLHIuZmllbGRzKTtjYXNlImFycmF5IjpyZXR1cm4gcXQodCxlLG4scil9fWZ1bmN0aW9uIFR0KHQsZSxyLG4sbyl7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpYKHQsZSx7azpyLmtpbmQsdjpvfSk7YnJlYWs7Y2FzZSJiaXRmaWVsZCI6VnQodCxlLHIsbz8/MCk7YnJlYWs7Y2FzZSJzdHJpbmciOlp0KHQsZSxuLHIuZW5jb2Rpbmcsbyk7YnJlYWs7Y2FzZSJzdHJ1Y3QiOmNhc2UidW5pb24iOkl0KHQsZSxyLmZpZWxkcyxvPz97fSk7YnJlYWs7Y2FzZSJhcnJheSI6S3QodCxlLG4scixvKTticmVha319ZnVuY3Rpb24gSyh0LGUscil7bGV0IG49e307Zm9yKGxldCBvIG9mIHIpe2xldCBpPXd0KHQsZStvLm9mZnNldCxvLnR5cGUsby5zaXplKTtpZihvLm5vbm51bGwmJmk9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogZGVjb2RlOiAnIScgZmllbGQgIiR7by5uYW1lfSIgZ290IDAgKEMgZGlkIG5vdCBmaWxsIGl0LCBvciBkZWNvZGUgd2FzIGNhbGxlZCBvbiBhbiB1bmZpbGxlZCBzbG90KWApO25bby5uYW1lXT1pfXJldHVybiBufWZ1bmN0aW9uIEl0KHQsZSxyLG4pe2ZvcihsZXQgbyBvZiByKW5bby5uYW1lXSE9PXZvaWQgMCYmVHQodCxlK28ub2Zmc2V0LG8udHlwZSxvLnNpemUsbltvLm5hbWVdKX1mdW5jdGlvbiBRdCh0KXtsZXR7ZmllbGRzOmUsc2l6ZTpyLG1heEVmZmVjdGl2ZUFsaWduOm59PWh0KHQpO3JldHVybntmaWVsZHM6ZSxzaXplOnIsc3RydWN0QWxpZ246bixkZWNvZGU6bz0+Syh0eXBlb2Ygbz09Im51bWJlciI/bmV3IERhdGFWaWV3KHh0LnJlYWRCeXRlcyhvLHIpKTpuZXcgRGF0YVZpZXcobyksMCxlKSxhbGxvYzoobz0+e2lmKG8hPT12b2lkIDAmJighTnVtYmVyLmlzSW50ZWdlcihvKXx8bzwxKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGFsbG9jKG4pIHJlcXVpcmVzIGFuIGludGVnZXIgbiA+PSAxIChQQUIoMCkgbmV2ZXIgZXNjYXBlcyBcdTIwMTQgcGFzcyBOVUxMIGZvciBhbiBlbXB0eSBwb2ludGVyIHBvc2l0aW9uKSIpO3JldHVybiBuZXcgeChyKihvPz8xKSl9KSxlbmNvZGU6KChvLGksYyk9PntpZihvPT1udWxsKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogZW5jb2RlKHYpIHJlcXVpcmVzIGFuIGFyZ3VtZW50OyB1c2UgYWxsb2MoKSBmb3IgYSB6ZXJvZWQgb3V0LXBhcmFtIHNsb3QiKTtsZXQgcz1pPz9uZXcgeChyKTtyZXR1cm4gSXQobmV3IERhdGFWaWV3KHMpLGM/PzAsZSxvKSxzfSksb2Zmc2V0T2Y6bz0+e2ZvcihsZXQgaSBvZiBlKWlmKGkubmFtZT09PW8pcmV0dXJuIGkub2Zmc2V0O3Rocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogbm8gZmllbGQgIiR7b30iYCl9fX1mdW5jdGlvbiBKdCh0LGUscil7bGV0IG49ZVsiIyJdO2lmKG4hPT12b2lkIDAmJm4hPT10KXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJHt0fSgpIHJlY2VpdmVkIGEgJyR7U3RyaW5nKG4pfScgZGVjbGFyYXRpb24gKGtpbmQgbWlzbWF0Y2ggXHUyMDE0IHVzZSAke259KCkgZm9yIGl0KWApO2xldCBvPWVbIiNwYWNrIl07aWYocj09PXZvaWQgMCYmbyE9PXZvaWQgMClyPW87ZWxzZSBpZihyIT09dm9pZCAwJiZvIT09dm9pZCAwJiZyIT09byl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6ICNwYWNrIGNvbmZsaWN0OiBvcHRzLnBhY2s9JHtyfSB2cyBkZWNsYXJhdGlvbiAke1N0cmluZyhvKX1gKTtsZXQgaT17IiMiOnR9O3IhPT12b2lkIDAmJihpWyIjcGFjayJdPXIpO2ZvcihsZXRbYyxzXW9mIE9iamVjdC5lbnRyaWVzKGUpKWMuc3RhcnRzV2l0aCgiIyIpfHwoaVtjXT1zKTtyZXR1cm4gaX1mdW5jdGlvbiBIKHQsZSxyKXtsZXQgbj10eXBlb2YgdD09InN0cmluZyI7cmV0dXJuIFF0KEp0KCJzdHJ1Y3QiLG4/ZTp0LChuP3I6ZSk/LnBhY2spKX12YXIgdGU9eyIjIjoic3RydWN0IixjYjoidTMyIixscFJlc2VydmVkOiI8PnB0ciIsbHBEZXNrdG9wOiI8PnB0ciIsbHBUaXRsZToiPD5wdHIiLGR3WDoidTMyIixkd1k6InUzMiIsZHdYU2l6ZToidTMyIixkd1lTaXplOiJ1MzIiLGR3WENvdW50Q2hhcnM6InUzMiIsZHdZQ291bnRDaGFyczoidTMyIixkd0ZpbGxBdHRyaWJ1dGU6InUzMiIsZHdGbGFnczoidTMyIix3U2hvd1dpbmRvdzoidTE2QFNob3dXaW5kb3dDbWQiLGNiUmVzZXJ2ZWQyOiJ1MTYiLGxwUmVzZXJ2ZWQyOiI8PnB0ciIsaFN0ZElucHV0OiI8SEZJTEU+cHRyIixoU3RkT3V0cHV0OiI8SEZJTEU+cHRyIixoU3RkRXJyb3I6IjxIRklMRT5wdHIifSxHPUgoIlNUQVJUVVBJTkZPVyIsdGUpLGVlPXsiIyI6InN0cnVjdCIsaFByb2Nlc3M6IjxIUFJPQ0VTUz5wdHIhIixoVGhyZWFkOiI8SFRIUkVBRD5wdHIhIixkd1Byb2Nlc3NJZDoidTMyIixkd1RocmVhZElkOiJ1MzIifSxRPUgoIlBST0NFU1NfSU5GT1JNQVRJT04iLGVlKTt2YXIgTj0odCxlLHIpPT5tdCgia2VybmVsMzIuZGxsIix0LGUsciksRnQ9TigiQ3JlYXRlUGlwZSIsIjw+cHRyIDw+cHRyIDw+cHRyIHUzMiAtPiBpMzIiKSxKPU4oIlNldEhhbmRsZUluZm9ybWF0aW9uIiwiPEhGSUxFPnB0ciEgdTMyIHUzMiAtPiBpMzIiKSxTdD1OKCJDcmVhdGVQcm9jZXNzVyIsIjxXQ0hBUj5wdHIgPFdDSEFSPnB0ciA8PnB0ciA8PnB0ciBpMzIgdTMyIDw+cHRyIDxXQ0hBUj5wdHIgPFNUQVJUVVBJTkZPVz5wdHIgPFBST0NFU1NfSU5GT1JNQVRJT04+cHRyIC0+IGkzMiIse1NUQVJUVVBJTkZPVzpHfSksQ3Q9TigiV2FpdEZvclNpbmdsZU9iamVjdCIsIjw+cHRyIHUzMiAtPiB1MzIiKSxOdD1OKCJHZXRFeGl0Q29kZVByb2Nlc3MiLCI8SFBST0NFU1M+cHRyISA8QllURT5wdHIgLT4gaTMyIiksQT1OKCJDbG9zZUhhbmRsZSIsIjw+cHRyIC0+IGkzMiIpO3ZhciBidD1OKCJSZWFkRmlsZSIsIjxIRklMRT5wdHIhIDxCWVRFPnB0ciB1MzIgPEJZVEU+cHRyIDw+cHRyIC0+IGkzMiIpO3ZhciB0dD1OKCJHZXRMYXN0RXJyb3IiLCIgLT4gdTMyIikseXQ9TigiR2V0U3lzdGVtRGlyZWN0b3J5VyIsIjxCWVRFPnB0ciB1MzIgLT4gdTMyIik7dmFyIHJlPXQ9Pnt0cnl7bGV0IGU9T3Qub3BlbigiZGlhZy5sb2ciLCJhIik7ZSYmKGUucHV0cyhgJHtEYXRlLm5vdygpfSAke3R9CmApLGUuY2xvc2UoKSl9Y2F0Y2h7fX0sZXQ9MSxuZT0yNTYsb2U9NDI5NDk2NzI5NSxCPUR0Lldvcmtlci5wYXJlbnQsUHQ9IkM6XFxXaW5kb3dzXFxTeXN0ZW0zMiI7dHJ5e2xldCB0PSQuYWxsb2MoMjU2KSxyPXl0KHQsMjU2KT4wPyQuZGVjb2RlKHQpOiIiO3ImJihQdD1yKX1jYXRjaCh0KXtyZSgiU1lTLURJUi1GQUlMOiAiK1N0cmluZyh0KSl9dmFyIHJ0PUgoIlBJUEVfSEFORExFUyIse2hSZWFkOiI8SEZJTEU+cHRyISIsaFdyaXRlOiI8SEZJTEU+cHRyISJ9KTtmdW5jdGlvbiBpZSh0LGUpe2xldCByPXJ0LmFsbG9jKCk7aWYoIUZ0KHIucHRyLHIucHRyK3J0Lm9mZnNldE9mKCJoV3JpdGUiKSxPLDApKXRocm93IG5ldyBFcnJvcigiQ3JlYXRlUGlwZSBlcnI9Iit0dCgpKTtsZXR7aFJlYWQ6bixoV3JpdGU6b309cnQuZGVjb2RlKHIpO0oobyxldCxldCksSihuLGV0LDApO2xldCBpPVEuYWxsb2MoKSxjPWAke1B0fVxcY21kLmV4ZSAvdSAvYyAke2V9YDtpZighU3QoTyxjLE8sTywxLDAsTyxPLHtjYjpHLnNpemUsZHdGbGFnczpuZSxoU3RkT3V0cHV0Om8saFN0ZEVycm9yOm99LGkucHRyKSl0aHJvdyBBKG4pLEEobyksbmV3IEVycm9yKCJDcmVhdGVQcm9jZXNzVyBlcnI9Iit0dCgpKyIgY21kPSIrYyk7bGV0e2hQcm9jZXNzOnMsaFRocmVhZDp1LGR3UHJvY2Vzc0lkOnB9PVEuZGVjb2RlKGkpO0EodSksQShvKSxCLnBvc3RNZXNzYWdlKHt0eXBlOiJpbmZvIixpZDp0LHBpZDpwfSk7bGV0IGg9bmV3IHgoNDA5NiksRj1uZXcgVWludDhBcnJheShoKSxUPW5ldyB4KDQpLEk9bmV3IFVpbnQzMkFycmF5KFQpO2Zvcig7SVswXT0wLCEhYnQobixoLDQwOTYsVCxPKTspe2xldCBTPUlbMF07aWYoUz09PTApYnJlYWs7Qi5wb3N0TWVzc2FnZSh7dHlwZToiZGF0YSIsaWQ6dCxjaHVuazpGLnNsaWNlKDAsUyl9KX1DdChzLG9lKTtsZXQgRT1uZXcgeCg0KSxQPW5ldyBJbnQzMkFycmF5KEUpO050KHMsRSk7bGV0IHc9UFswXTtyZXR1cm4gQShuKSxBKHMpLHd9Qi5vbm1lc3NhZ2U9dD0+e2xldCBlPXQuZGF0YTtpZihlLnR5cGU9PT0icnVuIiYmdHlwZW9mIGUuY21kPT0ic3RyaW5nIil7bGV0IHI9LTEsbj1udWxsO3RyeXtyPWllKGUuaWQsZS5jbWQpfWNhdGNoKG8pe249U3RyaW5nKG8pfUIucG9zdE1lc3NhZ2Uoe3R5cGU6InJlc3VsdCIsaWQ6ZS5pZCxjb2RlOnIsZXJyb3I6bn0pfUIub25tZXNzYWdlPW51bGx9Owo=");
22306
22444
  bumpWorkers(1);
22307
22445
  const id = 1;
22308
22446
  let innerPid = null;
@@ -22442,7 +22580,6 @@ function parseShotOpts(params) {
22442
22580
  return { hwnd, area, mode };
22443
22581
  }
22444
22582
  var SRCCOPY = 13369376;
22445
- var DIB_RGB_COLORS = 0;
22446
22583
  var MAX_CAPTURE_PX = 4e7;
22447
22584
  var WIDE_BUF_CHARS = 512;
22448
22585
  var MAX_WINDOWS = 2e4;
@@ -22488,7 +22625,16 @@ function emitDib(hdc, hbm, w2, h2) {
22488
22625
  // biCompression 缺省 0 = BI_RGB
22489
22626
  biSizeImage: w2 * h2 * 4
22490
22627
  });
22491
- const got = GetDIBits(hdc, hbm, 0, h2, pxB, bmi.ptr, DIB_RGB_COLORS);
22628
+ const got = GetDIBits(
22629
+ hdc,
22630
+ hbm,
22631
+ 0,
22632
+ h2,
22633
+ pxB,
22634
+ bmi.ptr,
22635
+ 0
22636
+ /* ColorUse.RGB_COLORS */
22637
+ );
22492
22638
  if (got !== h2)
22493
22639
  return null;
22494
22640
  const out = new Uint8Array(BMP_HEADERS_SIZE + px.byteLength);