Compare commits
10 Commits
v0.40.3
...
3f5e4f4290
| Author | SHA1 | Date | |
|---|---|---|---|
| 3f5e4f4290 | |||
| 0797e9a993 | |||
| c53b42342b | |||
| 123aa6d099 | |||
| 331d932c4b | |||
| 716e5f04cf | |||
| ef9d914b99 | |||
| 005efa2ee4 | |||
| 1190ed3ce6 | |||
| 2869e1c34e |
@@ -109,6 +109,18 @@ Owns:
|
|||||||
- Achievement unlock condition evaluation
|
- Achievement unlock condition evaluation
|
||||||
- Seeded RNG for reproducible deals
|
- Seeded RNG for reproducible deals
|
||||||
|
|
||||||
|
**Rules decisions:**
|
||||||
|
- **Stock recycling is unlimited in every draw mode — by design.** Extra
|
||||||
|
passes through the stock are discouraged via the upstream score penalty
|
||||||
|
(applied by the `card_game`/`klondike` session), never blocked with a
|
||||||
|
`MoveError`. This matches mainstream digital solitaire (unlimited redeals
|
||||||
|
in Draw-1) rather than strict tournament rules (3-pass cap). It is load-
|
||||||
|
bearing: the difficulty seed catalog and the winnable-deal solver are
|
||||||
|
verified under unlimited recycling, so introducing a hard pass limit would
|
||||||
|
invalidate both. Locked in by the
|
||||||
|
`draw_one_recycling_is_unlimited_by_design` test in
|
||||||
|
`solitaire_core/src/game_state.rs`. (Decision record: Gitea issue #117.)
|
||||||
|
|
||||||
### `solitaire_sync`
|
### `solitaire_sync`
|
||||||
**Dependencies:** `serde`, `serde_json`, `uuid`, `chrono` only.
|
**Dependencies:** `serde`, `serde_json`, `uuid`, `chrono` only.
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ project follows [Semantic Versioning](https://semver.org/).
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- **Rules decision record: unlimited stock recycling.** Documented in
|
||||||
|
`ARCHITECTURE.md` that unlimited recycling with score penalties (matching
|
||||||
|
mainstream digital solitaire) is intentional, and locked it in with a core
|
||||||
|
test — the difficulty seed catalog and winnable-deal solver are verified
|
||||||
|
under this rule. Resolves the last open finding from the June 500-game
|
||||||
|
audit (issue #117).
|
||||||
- **Analytics validation runbook.** Documented native Matomo live validation,
|
- **Analytics validation runbook.** Documented native Matomo live validation,
|
||||||
expected event payloads, and the current web/WASM analytics split.
|
expected event payloads, and the current web/WASM analytics split.
|
||||||
- **Android smoke-test runbook.** Updated the Android doc with the current
|
- **Android smoke-test runbook.** Updated the Android doc with the current
|
||||||
|
|||||||
Executable
+66
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Live-watch the Gitea Actions deploy pipeline for Ferrous Solitaire.
|
||||||
|
#
|
||||||
|
# Polls recent workflow runs and prints a compact status block each cycle.
|
||||||
|
# Stops when the newest docker-build (the deploy) has completed and no
|
||||||
|
# web-wasm-rebuild is still pending — i.e. the full fix is live.
|
||||||
|
#
|
||||||
|
# Usage: ./scripts/watch_deploy.sh [interval_seconds]
|
||||||
|
# token is read from ~/.config/tea/config.yml (never printed).
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
REPO="funman300/Ferrous-Solitaire"
|
||||||
|
BASE="https://git.aleshym.co/api/v1/repos/${REPO}"
|
||||||
|
INTERVAL="${1:-20}"
|
||||||
|
CFG="${HOME}/.config/tea/config.yml"
|
||||||
|
|
||||||
|
TOKEN="$(grep -E '^[[:space:]]*token:' "$CFG" | head -1 | sed -E 's/.*token:[[:space:]]*//' | tr -d '"'\'' ')"
|
||||||
|
[ -z "$TOKEN" ] && { echo "error: no token in $CFG" >&2; exit 1; }
|
||||||
|
|
||||||
|
echo "── watching ${REPO} deploy (poll ${INTERVAL}s, Ctrl-C to stop) ──"
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
json="$(curl -s --max-time 20 -H "Authorization: token ${TOKEN}" "${BASE}/actions/runs?limit=6")"
|
||||||
|
# Print rows + emit the deploy state on the last line (parsed below).
|
||||||
|
# JSON is passed via env var because `python3 -` reads its program from the
|
||||||
|
# heredoc on stdin, so stdin can't also carry the data.
|
||||||
|
out="$(JSON_DATA="$json" python3 - <<'PY'
|
||||||
|
import os, sys, json, datetime
|
||||||
|
now = datetime.datetime.now().strftime("%H:%M:%S")
|
||||||
|
raw = os.environ.get("JSON_DATA", "").strip()
|
||||||
|
try:
|
||||||
|
d = json.loads(raw)
|
||||||
|
except Exception:
|
||||||
|
print("[%s] (api unavailable, retrying)" % now)
|
||||||
|
print("STATE=DEPLOYING")
|
||||||
|
sys.exit(0)
|
||||||
|
runs = d.get("workflow_runs", [])[:6]
|
||||||
|
icons = {("completed","success"):"OK ", ("completed","failure"):"FAIL",
|
||||||
|
("completed","cancelled"):"CXL "}
|
||||||
|
def ic(s, c):
|
||||||
|
if s == "queued": return "queue"
|
||||||
|
if s == "in_progress": return "run.."
|
||||||
|
return icons.get((s, c), s or "?")
|
||||||
|
print("[%s]" % datetime.datetime.now().strftime("%H:%M:%S"))
|
||||||
|
for r in runs:
|
||||||
|
wf = str(r.get("path","")).split("@")[0].split("/")[-1].replace(".yml","")
|
||||||
|
print(" %-5s %-5s %-7s %-18s %s/%s" % (
|
||||||
|
ic(r.get("status"), r.get("conclusion")),
|
||||||
|
r.get("id"), str(r.get("head_sha"))[:7], wf[:18],
|
||||||
|
r.get("status"), r.get("conclusion")))
|
||||||
|
db = [r for r in runs if "docker-build" in str(r.get("path"))]
|
||||||
|
wr_pending = any(r.get("status") != "completed" for r in runs if "web-wasm-rebuild" in str(r.get("path")))
|
||||||
|
top = db[0] if db else None
|
||||||
|
live = bool(top and top.get("status")=="completed" and top.get("conclusion")=="success" and not wr_pending)
|
||||||
|
print("STATE=%s" % ("LIVE" if live else ("WAIT_WASM" if wr_pending else "DEPLOYING")))
|
||||||
|
PY
|
||||||
|
)"
|
||||||
|
echo "$out" | grep -v '^STATE='
|
||||||
|
if echo "$out" | grep -q '^STATE=LIVE'; then
|
||||||
|
echo ""
|
||||||
|
echo "DEPLOY LIVE — newest docker-build succeeded, no wasm rebuild pending."
|
||||||
|
echo " Test: https://klondike.aleshym.co/play?v=${RANDOM}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep "$INTERVAL"
|
||||||
|
done
|
||||||
@@ -863,6 +863,13 @@ impl GameState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Draw cards from stock to waste. When stock is empty, recycles waste back to stock.
|
/// Draw cards from stock to waste. When stock is empty, recycles waste back to stock.
|
||||||
|
///
|
||||||
|
/// Recycling is deliberately unlimited in every draw mode: extra passes
|
||||||
|
/// are discouraged through the upstream score penalty, never rejected
|
||||||
|
/// with a [`MoveError`]. The difficulty seed catalog and the
|
||||||
|
/// winnable-deal solver are verified under this rule — see the
|
||||||
|
/// "Rules decisions" note in `ARCHITECTURE.md` (`solitaire_core`
|
||||||
|
/// section) before considering a hard pass limit.
|
||||||
pub fn draw(&mut self) -> Result<(), MoveError> {
|
pub fn draw(&mut self) -> Result<(), MoveError> {
|
||||||
if self.is_won() {
|
if self.is_won() {
|
||||||
return Err(MoveError::GameAlreadyWon);
|
return Err(MoveError::GameAlreadyWon);
|
||||||
@@ -1222,6 +1229,30 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn draw_one_recycling_is_unlimited_by_design() {
|
||||||
|
// Rules decision (Gitea #117): stock recycling is unlimited in every
|
||||||
|
// draw mode. Extra passes are discouraged via the upstream score
|
||||||
|
// penalty, never blocked with a MoveError. The difficulty seed
|
||||||
|
// catalog and the winnable-deal solver are verified under this rule,
|
||||||
|
// so a hard pass limit must not be introduced casually — see the
|
||||||
|
// "Rules decisions" note in ARCHITECTURE.md (`solitaire_core`).
|
||||||
|
let mut game = game_at_first_recycle().expect("could not reach recycle");
|
||||||
|
// ~24 draws per Draw-1 pass; 2_000 draws is ample budget for 10 passes.
|
||||||
|
for _ in 0..2_000 {
|
||||||
|
if game.recycle_count() >= 10 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
game.draw()
|
||||||
|
.expect("unlimited recycling: draw must never fail on pass count");
|
||||||
|
}
|
||||||
|
assert!(
|
||||||
|
game.recycle_count() >= 10,
|
||||||
|
"expected at least 10 recycles within the draw budget, got {}",
|
||||||
|
game.recycle_count(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn undo_applies_minus_15_penalty_via_upstream_score() {
|
fn undo_applies_minus_15_penalty_via_upstream_score() {
|
||||||
// A foundation move scores +10 upstream; undoing it nets the move score
|
// A foundation move scores +10 upstream; undoing it nets the move score
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -191,10 +191,12 @@ fn apply_safe_area_to_modal_scrims(
|
|||||||
/// whatever `SafeAreaInsets` are current at that moment.
|
/// whatever `SafeAreaInsets` are current at that moment.
|
||||||
///
|
///
|
||||||
/// On Android the `android::rearm_on_resumed` system runs in the same frame
|
/// On Android the `android::rearm_on_resumed` system runs in the same frame
|
||||||
/// and resets both `SafeAreaPollTries` and `SafeAreaInsets` to zero, causing
|
/// and resets `SafeAreaPollTries` (the cached `SafeAreaInsets` keep their
|
||||||
/// `refresh_insets` to re-poll JNI over the next few frames. When it resolves
|
/// last-known values), causing `refresh_insets` to re-poll JNI over the next
|
||||||
/// the correct values, `on_safe_area_changed` in `table_plugin` emits a second
|
/// few frames. If the insets changed while backgrounded, `on_safe_area_changed`
|
||||||
/// synthetic `WindowResized` and the layout converges to the right position.
|
/// in `table_plugin` emits a second synthetic `WindowResized` and the layout
|
||||||
|
/// converges to the right position; if they didn't, nothing is rewritten and
|
||||||
|
/// the layout stays put.
|
||||||
///
|
///
|
||||||
/// On non-Android targets this handler still fires — it ensures that a resume
|
/// On non-Android targets this handler still fires — it ensures that a resume
|
||||||
/// event always refreshes the layout (e.g., after a minimise/restore on
|
/// event always refreshes the layout (e.g., after a minimise/restore on
|
||||||
@@ -232,9 +234,14 @@ mod android {
|
|||||||
pub(super) struct SafeAreaPollTries(pub u32);
|
pub(super) struct SafeAreaPollTries(pub u32);
|
||||||
|
|
||||||
/// Polls Android for safe-area insets until we get a non-zero
|
/// Polls Android for safe-area insets until we get a non-zero
|
||||||
/// reading, then stops. `getRootWindowInsets()` returns `null` (or
|
/// reading, then settles until [`rearm_on_resumed`] re-arms it on the
|
||||||
/// all-zero `Insets`) until the decor view has been laid out, which
|
/// next foreground resume — insets can change while backgrounded
|
||||||
/// is typically frame 1–3 of a fresh launch.
|
/// (rotation, fold/unfold, gesture ↔ 3-button nav). The poll counter
|
||||||
|
/// (not `insets.is_populated()`) gates the loop, so a re-armed cycle
|
||||||
|
/// re-queries JNI even though cached values are already populated.
|
||||||
|
/// `getRootWindowInsets()` returns `null` (or all-zero `Insets`)
|
||||||
|
/// until the decor view has been laid out, which is typically frame
|
||||||
|
/// 1–3 of a fresh launch.
|
||||||
pub(super) fn refresh_insets(
|
pub(super) fn refresh_insets(
|
||||||
mut insets: ResMut<SafeAreaInsets>,
|
mut insets: ResMut<SafeAreaInsets>,
|
||||||
mut poll: ResMut<SafeAreaPollTries>,
|
mut poll: ResMut<SafeAreaPollTries>,
|
||||||
@@ -243,18 +250,25 @@ mod android {
|
|||||||
// devices that genuinely report zero insets.
|
// devices that genuinely report zero insets.
|
||||||
const MAX_TRIES: u32 = 120; // ~2 seconds @ 60 fps
|
const MAX_TRIES: u32 = 120; // ~2 seconds @ 60 fps
|
||||||
|
|
||||||
if poll.0 >= MAX_TRIES || insets.is_populated() {
|
if poll.0 >= MAX_TRIES {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
poll.0 += 1;
|
poll.0 += 1;
|
||||||
|
|
||||||
match query_insets() {
|
match query_insets() {
|
||||||
Ok(v) if v.is_populated() => {
|
Ok(v) if v.is_populated() => {
|
||||||
info!(
|
if *insets != v {
|
||||||
"safe_area: insets resolved top={} bottom={} left={} right={} (after {} frames)",
|
info!(
|
||||||
v.top, v.bottom, v.left, v.right, poll.0
|
"safe_area: insets resolved top={} bottom={} left={} right={} (after {} frames)",
|
||||||
);
|
v.top, v.bottom, v.left, v.right, poll.0
|
||||||
*insets = v;
|
);
|
||||||
|
*insets = v;
|
||||||
|
}
|
||||||
|
// Settled for this poll cycle; `rearm_on_resumed` re-arms on
|
||||||
|
// the next resume. Writing `insets` only on an actual change
|
||||||
|
// keeps resource change detection (and the relayout it
|
||||||
|
// triggers) quiet on resumes where nothing moved.
|
||||||
|
poll.0 = MAX_TRIES;
|
||||||
}
|
}
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
// Layout not ready yet; try again next frame.
|
// Layout not ready yet; try again next frame.
|
||||||
|
|||||||
@@ -1649,63 +1649,63 @@ function __wbg_get_imports() {
|
|||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000001: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000001: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 114846, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 114857, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hea4b5125da4e5ded);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hfb2e9a2f0bbd9ecc);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000002: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000002: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000003: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000003: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Array<any>"), NamedExternref("ResizeObserver")], shim_idx: 9838, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Array<any>"), NamedExternref("ResizeObserver")], shim_idx: 9843, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h0fec466277fb30e8);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h876550298b312ff8);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000004: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000004: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Array<any>")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Array<any>")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_3);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_3);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000005: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000005: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_4);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_4);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000006: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000006: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("FocusEvent")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("FocusEvent")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_5);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_5);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000007: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000007: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("KeyboardEvent")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_6);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_6);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000008: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000008: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("PageTransitionEvent")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("PageTransitionEvent")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_7);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_7);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_0000000000000009: function(arg0, arg1) {
|
__wbindgen_cast_0000000000000009: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("PointerEvent")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("PointerEvent")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_8);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_8);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_000000000000000a: function(arg0, arg1) {
|
__wbindgen_cast_000000000000000a: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("WheelEvent")], shim_idx: 9832, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("WheelEvent")], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_9);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_9);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_000000000000000b: function(arg0, arg1) {
|
__wbindgen_cast_000000000000000b: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Option(NamedExternref("Blob"))], shim_idx: 9834, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Option(NamedExternref("Blob"))], shim_idx: 9840, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hf05069bc44820cc5);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h657f46feffff6fe4);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_000000000000000c: function(arg0, arg1) {
|
__wbindgen_cast_000000000000000c: function(arg0, arg1) {
|
||||||
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 9830, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 9834, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
||||||
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h5e26b448f43bfba9);
|
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h545edb23183e448a);
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
__wbindgen_cast_000000000000000d: function(arg0) {
|
__wbindgen_cast_000000000000000d: function(arg0) {
|
||||||
@@ -1769,55 +1769,55 @@ function __wbg_get_imports() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h5e26b448f43bfba9(arg0, arg1) {
|
function wasm_bindgen__convert__closures_____invoke__h545edb23183e448a(arg0, arg1) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h5e26b448f43bfba9(arg0, arg1);
|
wasm.wasm_bindgen__convert__closures_____invoke__h545edb23183e448a(arg0, arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_3(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_3(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_3(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_3(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_4(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_4(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_4(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_4(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_5(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_5(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_5(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_5(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_6(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_6(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_6(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_6(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_7(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_7(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_7(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_7(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_8(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_8(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_8(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_8(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_9(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_9(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h2a0b90ad2a013a3e_9(arg0, arg1, arg2);
|
wasm.wasm_bindgen__convert__closures_____invoke__h15aa57dbc666225a_9(arg0, arg1, arg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__hea4b5125da4e5ded(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__hfb2e9a2f0bbd9ecc(arg0, arg1, arg2) {
|
||||||
const ret = wasm.wasm_bindgen__convert__closures_____invoke__hea4b5125da4e5ded(arg0, arg1, arg2);
|
const ret = wasm.wasm_bindgen__convert__closures_____invoke__hfb2e9a2f0bbd9ecc(arg0, arg1, arg2);
|
||||||
if (ret[1]) {
|
if (ret[1]) {
|
||||||
throw takeFromExternrefTable0(ret[0]);
|
throw takeFromExternrefTable0(ret[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__h0fec466277fb30e8(arg0, arg1, arg2, arg3) {
|
function wasm_bindgen__convert__closures_____invoke__h876550298b312ff8(arg0, arg1, arg2, arg3) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__h0fec466277fb30e8(arg0, arg1, arg2, arg3);
|
wasm.wasm_bindgen__convert__closures_____invoke__h876550298b312ff8(arg0, arg1, arg2, arg3);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wasm_bindgen__convert__closures_____invoke__hf05069bc44820cc5(arg0, arg1, arg2) {
|
function wasm_bindgen__convert__closures_____invoke__h657f46feffff6fe4(arg0, arg1, arg2) {
|
||||||
wasm.wasm_bindgen__convert__closures_____invoke__hf05069bc44820cc5(arg0, arg1, isLikeNone(arg2) ? 0 : addToExternrefTable0(arg2));
|
wasm.wasm_bindgen__convert__closures_____invoke__h657f46feffff6fe4(arg0, arg1, isLikeNone(arg2) ? 0 : addToExternrefTable0(arg2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user