/ proof-of-concept / beadnet
Sign in
proof-of-concept / beadnet
beadnet: Python port of the bead-percussion solver (numba), Zarr v2 output with every bead recorded, web components (run, controls, model, animation, waveform, spectrogram, energy, info), serve CLI, agent guide, examples, tests against the TS solver
Jeremy Magland <jmagland@flatironinstitute.org> committed commit e213c1e1a7aa Browse files
22 changed files+4335−0
.gitignoreadded+5−0View file
@@ -0,0 +1,5 @@
1+.venv/
2+__pycache__/
3+*.egg-info/
4+work/
5+.pytest_cache/
CLAUDE.mdadded+15−0View file
@@ -0,0 +1,15 @@
1+# beadnet
2+
3+Python package (numba solver, Zarr v2 output) plus browser components (`beadnet/static/beadnet.js`, plain ES module, no build step) for bead-and-spring percussion models. Port of the solver in `~/projects/bead-percussion` (TypeScript); keep the two in agreement.
4+
5+## Building and running models for the user
6+
7+Read `beadnet/AGENT_GUIDE.md` first and follow it. The workspace is `work/` (gitignored): scripts in `work/scripts/`, results in `work/runs/`, saved models in `work/models/`, pages in `work/pages/`. View with `beadnet serve work` (port 8790). Run anything longer than about a minute in the background.
8+
9+## Development
10+
11+- `python -m venv .venv && . .venv/bin/activate && pip install -e '.[test]'`; `python -m pytest -q`.
12+- Keep the code Python 3.9 compatible (`from __future__ import annotations`; no runtime `X | Y` types).
13+- `tests/fixtures/ts_reference.json` holds runs exported from the TypeScript solver; the cross-check test compares per-bead signals with them. Regenerate it if the TS solver changes.
14+- The JS has no tests; check changes in a browser against runs in `work/`.
15+- Update `AGENT_GUIDE.md` and `README.md` when the API, the store layout or the components change.
README.mdadded+65−0View file
@@ -0,0 +1,65 @@
1+# beadnet
2+
3+A Python package for idealized percussion: networks of beads (point masses) joined by springs, bending elements and hinges, struck and integrated accurately in time, with browser components for listening to and looking at the results. It is a companion to the [bead-percussion](https://vault1.magland.org/proof-of-concept/bead-percussion) browser app, whose solver it ports, and it is meant to be driven by an AI agent that assembles models, runs them and writes HTML pages from a small set of components.
4+
5+The model, the integrator and the damping law are those of the app; see its README for the physics. Here we describe what differs: the models are built in Python, the runs record every bead, and the results are stored on disk for viewing afterwards.
6+
7+## Install
8+
9+```bash
10+pip install -e . # numpy, numba, scipy; Python 3.9 or later
11+pip install -e '.[test]' # adds pytest
12+```
13+
14+## Use
15+
16+```python
17+import beadnet as bn
18+from beadnet import examples
19+
20+m = examples.drum(force=0.8) # or build a bn.Model from the helpers
21+bn.save_model(m, "work/models/drum") # the model alone, for a preview
22+r = bn.run(m, "work/runs/drum") # integrate and record
23+print(r.summary())
24+x = r.signal(412) # acceleration of bead 412, chosen after the run
25+```
26+
27+```bash
28+beadnet serve work # http://127.0.0.1:8790/ lists pages, runs and models
29+beadnet guide # the agent guide
30+```
31+
32+A page is plain HTML with custom elements:
33+
34+```html
35+<script type="module" src="beadnet/beadnet.js"></script>
36+<bn-run src="../runs/drum">
37+ <bn-controls></bn-controls>
38+ <bn-animation></bn-animation>
39+ <bn-waveform></bn-waveform>
40+ <bn-spectrogram scale="log"></bn-spectrogram>
41+</bn-run>
42+```
43+
44+[beadnet/AGENT_GUIDE.md](beadnet/AGENT_GUIDE.md) is the reference for models, runs, outputs and components; an agent should read it before building a model. `skills/beadnet/SKILL.md` wraps it as a Claude Code skill.
45+
46+## What a run records
47+
48+Unlike the app, which records one listener chosen before the run, a run here records, for every bead, the acceleration and the displacement along a chosen direction at the audio rate (48 kHz by default), with their sums over all beads, plus 3D displacement frames of all beads at a lower rate (2 kHz by default), the energy, and optionally the energy in each linear mode. The listener is therefore chosen afterwards, in Python or by clicking a bead in the browser. The acceleration at each sample is computed from the forces, with the damping step that is still pending at the sample boundary taken into account, as in the app.
49+
50+The trade-off is size. Each recorded quantity takes about 4 bytes per bead per sample, since float32 audio signals barely compress: the 2 s drum (823 beads) stores about 300 MB per quantity. Recording every bead also costs 20 to 35% more time than recording one.
51+
52+Results go into a directory that is a Zarr v2 store with gzip chunks, one bead by 32768 samples per signal chunk. The browser fetches only the chunks it needs (one bead's signal, a range of frames), and zarr-python reads the store directly; the package itself reads and writes it without a zarr dependency.
53+
54+## Accuracy and speed
55+
56+The per-bead signals agree with the app's TypeScript solver to float32 rounding for the same model and time step (`tests/test_solver.py`, with reference runs exported from the app: a nonlinear string with two strikes under Yoshida integration, a hinged dome, a plate with bending triplets and soft anchors, and friction-only damping). The tests also check the analytic modes and fundamental of a beaded string, energy conservation without damping, the hinge gradient against finite differences, and the exactness of the decay law at small amplitude for flat and curved nets.
57+
58+The kernels are compiled with numba and run on one core. On a laptop, the drum runs at about 10 times real time, the plate (1015 beads, bending triplets) about 25 times and the dome (367 beads, hinges) about 14 times, comparable to the app in the browser. Separate runs can go in parallel. A GPU path, as in the app, is not implemented.
59+
60+## Limitations
61+
62+- The viewer's 3D view is a plain canvas; it is comfortable up to a few thousand beads.
63+- Bending triplets need straight or flat rest shapes; hinges handle curved ones.
64+- The perturbed-twin chaos test and the small-strike comparison of the app are not built in; both are a second run of a modified model (`model.scaled_hits`, `bn.rel_diff`).
65+- Mode energies are recorded when `modes=True`, but there is no component for them yet.
beadnet/AGENT_GUIDE.mdadded+194−0View file
@@ -0,0 +1,194 @@
1+# beadnet: guide for building, running and viewing models
2+
3+This guide is for an AI agent (or a person) who is asked to set up bead-and-spring percussion models, run them, and produce HTML pages for listening to and looking at the results. Read it in full before the first model. `beadnet guide` prints it.
4+
5+## What the package does
6+
7+A model is a network of point masses (beads) in 3D joined by elements: springs with rest length and pre-tension, bending triplets, hinges between triangles, and dashpots. Beads can be pinned. Strikes are impulses or short force pulses. The solver integrates the full nonlinear equations of motion (the springs are real springs, so the geometric nonlinearity is exact) with velocity Verlet or a fourth-order Yoshida scheme, at a time step chosen from the highest frequency of the net, and records at the audio rate (48 kHz by default):
8+
9+- for every bead, the acceleration and the displacement along a direction (`signal_dir`, default z), plus their sums over all beads;
10+- 3D displacement frames of all beads at a lower rate (`frame_rate`, default 2 kHz) for animation;
11+- the mechanical energy and the energy removed by damping at each frame;
12+- optionally, the energy in each linear mode at each frame.
13+
14+Because every bead is recorded, the listener is chosen afterwards, in Python or in the browser. The results go into a directory (a Zarr v2 store, gzip chunks) that the browser components read chunk by chunk.
15+
16+The physics and the solver are a port of the bead-percussion browser app; the per-bead signals agree with that app's listener to float32 rounding.
17+
18+## Workflow
19+
20+1. Work in one directory (the *workspace*), e.g. `work/` in the beadnet repository (gitignored). Put model scripts in `work/scripts/`, results in `work/runs/<name>/`, saved models in `work/models/<name>/`, and pages in `work/pages/`.
21+2. Write a Python script that builds a `bn.Model`. Use the helpers below and the examples in `beadnet/examples.py` as templates. Keep each model's parameters at the top of the script with units in comments.
22+3. Preview before running: `bn.save_model(model, "work/models/<name>")` writes the model alone, and its summary (`bn.load(path).summary()` or `beadnet info path`) gives the planned time step, the highest frequency, the residual force at rest and the warnings. `bn.modes(model).freqs[:10]` gives the lowest frequencies (Hz); check the pitch this way before a long run. The viewer shows the geometry, pinned and struck beads, and the planned run. Check the warnings; a model whose rest positions are not an equilibrium will move before any strike.
23+4. Estimate the cost (see "Cost and size" below). Runs over a minute or so should go to a background process (on a workstation if one is available), not block the conversation.
24+5. Run: `bn.run(model, "work/runs/<name>")`. It prints progress and a summary to stderr. Read the summary: energy drift, warnings, and whether the run aborted.
25+6. View: `beadnet serve work` (port 8790) and open `http://127.0.0.1:8790/`. The index lists pages and every run or model, each with a default viewer (`/beadnet/view.html?src=/runs/<name>`). For a specific presentation (comparisons, fixed listeners, explanations), write an HTML page with the components (see "HTML components").
26+7. Report to the user with numbers: fundamental, decay, energy drift, real-time factor, and what to listen for. Give the URL of the page.
27+
28+Minimal script:
29+
30+```python
31+import numpy as np
32+import beadnet as bn
33+
34+R, a = 0.15, 0.01 # radius, bead spacing (m)
35+sigma, T = 0.25, 2000.0 # areal density (kg/m^2), membrane tension (N/m)
36+strain = 0.02 # spring stretch at rest
37+
38+pos, tri, rim, _ = bn.hexdisk(R, a)
39+f0 = T * a / np.sqrt(3) # spring tension giving membrane tension T
40+m = bn.Model(pos=pos, mass=sigma * np.sqrt(3) / 2 * a**2, pinned=rim,
41+ springs=bn.springs(pos, bn.edges(tri), f0 / (strain * a), f0))
42+bn.decay(m, [(200, 2.5), (2000, 0.75)]) # T60: 2.5 s at 200 Hz, 0.75 s at 2 kHz
43+m.hits = [bn.Hit(beads=bn.near(pos, [0.05, 0], 0.03), force=[0, 0, -0.4], duration=1e-3)]
44+m.duration = 2.0
45+m.listen = bn.nearest(pos, [-0.04, 0.03]) # initial listener in the viewer
46+m.name, m.notes = "drum", "823 beads, rim pinned, soft mallet"
47+
48+bn.save_model(m, "work/models/drum") # preview
49+r = bn.run(m, "work/runs/drum")
50+print(r.summary())
51+```
52+
53+## The model
54+
55+All quantities are SI. Bead indices are 0-based. Element tables are float arrays whose first columns hold bead indices.
56+
57+| Field | Meaning |
58+| --- | --- |
59+| `pos` | (n, 3) rest positions (m). |
60+| `mass` | scalar or (n,) masses (kg). |
61+| `pinned` | bead indices (or a boolean mask) held fixed. |
62+| `springs` | rows `[i, j, k, L0]` or `[i, j, k, L0, k3]`: force along the spring k e + k3 e^3, e = length - L0. L0 shorter than the rest distance means tension at rest. |
63+| `bends` | rows `[i, j, k, kb]` or `[..., cb]`: energy kb/2 \|x_i - 2 x_j + x_k\|^2 (j the middle bead). Needs straight, evenly spaced rest triplets (flat plates, straight bars). Damping cb. |
64+| `hinges` | rows `[i, j, k, l, kh]` or `[..., ch]`: energy kh/2 (theta - theta0)^2 for the angle across edge j-k between triangles (i, j, k) and (l, k, j); theta0 is taken from `pos`, so any rest shape is stress free (domes, bells). Damping ch. |
65+| `dashpots` | rows `[i, j, c]` or `[i, j, c, ca]`: force c (v_j - v_i) on i plus an axial part ca along the current direction. Usually set by `decay`. |
66+| `friction` | None, scalar or (n,): force -c0 v on each bead. None with no damped elements gives the default: every mode decays 60 dB in 2.5 s. `friction=0` and no dashpots means no damping. |
67+| `hits` | list of `bn.Hit(beads, t=0, velocity=[vx,vy,vz])` (impulse) or `bn.Hit(beads, t, force=[fx,fy,fz], duration=d)` (raised-cosine pulse with that peak force per bead). Any number, at any times. |
68+| `duration` | simulated time (s). |
69+| `sample_rate` | audio rate (Hz), default 48000. |
70+| `dt` | integrator step; 0 (default) chooses it from the highest frequency at rest with `safety` (default 0.5) of the stability limit, rounded so a whole number of steps fits in each sample. |
71+| `method` | `'verlet'` (default) or `'yoshida4'` (fourth order, about 3x the cost per step but more accurate frequencies). |
72+| `frame_rate` | rate of the 3D frames (Hz), default 2000. Frames above about 1 GB are thinned automatically. |
73+| `signal_dir` | direction of the recorded per-bead signals, default (0, 0, 1). |
74+| `record` | quantities recorded for every bead: any of `'acceleration'`, `'velocity'`, `'displacement'`; default acceleration and displacement. |
75+| `modes` | True to compute linear modes and record the energy of each mode at each frame. |
76+| `listen` | initial listener shown in the viewer: a bead index or `'sum'`. Not used by the solver. |
77+| `name`, `notes` | shown in the viewer. |
78+
79+Helpers (all return 0-based arrays):
80+
81+- `bn.hexdisk(R, a)` returns `(pos, tri, rim, trip)`: a triangular lattice clipped to a disk in the plane z = 0, its triangles, its rim beads (pin these for a drum head) and its bending triplets.
82+- `bn.hexlattice(inside, extent, a)`: the same for any planar shape; `inside(x, y)` returns a boolean array and the shape lies within `extent` of the origin. Rectangle 20 x 14 cm: `bn.hexlattice(lambda x, y: (abs(x) <= 0.1) & (abs(y) <= 0.07), 0.13, 0.01)`. Curved shapes: set `pos[:, 2]` afterwards and use hinges (see `examples.dome`).
83+- `bn.chain(n, length)` returns `(pos, E, trip)`: a line of beads along x, its neighbor pairs and triplets. End beads are 0 and n-1.
84+- `bn.edges(tri)`: unique edges of a triangle list.
85+- `bn.springs(pos, E, k, f0, k3=None)`: spring table along edges E with stiffness k and tension f0 at the given positions (L0 = L - f0/k). With f0 > 0 and uniform tension, every interior bead of a hexdisk is at equilibrium.
86+- `bn.bends(trip, kb, cb=None)`, `bn.hinges(tri, kh, ch=None)`, `bn.hinge_quads(tri)`: bending and hinge tables.
87+- `bn.near(pos, p, r)`: beads within r of point p (the nearest bead if none); `bn.nearest(pos, p)`: one bead.
88+- `bn.anchor(pos, beads, kz, h=0.02)` returns `(pos, springs, anchors)`: soft supports (cords, felt). Append `springs` to the model's springs and `anchors` to `pinned`.
89+- `bn.decay(model, [(f1, T1), (f2, T2)])`: sets friction, dashpots and element damping so that at small amplitude every mode decays with amplitude rate sigma0 + sigma1 (2 pi f)^2 through the given 60 dB decay times (one point: the same T60 for all modes). Call it after the elements are set; it adds columns to `bends` and `hinges`. Exact for flat and curved nets at small amplitude.
90+- `bn.modes(model)` returns a `Modes` object with attributes `freqs` (Hz, ascending), `psi` (orthonormal vectors of M^-1/2 K M^-1/2, one row per mode), `dof` (coordinate index 3*bead + component of each column), `kind` (`'transverse'`, z only, for a flat net; `'full'` otherwise), and `shapes(mass, n)` for (K, n, 3) mode shapes. Dense solver: fine up to a few thousand degrees of freedom. `bn.modal_damping(model, modes)` gives each mode's decay rate sigma (T60 = ln(1000)/sigma).
91+- `model.scaled_hits(f)`: a copy with every strike scaled, for the small-strike (linear) reference.
92+- `bn.prepare(bn.check(model))`: a dict with `dt`, `substeps`, `omega_max` (rad/s), `n_samples`, `residual_force`, `max_tension` and `warnings`, without running or writing anything.
93+
94+Examples (`from beadnet import examples`; each takes keyword parameters, see the docstrings): `drum` (823 beads, 237 Hz), `cascade` (loose drum head, hard strike, energy moves to high modes), `string` (120 beads), `plate` (free rim, bending triplets, 1015 beads), `dome` (domed cymbal with hinges, 367 beads), `bar` (free bar on soft supports, 880 Hz target), `chaos` (two beads on a string, 6 degrees of freedom). `beadnet example drum work/runs/drum` runs one.
95+
96+## Physics guidance
97+
98+- **Rest state.** The rest positions must be an equilibrium or the net moves before any strike (the run warns). Tensioned nets: use uniform tension from `bn.springs` on a lattice with the rim pinned. Free or curved objects: use springs with zero tension (f0 = 0) and get stiffness from `bends` (flat) or `hinges` (any shape).
99+- **Support.** A free object needs support or it drifts and spins: pin a small cluster (one pinned bead lets a plate tilt), or use `bn.anchor`. With `modes=True` the run warns about 0 Hz modes.
100+- **Scope.** Available: nets of beads in any planar shape (`hexlattice`), curved shells (set z, use hinges), strings and bars (`chain`), soft supports. Not available: air (no cavity, no radiation, no coupling between two heads through air), a drum shell, contact with a mallet that stays on the head (a strike is a prescribed force or impulse). Say so when a request needs these, and build the closest model.
101+- **Strikes.** A strike is a force pulse per bead (or an impulse). Its duration sets how bright it is: a pulse of duration d excites little above about 1/d (1 ms: mostly below 1 kHz; 0.2 to 0.3 ms: up to several kHz). Rough guide for a drum head: soft felt mallet, 1 to 3 ms over a 2 to 3 cm patch; stick, 0.2 to 0.5 ms over 1 to 2 cm. The force sets the amplitude, and with it the nonlinearity. Start from the examples' values (drum: 0.4 N per bead for 1 ms on 36 beads, about 2 mm peak displacement) and scale.
102+- **Drum head values.** Rough values for real heads: tension 1000 to 5000 N/m, areal density 0.25 to 0.35 kg/m^2 (single-ply mylar). Tom radius 0.1 to 0.2 m, snare 0.18, bass 0.25 to 0.3.
103+- **Pitch.** Drum head: fundamental near 2.405/(2 pi R) sqrt(T/sigma); the bead net comes out a few percent higher (lattice and rim effects), so trust `bn.modes`. String: sqrt(T/mu)/(2L). Bar: f1 = 22.37/(2 pi L^2) sqrt(EI/rhoA) with EI = kb a^3. Check with `bn.modes` before a long run.
104+- **Upper frequency.** A net cannot vibrate above a frequency set by its spacing (about 4 kHz for the 1 cm drum). For brighter sounds use more, smaller beads.
105+- **Time step and cost.** The step is set by the stiffest motion, usually in-plane stretching, not by the audible modes. The "highest frequency" in summaries is this linearized maximum (often 10 to 20 kHz), not an audible partial; the transverse spectrum stops much lower. A smaller pre-stretch (`strain`) is more realistic and more nonlinear but stiffer in-plane, so it costs more steps.
106+- **Nonlinearity.** Large strikes stretch the springs, which raises the tension and couples the modes. Compare a strike with its small-strike reference: run `model.scaled_hits(1e-3)` and scale the signal back up by 1e3; `bn.rel_diff(ref, sig, n)` measures the difference over the first n samples.
107+- **Damping.** Use `bn.decay` with decay times rather than raw coefficients. Higher modes may not ring longer than lower ones under its law.
108+- **Listening.** Acceleration is closest to what a small vibrating surface radiates; displacement weights each frequency by 1/f^2 and sounds dull. The sum over all beads of a net with equal masses is the total force on the free beads from the supports, the strikes and friction (internal forces cancel), divided by the mass; for a flat net it is proportional to the volume acceleration, which sets the low-frequency sound radiated by a baffled membrane or plate.
109+
110+## Cost and size
111+
112+- The cost per step is roughly proportional to the number of elements. Measured real-time factors (wall time over simulated time, one core): drum (823 beads, 2364 springs, 3 steps per sample) about 10x, plate (1015 beads, 6 steps per sample) about 25x, dome (367 beads) about 14x. Recording every bead's acceleration adds 20 to 35%. The first run in a fresh environment also compiles the kernels (about 20 s, cached afterwards).
113+- Each recorded quantity takes n x samples x 4 bytes, compressed only slightly: about 4 bytes per bead per sample. The 2 s drum stores about 300 MB per quantity; frames add n x 12 bytes per frame. Plan the disk use of long or large runs, and lower `duration`, `record` or `frame_rate` when exploring.
114+- Several runs can go in parallel (one core each).
115+- Accuracy: the summary reports the energy drift after the last strike (with damping counted) and the integrator's frequency error in cents. To check convergence, rerun with `m.dt = r.meta["dt"] / 2` and compare signals with `bn.rel_diff` over a short window (in chaotic runs the difference grows with time whatever the step).
116+
117+## Reading results in Python
118+
119+```python
120+r = bn.load("work/runs/drum")
121+r.summary() # text summary
122+r.meta # dt, substeps, energy_drift, freq_errors, realtime_factor, ...
123+x = r.signal(412) # acceleration of bead 412 (float32, at r.sample_rate)
124+x = r.signal("sum", "displacement") # sum over all beads
125+x = r.signal([10, 11, 12]) # sum over a set of beads
126+F = r.frames(0, 100) # frames 0 <= f < 100: (100, n, 3) displacements; r.frame_times (s)
127+r.energy, r.dissipated # per frame (J)
128+r.mode_freqs, r.mode_energy # if the model had modes=True
129+r.write_wav("drum.wav", 412) # 16-bit WAV, normalized to its own peak
130+r.write_wav("a.wav", 412, full_scale=2e4) # divided by 2e4 m/s^2 instead (same scale across runs)
131+bn.rel_diff(a, b, n) # sqrt(sum((a-b)^2)/sum(a^2)) over the first n samples
132+m = r.model # the model, to modify and rerun
133+```
134+
135+Store layout (for reference): `.zattrs` (`beadnet.model` settings and hits, `beadnet.run` statistics, `beadnet.warnings`), `model/` (pos, mass, pinned, friction, springs, bends, hinges, dashpots, edges), `signals/<quantity>` (n, samples) in chunks of one bead by 32768 samples, `signals/<quantity>_sum`, `frames/` (displacement (F, n, 3), t, energy, dissipated), `modes/` (freqs, sigma, energy).
136+
137+## HTML components
138+
139+Pages load one script and use custom elements. Paths are relative to the page.
140+
141+```html
142+<script type="module" src="beadnet/beadnet.js"></script>
143+
144+<bn-run src="../runs/drum">
145+ <bn-controls></bn-controls>
146+ <bn-animation></bn-animation>
147+ <bn-waveform></bn-waveform>
148+ <bn-spectrogram></bn-spectrogram>
149+ <bn-info></bn-info>
150+</bn-run>
151+```
152+
153+`beadnet serve` provides `beadnet/beadnet.js` next to any page, so pages can live anywhere in the workspace. For hosting elsewhere, `beadnet copy-js <page-dir>` copies the script. Pages must be served over HTTP (not opened as files). `bn.write_page("work/pages/x.html", ["work/runs/a", "work/runs/b"], title=...)` writes a page with the default components for each run.
154+
155+`<bn-run src>` loads one run or saved model and holds the state its children share: the listener (`"sum"` or a bead), the quantity, the time cursor and the visible time window. Attributes `listener` and `quantity` set the initial state. Playback and WAV download are normalized to each signal's own peak, so two runs sound equally loud; to compare loudness, give every `<bn-run>` the same `full-scale` attribute (signal units at full scale, e.g. `full-scale="20000"` for accelerations in m/s^2; louder parts clip). Children go inside it, or anywhere on the page with `run="<id of the bn-run>"`.
156+
157+| Element | What it shows | Attributes |
158+| --- | --- | --- |
159+| `<bn-controls>` | listener (sum or bead number), quantity, play/stop, WAV download | |
160+| `<bn-model>` | the net in 3D (drag to rotate, shift-drag to pan, ctrl+wheel to zoom, double-click to reset); pinned beads dark, struck beads ringed orange, listener ringed green; click a bead to listen there | `height`, `azimuth`, `elevation` (radians) |
161+| `<bn-animation>` | the same view, animated from the frames, beads colored by displacement along `signal_dir`; play, time slider, slow-motion factor, exaggeration. By default the exaggeration is chosen per run (largest displacement shown as 8% of the object's size, never below true scale), so two runs look alike; set `exaggeration` to the same number on both to compare amplitudes | `height`, `azimuth`, `elevation`, `speed` (e.g. `0.0078125` for 1/128), `exaggeration` (fixed factor) |
162+| `<bn-waveform>` | the listener's signal; click to set the cursor, drag to pan, ctrl+wheel to zoom, double-click for the full run; play from the cursor. The y range fits the visible signal unless `ymax` is set | `height`, `listener`, `quantity` (fix this plot to a bead or quantity), `ymax` (signal units) |
163+| `<bn-spectrogram>` | short-time spectrum of the listener's signal (Hann window), synchronized with the waveform. Colors span `range` dB below the plot's own maximum, or below `max-db` if set (10 log10 of the squared STFT magnitude in signal units; use the same value on two plots to compare levels) | `height`, `listener`, `quantity`, `fmax`, `fmin`, `scale` (`linear` or `log`), `range` (dB), `max-db`, `window`, `hop`, `independent` |
164+| `<bn-energy>` | mechanical energy and energy removed by damping over time (log scale) | `height` |
165+| `<bn-info>` | model notes, strikes, time step, accuracy, cost, warnings | |
166+
167+The waveform and spectrogram of a run share the time window unless a plot has `independent`. A plot with a `listener` or `quantity` attribute stays fixed to it while the rest follow the controls; this is how to show, for example, bead 412 and the sum side by side:
168+
169+```html
170+<bn-run src="../runs/cascade" listener="412">
171+ <bn-controls></bn-controls>
172+ <bn-waveform></bn-waveform>
173+ <bn-waveform listener="sum"></bn-waveform>
174+ <bn-spectrogram scale="log" fmax="8000"></bn-spectrogram>
175+</bn-run>
176+```
177+
178+To compare runs (a strike and its small-strike reference, two damping laws, flat and domed), give each its own `<bn-run>` and put them under headings with a sentence on what to listen for. Pages may contain any other HTML: explanations, tables of parameters, links. Keep pages plain; the components carry their own styles and follow the system light or dark theme (`<html data-theme="dark">` or `"light"` forces one). Give the page body the same tokens so it matches the panels in both themes:
179+
180+```html
181+<style>
182+ body { margin: 0; background: var(--bn-bg); color: var(--bn-fg); font: 14px/1.5 system-ui, sans-serif; }
183+ main { max-width: 1100px; margin: 0 auto; padding: 16px; }
184+</style>
185+```
186+
187+## Pitfalls
188+
189+- Indices are 0-based (the numbl version of the app used 1-based ones).
190+- `Hit` needs either `velocity` (impulse, no duration) or `force` with `duration > 0`, not both.
191+- A hit force is per bead: striking 36 beads with 0.4 N each is 14.4 N in total.
192+- `bn.decay` must come after all springs, bends and hinges are set, and it replaces `friction` and `dashpots`.
193+- Rerunning into the same directory replaces the earlier results. Use a new directory to keep both.
194+- Do not open pages with `file://`; serve the workspace.
beadnet/__init__.pyadded+22−0View file
@@ -0,0 +1,22 @@
1+"""beadnet: idealized percussion with networks of beads and springs.
2+
3+See AGENT_GUIDE.md (or `beadnet guide`) for how to build, run and view models.
4+"""
5+
6+__version__ = "0.1.0"
7+
8+from .model import DEFAULT_T60, Hit, Model, ModelError, check # noqa: E402
9+from .geometry import anchor, bends, chain, edges, hexdisk, hexlattice, hinge_quads, hinges, near, nearest, springs # noqa: E402
10+from .damping import decay # noqa: E402
11+from .modes import Modes, modal_damping, modes, stiffness # noqa: E402
12+from .solver import frequency_error_cents, load_model, prepare, run, save_model, stability_limit # noqa: E402
13+from .results import Run, load, rel_diff # noqa: E402
14+from .page import write_page # noqa: E402
15+
16+__all__ = [
17+ "DEFAULT_T60", "Hit", "Model", "ModelError", "check",
18+ "anchor", "bends", "chain", "edges", "hexdisk", "hexlattice", "hinge_quads", "hinges", "near", "nearest", "springs",
19+ "decay", "Modes", "modal_damping", "modes", "stiffness",
20+ "frequency_error_cents", "load_model", "prepare", "run", "save_model", "stability_limit",
21+ "Run", "load", "rel_diff", "write_page",
22+]
beadnet/cli.pyadded+173−0View file
@@ -0,0 +1,173 @@
1+"""Command line: beadnet serve | info | guide | page | example | copy-js."""
2+
3+from __future__ import annotations
4+
5+import argparse
6+import html
7+import http.server
8+import json
9+import os
10+import sys
11+import urllib.parse
12+
13+from .page import STATIC, copy_static, page_html, write_page
14+
15+GUIDE = os.path.join(os.path.dirname(__file__), "AGENT_GUIDE.md")
16+
17+
18+def _find_stores(root: str, max_depth: int = 4):
19+ out = []
20+ for d, dirs, files in os.walk(root):
21+ depth = os.path.relpath(d, root).count(os.sep)
22+ dirs[:] = sorted(x for x in dirs if not x.startswith(".") and x not in ("node_modules", "__pycache__"))
23+ if ".zattrs" in files and ".zgroup" in files:
24+ try:
25+ with open(os.path.join(d, ".zattrs")) as f:
26+ a = json.load(f).get("beadnet")
27+ except Exception:
28+ a = None
29+ if a:
30+ out.append((os.path.relpath(d, root), a))
31+ dirs[:] = []
32+ continue
33+ if depth >= max_depth:
34+ dirs[:] = []
35+ return out
36+
37+
38+def _find_pages(root: str, max_depth: int = 3):
39+ out = []
40+ for d, dirs, files in os.walk(root):
41+ depth = os.path.relpath(d, root).count(os.sep)
42+ dirs[:] = sorted(x for x in dirs if not x.startswith(".") and x != "beadnet")
43+ if os.path.exists(os.path.join(d, ".zgroup")):
44+ dirs[:] = []
45+ continue
46+ out += [os.path.relpath(os.path.join(d, f), root) for f in sorted(files) if f.endswith(".html")]
47+ if depth >= max_depth:
48+ dirs[:] = []
49+ return out
50+
51+
52+def _index_html(root: str) -> str:
53+ pages = _find_pages(root)
54+ stores = _find_stores(root)
55+ items = []
56+ if pages:
57+ items.append("<h2>Pages</h2><ul>" + "".join(
58+ f'<li><a href="/{urllib.parse.quote(p)}">{html.escape(p)}</a></li>' for p in pages) + "</ul>")
59+ if stores:
60+ rows = []
61+ for rel, a in stores:
62+ url = "/" + urllib.parse.quote(rel.replace(os.sep, "/"))
63+ name = a.get("model", {}).get("name") or ""
64+ r = a.get("run") or {}
65+ what = (f"run, {r.get('n_samples', 0) / max(r.get('sample_rate', 1), 1):.2f} s" if a.get("kind") == "run"
66+ else a.get("kind", "?"))
67+ rows.append(f'<li><a href="/beadnet/view.html?src={url}">{html.escape(rel)}</a> '
68+ f'<span style="color:var(--bn-muted)">{html.escape(name)} · {a.get("n")} beads · {what}</span></li>')
69+ items.append("<h2>Runs and models</h2><ul>" + "".join(rows) + "</ul>")
70+ if not items:
71+ items.append("<p>No pages or beadnet stores found under this directory.</p>")
72+ return page_html("\n".join(items), title=f"beadnet: {os.path.basename(root) or root}", script="/beadnet/beadnet.js")
73+
74+
75+class Handler(http.server.SimpleHTTPRequestHandler):
76+ """Static files from the served directory; any path ending in beadnet/<file>
77+ that names a file of the package's static directory is served from the package
78+ (so pages anywhere can use beadnet/beadnet.js), and / lists pages and runs."""
79+
80+ def end_headers(self):
81+ self.send_header("Cache-Control", "no-store")
82+ super().end_headers()
83+
84+ def log_message(self, fmt, *args):
85+ if os.environ.get("BEADNET_SERVE_LOG"):
86+ super().log_message(fmt, *args)
87+
88+ def do_GET(self):
89+ path = urllib.parse.urlparse(self.path).path
90+ parts = [p for p in path.split("/") if p]
91+ if len(parts) >= 2 and parts[-2] == "beadnet" and parts[-1] in os.listdir(STATIC):
92+ return self._send_file(os.path.join(STATIC, parts[-1]))
93+ if path == "/" and not os.path.exists(os.path.join(self.directory, "index.html")):
94+ body = _index_html(self.directory).encode()
95+ self.send_response(200)
96+ self.send_header("Content-Type", "text/html; charset=utf-8")
97+ self.send_header("Content-Length", str(len(body)))
98+ self.end_headers()
99+ self.wfile.write(body)
100+ return
101+ return super().do_GET()
102+
103+ def _send_file(self, p: str):
104+ with open(p, "rb") as f:
105+ data = f.read()
106+ self.send_response(200)
107+ ctype = {"js": "text/javascript", "html": "text/html; charset=utf-8"}.get(p.rsplit(".", 1)[-1],
108+ "application/octet-stream")
109+ self.send_header("Content-Type", ctype)
110+ self.send_header("Content-Length", str(len(data)))
111+ self.end_headers()
112+ self.wfile.write(data)
113+
114+
115+def serve(directory: str, port: int, host: str) -> None:
116+ directory = os.path.abspath(directory)
117+
118+ def handler(*a, **kw):
119+ return Handler(*a, directory=directory, **kw)
120+
121+ httpd = http.server.ThreadingHTTPServer((host, port), handler)
122+ print(f"beadnet: serving {directory} at http://{host}:{port}/", flush=True)
123+ try:
124+ httpd.serve_forever()
125+ except KeyboardInterrupt:
126+ pass
127+
128+
129+def main(argv=None) -> None:
130+ p = argparse.ArgumentParser(prog="beadnet", description="beadnet: bead-and-spring percussion models")
131+ sub = p.add_subparsers(dest="cmd", required=True)
132+ s = sub.add_parser("serve", help="serve a directory of pages and runs for viewing")
133+ s.add_argument("directory", nargs="?", default=".")
134+ s.add_argument("--port", type=int, default=8790)
135+ s.add_argument("--host", default="127.0.0.1")
136+ s = sub.add_parser("info", help="print a summary of a run or saved model")
137+ s.add_argument("path")
138+ sub.add_parser("guide", help="print the agent guide (how to build, run and view models)")
139+ s = sub.add_parser("page", help="write an HTML page showing runs with the default components")
140+ s.add_argument("out")
141+ s.add_argument("runs", nargs="+")
142+ s.add_argument("--title", default="beadnet")
143+ s = sub.add_parser("example", help="run one of the example models")
144+ s.add_argument("name")
145+ s.add_argument("out")
146+ s.add_argument("--duration", type=float, default=None)
147+ s = sub.add_parser("copy-js", help="copy the components to DIR/beadnet/ (for static hosting)")
148+ s.add_argument("directory")
149+ a = p.parse_args(argv)
150+ if a.cmd == "serve":
151+ serve(a.directory, a.port, a.host)
152+ elif a.cmd == "info":
153+ from .results import Run
154+ print(Run(a.path).summary())
155+ elif a.cmd == "guide":
156+ print(f"# (from {GUIDE})\n")
157+ with open(GUIDE) as f:
158+ sys.stdout.write(f.read())
159+ elif a.cmd == "page":
160+ print(write_page(a.out, a.runs, title=a.title))
161+ elif a.cmd == "example":
162+ from . import examples
163+ from .solver import run
164+ if a.name not in examples.ALL:
165+ sys.exit(f"unknown example {a.name!r}; choose from {', '.join(examples.ALL)}")
166+ kw = {} if a.duration is None else {"duration": a.duration}
167+ run(examples.ALL[a.name](**kw), a.out)
168+ elif a.cmd == "copy-js":
169+ print(copy_static(a.directory))
170+
171+
172+if __name__ == "__main__":
173+ main()
beadnet/damping.pyadded+70−0View file
@@ -0,0 +1,70 @@
1+"""Damping set by decay times."""
2+
3+from __future__ import annotations
4+
5+import numpy as np
6+
7+from .model import Model
8+
9+
10+def decay(m: Model, T60) -> Model:
11+ """Set the damping from chosen decay times (modifies and returns m).
12+
13+ T60 is [(f1, T1)] or [(f1, T1), (f2, T2)] (Hz, seconds to fall by 60 dB).
14+ At small amplitude each mode then decays at the amplitude rate
15+
16+ sigma(f) = sigma0 + sigma1 (2 pi f)^2
17+
18+ through the given points; with one point every mode gets the same decay
19+ time. T1 must be at least T2 when f1 < f2. Call it after the elements are
20+ set.
21+
22+ Each bead gets friction 2 sigma0 m; each spring a dashpot in parallel with
23+ isotropic part 2 sigma1 g and axial part 2 sigma1 (keff - g), where g is
24+ the spring's tension divided by its length at rest and keff its stiffness
25+ there; each bending triplet the damping 2 sigma1 kb, and each hinge
26+ 2 sigma1 kh. The damping matrix at rest is then 2 sigma0 M + 2 sigma1 K, so
27+ the modes stay uncoupled and the law holds exactly at small amplitude, for
28+ flat and curved nets alike.
29+ """
30+ T = np.atleast_2d(np.asarray(T60, dtype=np.float64))
31+ if T.shape[1] != 2 or T.shape[0] not in (1, 2):
32+ raise ValueError("decay: T60 must be [(f1, T1)] or [(f1, T1), (f2, T2)]")
33+ s = np.log(1000.0) / T[:, 1]
34+ w2 = (2 * np.pi * T[:, 0]) ** 2
35+ if T.shape[0] == 1:
36+ sigma0, sigma1 = s[0], 0.0
37+ else:
38+ sigma1 = (s[1] - s[0]) / (w2[1] - w2[0])
39+ sigma0 = s[0] - sigma1 * w2[0]
40+ if sigma1 < 0:
41+ raise ValueError("decay: the higher frequency must not ring longer than the lower one")
42+ if sigma0 < 0:
43+ raise ValueError("decay: decay at the higher frequency is too fast for sigma0 + sigma1 w^2; "
44+ "raise its T60 or lower the other")
45+ pos = np.asarray(m.pos, dtype=np.float64)
46+ n = pos.shape[0]
47+ m.friction = 2 * sigma0 * np.broadcast_to(np.asarray(m.mass, dtype=np.float64), (n,)).copy()
48+ if m.springs is not None and len(m.springs) > 0:
49+ S = np.asarray(m.springs, dtype=np.float64)
50+ i = S[:, 0].astype(np.int64)
51+ j = S[:, 1].astype(np.int64)
52+ L = np.linalg.norm(pos[i] - pos[j], axis=1)
53+ e = L - S[:, 3]
54+ f = S[:, 2] * e
55+ keff = S[:, 2].copy()
56+ if S.shape[1] > 4:
57+ f = f + S[:, 4] * e ** 3
58+ keff = keff + 3 * S[:, 4] * e ** 2
59+ g = f / L
60+ m.dashpots = np.column_stack([i, j, 2 * sigma1 * g, 2 * sigma1 * (keff - g)])
61+ else:
62+ m.dashpots = np.zeros((0, 4))
63+ if m.bends is not None and len(m.bends) > 0:
64+ B = np.asarray(m.bends, dtype=np.float64)
65+ m.bends = np.column_stack([B[:, :4], 2 * sigma1 * B[:, 3]])
66+ if m.hinges is not None and len(m.hinges) > 0:
67+ H = np.asarray(m.hinges, dtype=np.float64)
68+ m.hinges = np.column_stack([H[:, :5], 2 * sigma1 * H[:, 4]])
69+ m.decay_law = [float(sigma0), float(sigma1)]
70+ return m
beadnet/examples.pyadded+154−0View file
@@ -0,0 +1,154 @@
1+"""Example models, ported from the numbl examples of the bead-percussion app.
2+
3+Each function returns a Model; keyword arguments change the main parameters.
4+Units are SI. Run one with, e.g.
5+
6+ import beadnet as bn
7+ from beadnet import examples
8+ bn.run(examples.drum(force=0.8), "runs/drum")
9+"""
10+
11+from __future__ import annotations
12+
13+import numpy as np
14+
15+from .damping import decay
16+from .geometry import anchor, bends, chain, edges, hexdisk, hinges, near, nearest, springs
17+from .model import Hit, Model
18+
19+
20+def drum(R=0.15, a=0.01, sigma=0.25, T=2000.0, strain=0.02, force=0.4, duration=2.0) -> Model:
21+ """Drum head: a triangular net under tension, pinned at the rim, struck by a soft mallet.
22+
23+ The net stands in for a membrane with areal density sigma (kg/m^2) and
24+ tension T (N/m); its fundamental is near 2.405/(2 pi R) sqrt(T/sigma)
25+ (237 Hz with the defaults). strain is the spring stretch at rest: smaller
26+ is closer to a real membrane and more nonlinear, but stiffer in-plane, so
27+ the time step shrinks. force is the peak force per struck bead (N) of a
28+ 1 ms raised-cosine push on the beads within 3 cm of (0.05, 0).
29+ """
30+ pos, tri, rim, _ = hexdisk(R, a)
31+ f0 = T * a / np.sqrt(3) # spring tension that gives membrane tension T
32+ m = Model(pos=pos, mass=sigma * (np.sqrt(3) / 2) * a ** 2, pinned=rim,
33+ springs=springs(pos, edges(tri), f0 / (strain * a), f0))
34+ decay(m, [(200, 2.5), (2000, 0.75)])
35+ m.hits = [Hit(beads=near(pos, [0.05, 0], 0.03), force=[0, 0, -force], duration=1e-3)]
36+ m.duration = duration
37+ m.listen = nearest(pos, [-0.04, 0.03])
38+ m.name = "drum"
39+ m.notes = (f"{len(pos)} beads, {len(rim)} pinned at the rim. Expected fundamental "
40+ f"{2.405 / (2 * np.pi * R) * np.sqrt(T / sigma):.1f} Hz.")
41+ return m
42+
43+
44+def cascade(force=12.0, strain=0.005, duration=1.5) -> Model:
45+ """A loose, lightly damped drum head struck hard: energy cascades from the struck
46+ low modes to high ones over tens of milliseconds. Compare with
47+ cascade(force=...) scaled down (the small-strike reference)."""
48+ m = drum(strain=strain, force=force, duration=duration)
49+ decay(m, [(200, 2.5), (2000, 1.6)])
50+ m.hits[0].duration = 1e-3
51+ m.name = "cascade"
52+ m.notes = "Drum head with 0.5% pre-stretch, light damping and a hard strike."
53+ return m
54+
55+
56+def string(N=120, L=0.65, mu=2e-3, T=60.0, strain=0.01, force=0.8, duration=2.5) -> Model:
57+ """A beaded string, pinned at both ends and struck slightly off-axis near one end.
58+
59+ Transverse modes f_k = (1/pi) sqrt(T/(m a)) sin(k pi / (2(N+1))), nearly
60+ harmonic for k << N; the fundamental is near sqrt(T/mu)/(2L).
61+ """
62+ pos, E, _ = chain(N + 2, L)
63+ a = L / (N + 1)
64+ m = Model(pos=pos, mass=mu * a, pinned=[0, N + 1], springs=springs(pos, E, T / (strain * a), T))
65+ decay(m, [(200, 2.5), (2000, 1.5)])
66+ m.hits = [Hit(beads=near(pos, [0.12, 0, 0], 0.01), force=list(np.array([0, 0.2, 1]) * force), duration=1.5e-3)]
67+ m.duration = duration
68+ m.listen = N - 1
69+ m.name = "string"
70+ m.notes = f"Fundamental (small amplitude) {np.sqrt(T / mu) / (2 * L):.1f} Hz."
71+ return m
72+
73+
74+def plate(R=0.2, a=0.012, sigma=8.9, kb=7e5, thick=0.1, force=150.0, duration=2.5) -> Model:
75+ """A flat, free-edged plate clamped at its center, struck near the rim: a flat cymbal or gong.
76+
77+ Stiffness from bending triplets (kb sets the pitch); the springs carry no
78+ load at rest and only resist stretching, which makes the plate nonlinear
79+ once the motion is comparable to its effective thickness a sqrt(kb/k)
80+ (thick = kb/k).
81+ """
82+ pos, tri, rim, trip = hexdisk(R, a)
83+ m = Model(pos=pos, mass=sigma * (np.sqrt(3) / 2) * a ** 2, pinned=near(pos, [0, 0, 0], 1.05 * a),
84+ springs=springs(pos, edges(tri), kb / thick, 0.0), bends=bends(trip, kb))
85+ decay(m, [(100, 2.5), (5000, 1.2)])
86+ m.hits = [Hit(beads=near(pos, [0.18, 0, 0], 0.02), force=[0, 0, -force], duration=3e-4)]
87+ m.duration = duration
88+ m.listen = nearest(pos, [-0.1, 0.06])
89+ m.name = "plate"
90+ m.notes = f"{len(pos)} beads, free rim, center clamped (7 pinned beads)."
91+ return m
92+
93+
94+def dome(R=0.2, a=0.02, sigma=8.9, Hbow=0.02, Hbell=0.02, Rbell=0.06, kh=230.0, k=8e6, force=150.0,
95+ duration=2.5) -> Model:
96+ """A domed cymbal: a shallow bow with a raised bell, free at the rim and clamped at the
97+ top of the bell, struck sharply near the edge. Bending stiffness from hinges;
98+ set Hbow = Hbell = 0 for the same plate flat."""
99+ pos, tri, _, _ = hexdisk(R, a)
100+ r = np.linalg.norm(pos[:, :2], axis=1)
101+ pos[:, 2] = Hbow * (1 - (r / R) ** 2) + Hbell * np.maximum(0, 1 - (r / Rbell) ** 2) ** 2
102+ m = Model(pos=pos, mass=sigma * (np.sqrt(3) / 2) * a ** 2,
103+ pinned=near(pos, [0, 0, pos[:, 2].max()], 1.05 * a),
104+ springs=springs(pos, edges(tri), k, 0.0), hinges=hinges(tri, kh))
105+ decay(m, [(100, 2.5), (5000, 1.2)])
106+ m.hits = [Hit(beads=near(pos, [0.17, 0, 0], 0.03), force=[0, 0, -force], duration=3e-4)]
107+ m.duration = duration
108+ m.listen = nearest(pos, [-0.1, 0.06])
109+ m.name = "dome"
110+ m.notes = f"{len(pos)} beads, domed (bow {Hbow * 100:g} cm, bell {Hbell * 100:g} cm), clamped at the bell."
111+ return m
112+
113+
114+def bar(N=41, L=0.2, rhoA=0.2, f1=880.0, thick=0.15, force=40.0, duration=2.5) -> Model:
115+ """A free bar (glockenspiel or xylophone) held softly at the nodes of its lowest mode.
116+
117+ Bending stiffness set from the target pitch f1: an ideal free bar has
118+ f1 = 22.37/(2 pi L^2) sqrt(EI/rhoA), and the triplets give EI = kb a^3,
119+ rhoA = m/a. Its overtones are near 2.76 and 5.40 times the fundamental.
120+ """
121+ pos, E, trip = chain(N, L)
122+ a = L / (N - 1)
123+ mb = rhoA * a
124+ kb = mb / a ** 4 * (2 * np.pi * f1 * L ** 2 / 22.37) ** 2
125+ S = springs(pos, E, kb / thick, 0.0)
126+ supports = [nearest(pos, [0.224 * L, 0, 0]), nearest(pos, [0.776 * L, 0, 0])]
127+ pos, cords, anchors = anchor(pos, supports, 500.0, 0.015)
128+ m = Model(pos=pos, mass=mb, pinned=anchors, springs=np.vstack([S, cords]), bends=bends(trip, kb))
129+ decay(m, [(f1, 2.5), (10 * f1, 0.5)])
130+ m.hits = [Hit(beads=[nearest(pos[:N], [L / 2, 0, 0])], force=[0, 0, -force], duration=5e-4)]
131+ m.duration = duration
132+ m.listen = N - 2
133+ m.name = "bar"
134+ m.notes = f"{N} beads on two soft supports, tuned to {f1:g} Hz."
135+ return m
136+
137+
138+def chaos(strike=1.0, duration=3.0) -> Model:
139+ """A minimal chaotic system: two beads on a short string, free to move in 3D
140+ (6 degrees of freedom), struck hard and off-axis. Try strike=0.025 for regular motion."""
141+ a = 0.01
142+ pos, E, _ = chain(4, 3 * a)
143+ m = Model(pos=pos, mass=1e-4, pinned=[0, 3], springs=springs(pos, E, 1.0 / (0.05 * a), 1.0))
144+ decay(m, [(200, 2.5)])
145+ m.hits = [Hit(beads=[1], velocity=list(strike * np.array([12.0, 6.0, 40.0])))]
146+ m.duration = duration
147+ m.dt = 1 / (48000 * 8) # the automatic step is set at rest; the hard strike needs a finer one
148+ m.listen = 2
149+ m.name = "chaos"
150+ m.notes = "Two beads on a string, 6 degrees of freedom, struck hard."
151+ return m
152+
153+
154+ALL = {"drum": drum, "cascade": cascade, "string": string, "plate": plate, "dome": dome, "bar": bar, "chaos": chaos}
beadnet/geometry.pyadded+209−0View file
@@ -0,0 +1,209 @@
1+"""Helpers that build common geometries and element tables (0-based indices)."""
2+
3+from __future__ import annotations
4+
5+from typing import Callable, Sequence, Tuple
6+
7+import numpy as np
8+
9+
10+def _ravel_f(a: np.ndarray) -> np.ndarray:
11+ return a.ravel(order="F")
12+
13+
14+def edges(tri: np.ndarray) -> np.ndarray:
15+ """Unique bead pairs (edges) of a triangle list, as rows [i, j] with i < j."""
16+ tri = np.asarray(tri, dtype=np.int64)
17+ E = np.vstack([tri[:, [0, 1]], tri[:, [1, 2]], tri[:, [2, 0]]])
18+ E = np.sort(E, axis=1)
19+ return np.unique(E, axis=0)
20+
21+
22+def hexdisk(R: float, a: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
23+ """Triangular lattice of beads with spacing a, clipped to a disk of radius R.
24+
25+ Returns (pos, tri, rim, trip):
26+ pos (n, 3) positions in the plane z = 0, centered at the origin
27+ tri triangles of the lattice (rows of three bead indices)
28+ rim beads with fewer than six lattice neighbors (the edge); pin these
29+ for a drum head. Every other bead then sits at an equilibrium under
30+ uniform spring tension.
31+ trip bending triplets [i, j, k]: three beads in a row along one of the
32+ three lattice directions, j in the middle (for Model.bends)
33+ """
34+ return hexlattice(lambda x, y: x ** 2 + y ** 2 <= R ** 2 * (1 + 1e-12), R, a)
35+
36+
37+def hexlattice(inside: Callable[[np.ndarray, np.ndarray], np.ndarray], extent: float,
38+ a: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
39+ """Triangular lattice with spacing a, clipped to any shape in the plane z = 0.
40+
41+ inside(x, y) takes arrays of coordinates and returns a boolean array; the
42+ shape must lie within distance `extent` of the origin. Returns
43+ (pos, tri, rim, trip) as hexdisk does. For example, a 20 x 14 cm rectangle:
44+ hexlattice(lambda x, y: (abs(x) <= 0.1) & (abs(y) <= 0.07), 0.13, 0.01).
45+ Lattice beads that end up with no triangle (thin slivers of the shape) are
46+ dropped.
47+ """
48+ m = int(np.ceil(extent / a)) + 2
49+ I, J = np.meshgrid(np.arange(-2 * m, 2 * m + 1), np.arange(-m, m + 1), indexing="ij")
50+ X = a * (I + J / 2)
51+ Y = a * (np.sqrt(3) / 2) * J
52+ inside_mask = np.asarray(inside(X, Y), dtype=bool)
53+ # keep only beads that belong to at least one triangle
54+ full = np.zeros(I.shape, dtype=bool)
55+ A0, B0, C0, D0 = inside_mask[:-1, :-1], inside_mask[1:, :-1], inside_mask[:-1, 1:], inside_mask[1:, 1:]
56+ t1 = A0 & B0 & C0
57+ t2 = B0 & D0 & C0
58+ full[:-1, :-1] |= t1
59+ full[1:, :-1] |= t1 | t2
60+ full[:-1, 1:] |= t1 | t2
61+ full[1:, 1:] |= t2
62+ flat = _ravel_f(full)
63+ ids = np.full(flat.size, -1, dtype=np.int64)
64+ ids[flat] = np.arange(int(flat.sum()))
65+ idg = ids.reshape(I.shape, order="F")
66+ n = int(flat.sum())
67+ pos = np.column_stack([_ravel_f(X)[flat], _ravel_f(Y)[flat], np.zeros(n)])
68+ A, B, C, D = idg[:-1, :-1], idg[1:, :-1], idg[:-1, 1:], idg[1:, 1:]
69+ tri = np.vstack([
70+ np.column_stack([_ravel_f(A), _ravel_f(B), _ravel_f(C)]),
71+ np.column_stack([_ravel_f(B), _ravel_f(D), _ravel_f(C)]),
72+ ])
73+ tri = tri[np.all(tri >= 0, axis=1)]
74+ E = edges(tri)
75+ deg = np.bincount(E.ravel(), minlength=n)
76+ rim = np.flatnonzero(deg < 6)
77+ trips = []
78+ for p, q, r in (
79+ (idg[:-2, :], idg[1:-1, :], idg[2:, :]),
80+ (idg[:, :-2], idg[:, 1:-1], idg[:, 2:]),
81+ (idg[:-2, 2:], idg[1:-1, 1:-1], idg[2:, :-2]),
82+ ):
83+ trips.append(np.column_stack([_ravel_f(p), _ravel_f(q), _ravel_f(r)]))
84+ trip = np.vstack(trips)
85+ trip = trip[np.all(trip >= 0, axis=1)]
86+ return pos, tri, rim, trip
87+
88+
89+def chain(n: int, length: float) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
90+ """A straight line of n beads along x, from 0 to length.
91+
92+ Returns (pos, E, trip): positions (n, 3), the n-1 neighbor pairs, and the
93+ n-2 bending triplets [i-1, i, i+1]. The end beads are 0 and n-1.
94+ """
95+ x = np.linspace(0, length, n)
96+ pos = np.column_stack([x, np.zeros(n), np.zeros(n)])
97+ E = np.column_stack([np.arange(n - 1), np.arange(1, n)])
98+ trip = np.column_stack([np.arange(n - 2), np.arange(1, n - 1), np.arange(2, n)])
99+ return pos, E, trip
100+
101+
102+def springs(pos: np.ndarray, E: np.ndarray, k, f0, k3=None) -> np.ndarray:
103+ """Springs along edges E with stiffness k and tension f0 at rest.
104+
105+ Returns rows [i, j, k, L0] (or [i, j, k, L0, k3]) for Model.springs, with
106+ each rest length chosen so the spring pulls with force f0 at the bead
107+ positions pos: L0 = L - f0/k. k, f0 and k3 may be scalars or one per edge.
108+ """
109+ pos = np.asarray(pos, dtype=np.float64)
110+ E = np.asarray(E, dtype=np.int64)
111+ m = E.shape[0]
112+ L = np.linalg.norm(pos[E[:, 0]] - pos[E[:, 1]], axis=1)
113+ k = np.broadcast_to(np.asarray(k, dtype=np.float64), (m,))
114+ f0 = np.broadcast_to(np.asarray(f0, dtype=np.float64), (m,))
115+ L0 = L - f0 / k
116+ if np.any(L0 <= 0):
117+ raise ValueError("springs: tension f0 is too large for stiffness k (rest length would be <= 0)")
118+ S = np.column_stack([E, k, L0])
119+ if k3 is not None:
120+ S = np.column_stack([S, np.broadcast_to(np.asarray(k3, dtype=np.float64), (m,))])
121+ return S
122+
123+
124+def bends(trip: np.ndarray, kb, cb=None) -> np.ndarray:
125+ """Bending table [i, j, k, kb] (or with cb) from triplets."""
126+ trip = np.asarray(trip)
127+ m = trip.shape[0]
128+ T = np.column_stack([trip, np.broadcast_to(np.asarray(kb, dtype=np.float64), (m,))])
129+ if cb is not None:
130+ T = np.column_stack([T, np.broadcast_to(np.asarray(cb, dtype=np.float64), (m,))])
131+ return T
132+
133+
134+def hinge_quads(tri: np.ndarray) -> np.ndarray:
135+ """Hinges across the interior edges of a triangle mesh, as rows [i, j, k, l].
136+
137+ j-k is an edge shared by two triangles and i and l are the third beads of
138+ those triangles. A hinge resists changes of the angle between its two
139+ triangles from their angle at the rest positions, so any rest shape (flat,
140+ domed, bell-shaped) is free of stress.
141+ """
142+ t = np.asarray(tri, dtype=np.int64)
143+ E3 = np.vstack([
144+ np.column_stack([np.sort(t[:, [0, 1]], axis=1), t[:, 2]]),
145+ np.column_stack([np.sort(t[:, [1, 2]], axis=1), t[:, 0]]),
146+ np.column_stack([np.sort(t[:, [2, 0]], axis=1), t[:, 1]]),
147+ ])
148+ order = np.lexsort((E3[:, 1], E3[:, 0]))
149+ E3 = E3[order]
150+ pair = np.flatnonzero(np.all(E3[:-1, :2] == E3[1:, :2], axis=1))
151+ return np.column_stack([E3[pair, 2], E3[pair, 0], E3[pair, 1], E3[pair + 1, 2]])
152+
153+
154+def hinges(tri: np.ndarray, kh, ch=None) -> np.ndarray:
155+ """Hinge table [i, j, k, l, kh] (or with ch) for the interior edges of a mesh."""
156+ q = hinge_quads(tri)
157+ m = q.shape[0]
158+ T = np.column_stack([q, np.broadcast_to(np.asarray(kh, dtype=np.float64), (m,))])
159+ if ch is not None:
160+ T = np.column_stack([T, np.broadcast_to(np.asarray(ch, dtype=np.float64), (m,))])
161+ return T
162+
163+
164+def near(pos: np.ndarray, p: Sequence[float], r: float = 0.0) -> np.ndarray:
165+ """Beads within distance r of point p (2 or 3 coordinates).
166+
167+ With r = 0, or if no bead is that close, returns the nearest bead (as a
168+ one-element array).
169+ """
170+ p = np.asarray(p, dtype=np.float64).ravel()
171+ if p.size == 2:
172+ p = np.append(p, 0.0)
173+ d = np.linalg.norm(np.asarray(pos) - p, axis=1)
174+ idx = np.flatnonzero(d <= r)
175+ if idx.size == 0:
176+ idx = np.array([int(np.argmin(d))])
177+ return idx
178+
179+
180+def nearest(pos: np.ndarray, p: Sequence[float]) -> int:
181+ """The bead nearest to point p."""
182+ return int(near(pos, p, 0.0)[0])
183+
184+
185+def anchor(pos: np.ndarray, beads, kz: float, h: float = 0.02) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
186+ """Hold beads softly, like a cord or a felt, rather than pinning them.
187+
188+ Adds four fixed anchor beads around each listed bead, at distance h along
189+ +x, -x, +y and -y, and returns (pos, springs, anchors): the positions with
190+ the anchors appended, rows [i, j, k, L0] for the new springs (append to
191+ Model.springs) and the indices of the new beads (append to Model.pinned).
192+ The springs are pre-tensioned so that each held bead feels a stiffness kz
193+ (N/m) against motion out of the plane, and 2 kz in the plane. The forces
194+ balance at rest, and the anchors lie in the object's plane, so a flat
195+ object keeps its transverse linear-mode analysis.
196+ """
197+ pos = np.asarray(pos, dtype=np.float64)
198+ beads = np.atleast_1d(np.asarray(beads, dtype=np.int64)).ravel()
199+ n0 = pos.shape[0]
200+ dirs = np.array([[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0]], dtype=np.float64)
201+ f0 = kz * h / 4 # four springs of tension f0 give kz out of plane
202+ newpos = np.zeros((4 * beads.size, 3))
203+ S = np.zeros((4 * beads.size, 4))
204+ for q, b in enumerate(beads):
205+ for d in range(4):
206+ r = 4 * q + d
207+ newpos[r] = pos[b] + h * dirs[d]
208+ S[r] = [b, n0 + r, kz, h - f0 / kz]
209+ return np.vstack([pos, newpos]), S, np.arange(n0, n0 + 4 * beads.size)
beadnet/kernels.pyadded+520−0View file
@@ -0,0 +1,520 @@
1+"""Numba kernels for the time integration (a port of the TypeScript solver).
2+
3+The conservative part (springs, bending triplets, hinges, force pulses) is
4+integrated with velocity Verlet, optionally composed into Yoshida's
5+fourth-order scheme. Damping is linear in the velocities, dv/dt = -A v, and is
6+applied as a separate step v <- exp(-tau A) v (scaled Taylor series), once per
7+audio sample (Strang splitting over the sample interval).
8+
9+The kernels take three namedtuples: S (the system and step, read only),
10+W (state and work arrays) and R (recording buffers and strikes).
11+"""
12+
13+from __future__ import annotations
14+
15+import math
16+from collections import namedtuple
17+
18+import numpy as np
19+from numba import njit
20+
21+Sys = namedtuple("Sys", [
22+ "n", "pos0", "invm", "mass", "pinned",
23+ "si", "sj", "sk", "sL0", "sk3",
24+ "bi", "bj", "bk", "bkb", "bcb",
25+ "hi", "hj", "hk", "hl", "hkh", "hch", "hth0",
26+ "di", "dj", "dc", "dca",
27+ "friction",
28+ "p_t", "p_dur", "p_force", "p_ptr", "p_beads",
29+ "cs", "h", "substeps", "Delta",
30+ "has_damping", "friction_only", "axial_damped", "hinge_damped", "normA",
31+])
32+
33+# scal: [pendingD, dissipated, pe, normAh]; iscal: [next frame, next impulse]
34+Work = namedtuple("Work", ["x", "v", "F", "hg", "dd", "hrow", "term", "tmp", "vb", "Av", "scal", "iscal"])
35+
36+Rec = namedtuple("Rec", [
37+ "dirv", "rec_acc", "rec_vel", "rec_disp",
38+ "sig_acc", "sig_vel", "sig_disp", "sum_acc", "sum_vel", "sum_disp",
39+ "frame_stride", "n_frames", "frames", "frame_t", "energy", "dissip", "pe_rest",
40+ "has_modes", "psi", "dof", "om2", "mode_energy",
41+ "imp_sample", "imp_ptr", "imp_beads", "imp_vel",
42+])
43+
44+
45+@njit(cache=True)
46+def hinge_angle(x, i, j, k, l, g, off):
47+ """Dihedral angle across the edge j-k of triangles (i, j, k) and (l, k, j).
48+
49+ Writes d theta / d(x_i, x_j, x_k, x_l) into g[off:off+12] and returns theta
50+ (0 when coplanar). The gradient is that of Bridson, Marino and Fedkiw (2003).
51+ """
52+ x1 = 3 * i
53+ x2 = 3 * l
54+ x3 = 3 * j
55+ x4 = 3 * k
56+ e0 = x[x4] - x[x3]
57+ e1 = x[x4 + 1] - x[x3 + 1]
58+ e2 = x[x4 + 2] - x[x3 + 2]
59+ eLen = math.sqrt(e0 * e0 + e1 * e1 + e2 * e2)
60+ a0 = x[x1] - x[x3]
61+ a1 = x[x1 + 1] - x[x3 + 1]
62+ a2 = x[x1 + 2] - x[x3 + 2]
63+ b0 = x[x1] - x[x4]
64+ b1 = x[x1 + 1] - x[x4 + 1]
65+ b2 = x[x1 + 2] - x[x4 + 2]
66+ c0 = x[x2] - x[x4]
67+ c1 = x[x2 + 1] - x[x4 + 1]
68+ c2 = x[x2 + 2] - x[x4 + 2]
69+ d0 = x[x2] - x[x3]
70+ d1 = x[x2 + 1] - x[x3 + 1]
71+ d2 = x[x2 + 2] - x[x3 + 2]
72+ n10 = a1 * b2 - a2 * b1
73+ n11 = a2 * b0 - a0 * b2
74+ n12 = a0 * b1 - a1 * b0
75+ n20 = c1 * d2 - c2 * d1
76+ n21 = c2 * d0 - c0 * d2
77+ n22 = c0 * d1 - c1 * d0
78+ n1sq = n10 * n10 + n11 * n11 + n12 * n12
79+ n2sq = n20 * n20 + n21 * n21 + n22 * n22
80+ cr0 = n11 * n22 - n12 * n21
81+ cr1 = n12 * n20 - n10 * n22
82+ cr2 = n10 * n21 - n11 * n20
83+ sinPart = (cr0 * e0 + cr1 * e1 + cr2 * e2) / eLen
84+ cosPart = n10 * n20 + n11 * n21 + n12 * n22
85+ theta = -math.atan2(sinPart, cosPart)
86+ s1 = eLen / n1sq
87+ s2 = eLen / n2sq
88+ p1 = (a0 * e0 + a1 * e1 + a2 * e2) / eLen
89+ q1 = (b0 * e0 + b1 * e1 + b2 * e2) / eLen
90+ p2 = (d0 * e0 + d1 * e1 + d2 * e2) / eLen
91+ q2 = (c0 * e0 + c1 * e1 + c2 * e2) / eLen
92+ m1 = 1.0 / n1sq
93+ m2 = 1.0 / n2sq
94+ aj = q1 * m1
95+ bj = q2 * m2
96+ ak = -p1 * m1
97+ bk = -p2 * m2
98+ g[off] = s1 * n10
99+ g[off + 1] = s1 * n11
100+ g[off + 2] = s1 * n12
101+ g[off + 3] = aj * n10 + bj * n20
102+ g[off + 4] = aj * n11 + bj * n21
103+ g[off + 5] = aj * n12 + bj * n22
104+ g[off + 6] = ak * n10 + bk * n20
105+ g[off + 7] = ak * n11 + bk * n21
106+ g[off + 8] = ak * n12 + bk * n22
107+ g[off + 9] = s2 * n20
108+ g[off + 10] = s2 * n21
109+ g[off + 11] = s2 * n22
110+ return theta
111+
112+
113+@njit(cache=True)
114+def angle_diff(theta, theta0):
115+ d = theta - theta0
116+ if d > math.pi:
117+ d -= 2 * math.pi
118+ elif d <= -math.pi:
119+ d += 2 * math.pi
120+ return d
121+
122+
123+@njit(cache=True)
124+def internal_forces(S, x, F, hg):
125+ """Spring, bending and hinge forces at x into F (cleared first); returns the potential energy."""
126+ F[:] = 0.0
127+ pe = 0.0
128+ for s in range(S.si.shape[0]):
129+ i3 = 3 * S.si[s]
130+ j3 = 3 * S.sj[s]
131+ dx = x[j3] - x[i3]
132+ dy = x[j3 + 1] - x[i3 + 1]
133+ dz = x[j3 + 2] - x[i3 + 2]
134+ L = math.sqrt(dx * dx + dy * dy + dz * dz)
135+ e = L - S.sL0[s]
136+ k = S.sk[s]
137+ k3 = S.sk3[s]
138+ e2 = e * e
139+ pe += 0.5 * k * e2 + 0.25 * k3 * e2 * e2
140+ g = (k * e + k3 * e2 * e) / L
141+ F[i3] += g * dx
142+ F[i3 + 1] += g * dy
143+ F[i3 + 2] += g * dz
144+ F[j3] -= g * dx
145+ F[j3 + 1] -= g * dy
146+ F[j3 + 2] -= g * dz
147+ for b in range(S.bi.shape[0]):
148+ i3 = 3 * S.bi[b]
149+ j3 = 3 * S.bj[b]
150+ k3 = 3 * S.bk[b]
151+ kb = S.bkb[b]
152+ d0 = x[i3] - 2 * x[j3] + x[k3]
153+ d1 = x[i3 + 1] - 2 * x[j3 + 1] + x[k3 + 1]
154+ d2 = x[i3 + 2] - 2 * x[j3 + 2] + x[k3 + 2]
155+ pe += 0.5 * kb * (d0 * d0 + d1 * d1 + d2 * d2)
156+ F[i3] -= kb * d0
157+ F[i3 + 1] -= kb * d1
158+ F[i3 + 2] -= kb * d2
159+ F[j3] += 2 * kb * d0
160+ F[j3 + 1] += 2 * kb * d1
161+ F[j3 + 2] += 2 * kb * d2
162+ F[k3] -= kb * d0
163+ F[k3 + 1] -= kb * d1
164+ F[k3 + 2] -= kb * d2
165+ for h in range(S.hi.shape[0]):
166+ o = 12 * h
167+ d = angle_diff(hinge_angle(x, S.hi[h], S.hj[h], S.hk[h], S.hl[h], hg, o), S.hth0[h])
168+ pe += 0.5 * S.hkh[h] * d * d
169+ s = S.hkh[h] * d
170+ i3 = 3 * S.hi[h]
171+ j3 = 3 * S.hj[h]
172+ k3 = 3 * S.hk[h]
173+ l3 = 3 * S.hl[h]
174+ for c in range(3):
175+ F[i3 + c] -= s * hg[o + c]
176+ F[j3 + c] -= s * hg[o + 3 + c]
177+ F[k3 + c] -= s * hg[o + 6 + c]
178+ F[l3 + c] -= s * hg[o + 9 + c]
179+ return pe
180+
181+
182+@njit(cache=True)
183+def external_forces(S, t, F):
184+ for p in range(S.p_t.shape[0]):
185+ u = (t - S.p_t[p]) / S.p_dur[p]
186+ if u <= 0.0 or u >= 1.0:
187+ continue
188+ w = 0.5 * (1.0 - math.cos(2 * math.pi * u))
189+ for q in range(S.p_ptr[p], S.p_ptr[p + 1]):
190+ b = S.p_beads[q]
191+ F[3 * b] += w * S.p_force[p, 0]
192+ F[3 * b + 1] += w * S.p_force[p, 1]
193+ F[3 * b + 2] += w * S.p_force[p, 2]
194+
195+
196+@njit(cache=True)
197+def refresh(S, W):
198+ """Dashpot directions and hinge gradients at the current positions; returns
199+ the hinge part of the norm bound of A."""
200+ x = W.x
201+ if S.axial_damped:
202+ for d in range(S.di.shape[0]):
203+ i3 = 3 * S.di[d]
204+ j3 = 3 * S.dj[d]
205+ e0 = x[j3] - x[i3]
206+ e1 = x[j3 + 1] - x[i3 + 1]
207+ e2 = x[j3 + 2] - x[i3 + 2]
208+ L = math.sqrt(e0 * e0 + e1 * e1 + e2 * e2)
209+ if L == 0.0:
210+ L = 1.0
211+ W.dd[3 * d] = e0 / L
212+ W.dd[3 * d + 1] = e1 / L
213+ W.dd[3 * d + 2] = e2 / L
214+ if not S.hinge_damped:
215+ return 0.0
216+ row = W.hrow
217+ row[:] = 0.0
218+ hg = W.hg
219+ for h in range(S.hi.shape[0]):
220+ o = 12 * h
221+ hinge_angle(x, S.hi[h], S.hj[h], S.hk[h], S.hl[h], hg, o)
222+ total = 0.0
223+ for q in range(12):
224+ total += abs(hg[o + q])
225+ c = S.hch[h] * total
226+ row[S.hi[h]] += c * (abs(hg[o]) + abs(hg[o + 1]) + abs(hg[o + 2]))
227+ row[S.hj[h]] += c * (abs(hg[o + 3]) + abs(hg[o + 4]) + abs(hg[o + 5]))
228+ row[S.hk[h]] += c * (abs(hg[o + 6]) + abs(hg[o + 7]) + abs(hg[o + 8]))
229+ row[S.hl[h]] += c * (abs(hg[o + 9]) + abs(hg[o + 10]) + abs(hg[o + 11]))
230+ normAh = 0.0
231+ for i in range(S.n):
232+ val = row[i] * S.invm[i]
233+ if val > normAh:
234+ normAh = val
235+ W.scal[3] = normAh
236+ return normAh
237+
238+
239+@njit(cache=True)
240+def apply_A(S, W, w, out):
241+ """out = A w, with dv/dt = -A v the damping (accelerations per velocity)."""
242+ invm = S.invm
243+ for i in range(S.n):
244+ a = S.friction[i] * invm[i]
245+ out[3 * i] = a * w[3 * i]
246+ out[3 * i + 1] = a * w[3 * i + 1]
247+ out[3 * i + 2] = a * w[3 * i + 2]
248+ dd = W.dd
249+ for d in range(S.di.shape[0]):
250+ i3 = 3 * S.di[d]
251+ j3 = 3 * S.dj[d]
252+ r0 = w[i3] - w[j3]
253+ r1 = w[i3 + 1] - w[j3 + 1]
254+ r2 = w[i3 + 2] - w[j3 + 2]
255+ c = S.dc[d]
256+ f0 = c * r0
257+ f1 = c * r1
258+ f2 = c * r2
259+ ca = S.dca[d]
260+ if ca != 0.0:
261+ u0 = dd[3 * d]
262+ u1 = dd[3 * d + 1]
263+ u2 = dd[3 * d + 2]
264+ s = ca * (u0 * r0 + u1 * r1 + u2 * r2)
265+ f0 += s * u0
266+ f1 += s * u1
267+ f2 += s * u2
268+ mi = invm[S.di[d]]
269+ mj = invm[S.dj[d]]
270+ out[i3] += mi * f0
271+ out[i3 + 1] += mi * f1
272+ out[i3 + 2] += mi * f2
273+ out[j3] -= mj * f0
274+ out[j3 + 1] -= mj * f1
275+ out[j3 + 2] -= mj * f2
276+ for b in range(S.bi.shape[0]):
277+ cb = S.bcb[b]
278+ if cb == 0.0:
279+ continue
280+ i3 = 3 * S.bi[b]
281+ j3 = 3 * S.bj[b]
282+ k3 = 3 * S.bk[b]
283+ ci = cb * invm[S.bi[b]]
284+ cj = -2 * cb * invm[S.bj[b]]
285+ ck = cb * invm[S.bk[b]]
286+ for c in range(3):
287+ r = w[i3 + c] - 2 * w[j3 + c] + w[k3 + c]
288+ out[i3 + c] += ci * r
289+ out[j3 + c] += cj * r
290+ out[k3 + c] += ck * r
291+ if S.hinge_damped:
292+ hg = W.hg
293+ for h in range(S.hi.shape[0]):
294+ ch = S.hch[h]
295+ if ch == 0.0:
296+ continue
297+ o = 12 * h
298+ i3 = 3 * S.hi[h]
299+ j3 = 3 * S.hj[h]
300+ k3 = 3 * S.hk[h]
301+ l3 = 3 * S.hl[h]
302+ s = 0.0
303+ for c in range(3):
304+ s += hg[o + c] * w[i3 + c] + hg[o + 3 + c] * w[j3 + c] + hg[o + 6 + c] * w[k3 + c] + hg[o + 9 + c] * w[l3 + c]
305+ s *= ch
306+ ai = s * invm[S.hi[h]]
307+ aj = s * invm[S.hj[h]]
308+ ak = s * invm[S.hk[h]]
309+ al = s * invm[S.hl[h]]
310+ for c in range(3):
311+ out[i3 + c] += ai * hg[o + c]
312+ out[j3 + c] += aj * hg[o + 3 + c]
313+ out[k3 + c] += ak * hg[o + 6 + c]
314+ out[l3 + c] += al * hg[o + 9 + c]
315+
316+
317+@njit(cache=True)
318+def kinetic(S, v):
319+ ke = 0.0
320+ for i in range(S.n):
321+ ke += 0.5 * S.mass[i] * (v[3 * i] ** 2 + v[3 * i + 1] ** 2 + v[3 * i + 2] ** 2)
322+ return ke
323+
324+
325+@njit(cache=True)
326+def apply_damping(S, W, tau, fresh):
327+ """v <- exp(-tau A) v. fresh: the dashpot directions and hinge gradients are
328+ already current (refresh() was called at the current positions)."""
329+ if not S.has_damping or tau == 0.0:
330+ return
331+ v = W.v
332+ ke0 = kinetic(S, v)
333+ if S.friction_only:
334+ for i in range(S.n):
335+ f = math.exp(-tau * S.friction[i] * S.invm[i])
336+ v[3 * i] *= f
337+ v[3 * i + 1] *= f
338+ v[3 * i + 2] *= f
339+ else:
340+ normAh = W.scal[3] if fresh else refresh(S, W)
341+ nsub = max(1, int(math.ceil(abs(tau) * (S.normA + normAh) / 0.5)))
342+ ts = tau / nsub
343+ term = W.term
344+ tmp = W.tmp
345+ N3 = 3 * S.n
346+ for r in range(nsub):
347+ vmax = 0.0
348+ for q in range(N3):
349+ term[q] = v[q]
350+ if abs(v[q]) > vmax:
351+ vmax = abs(v[q])
352+ if vmax == 0.0:
353+ break
354+ for k in range(1, 40):
355+ apply_A(S, W, term, tmp)
356+ c = -ts / k
357+ tmax = 0.0
358+ for q in range(N3):
359+ val = c * tmp[q]
360+ term[q] = val
361+ v[q] += val
362+ if abs(val) > tmax:
363+ tmax = abs(val)
364+ if tmax <= 1e-17 * vmax:
365+ break
366+ W.scal[1] += ke0 - kinetic(S, v)
367+
368+
369+@njit(cache=True)
370+def record_signals(S, W, R, col):
371+ """Per-bead signals along R.dirv at the current sample boundary, into column col."""
372+ n = S.n
373+ x = W.x
374+ v = W.v
375+ dx = R.dirv[0]
376+ dy = R.dirv[1]
377+ dz = R.dirv[2]
378+ if R.rec_disp:
379+ tot = 0.0
380+ for b in range(n):
381+ val = dx * (x[3 * b] - S.pos0[3 * b]) + dy * (x[3 * b + 1] - S.pos0[3 * b + 1]) + dz * (x[3 * b + 2] - S.pos0[3 * b + 2])
382+ R.sig_disp[b, col] = val
383+ tot += val
384+ R.sum_disp[col] = tot
385+ if not (R.rec_acc or R.rec_vel):
386+ return
387+ # At a sample boundary the damping for the time pendingD has not been
388+ # applied yet; vb = v - pendingD A v brings the velocities to the boundary
389+ # (to second order).
390+ vb = W.vb
391+ Av = W.Av
392+ pend = W.scal[0]
393+ if S.has_damping:
394+ refresh(S, W)
395+ if S.has_damping and pend != 0.0:
396+ apply_A(S, W, v, Av)
397+ for q in range(3 * n):
398+ vb[q] = v[q] - pend * Av[q]
399+ else:
400+ for q in range(3 * n):
401+ vb[q] = v[q]
402+ if R.rec_vel:
403+ tot = 0.0
404+ for b in range(n):
405+ val = dx * vb[3 * b] + dy * vb[3 * b + 1] + dz * vb[3 * b + 2]
406+ R.sig_vel[b, col] = val
407+ tot += val
408+ R.sum_vel[col] = tot
409+ if R.rec_acc:
410+ # acceleration = (F - damping force) / m, with F the spring, bending,
411+ # hinge and pulse forces at the current positions and time
412+ if S.has_damping:
413+ apply_A(S, W, vb, Av)
414+ else:
415+ Av[:] = 0.0
416+ F = W.F
417+ tot = 0.0
418+ for b in range(n):
419+ im = S.invm[b]
420+ ax = im * F[3 * b] - Av[3 * b]
421+ ay = im * F[3 * b + 1] - Av[3 * b + 1]
422+ az = im * F[3 * b + 2] - Av[3 * b + 2]
423+ val = dx * ax + dy * ay + dz * az
424+ R.sig_acc[b, col] = val
425+ tot += val
426+ R.sum_acc[col] = tot
427+
428+
429+@njit(cache=True)
430+def record_frame(S, W, R, frame, t):
431+ n = S.n
432+ x = W.x
433+ v = W.v
434+ for b in range(n):
435+ for c in range(3):
436+ R.frames[frame, b, c] = x[3 * b + c] - S.pos0[3 * b + c]
437+ R.frame_t[frame] = t
438+ R.energy[frame] = kinetic(S, v) + W.scal[2] - R.pe_rest
439+ R.dissip[frame] = W.scal[1]
440+ if R.has_modes:
441+ nd = R.dof.shape[0]
442+ bz = W.term # scratch (3n >= nd)
443+ bv = W.tmp
444+ for r in range(nd):
445+ q = R.dof[r]
446+ sm = math.sqrt(S.mass[q // 3])
447+ bz[r] = sm * (x[q] - S.pos0[q])
448+ bv[r] = sm * v[q]
449+ for k in range(R.om2.shape[0]):
450+ qq = 0.0
451+ qd = 0.0
452+ for r in range(nd):
453+ qq += R.psi[k, r] * bz[r]
454+ qd += R.psi[k, r] * bv[r]
455+ R.mode_energy[frame, k] = 0.5 * (qd * qd + R.om2[k] * qq * qq)
456+
457+
458+@njit(cache=True, nogil=True)
459+def run_block(S, W, R, s0, s1):
460+ """Advance through audio samples s0 .. s1-1. Signals for sample s go to
461+ column s - s0. Returns -1, or the sample at which the solution blew up."""
462+ n = S.n
463+ N3 = 3 * n
464+ x = W.x
465+ v = W.v
466+ F = W.F
467+ h = S.h
468+ nimp = R.imp_sample.shape[0]
469+ for sample in range(s0, s1):
470+ t = sample * S.substeps * h
471+ frame = W.iscal[0]
472+ is_frame = (sample % R.frame_stride == 0) and frame < R.n_frames
473+ ii = W.iscal[1]
474+ has_imp = ii < nimp and R.imp_sample[ii] == sample
475+ if (is_frame or has_imp) and W.scal[0] != 0.0:
476+ apply_damping(S, W, W.scal[0], False)
477+ W.scal[0] = 0.0
478+ while ii < nimp and R.imp_sample[ii] == sample:
479+ for p in range(R.imp_ptr[ii], R.imp_ptr[ii + 1]):
480+ b = R.imp_beads[p]
481+ if S.pinned[b]:
482+ continue
483+ v[3 * b] += R.imp_vel[ii, 0]
484+ v[3 * b + 1] += R.imp_vel[ii, 1]
485+ v[3 * b + 2] += R.imp_vel[ii, 2]
486+ ii += 1
487+ W.iscal[1] = ii
488+ record_signals(S, W, R, sample - s0)
489+ if is_frame:
490+ record_frame(S, W, R, frame, t)
491+ W.iscal[0] = frame + 1
492+ W.scal[0] += S.Delta / 2
493+ apply_damping(S, W, W.scal[0], R.rec_acc or R.rec_vel)
494+ W.scal[0] = 0.0
495+ pe = 0.0
496+ for sub in range(S.substeps):
497+ tj = (sample * S.substeps + sub) * h
498+ for c in S.cs:
499+ kh = c * h / 2
500+ for i in range(n):
501+ im = S.invm[i] * kh
502+ v[3 * i] += im * F[3 * i]
503+ v[3 * i + 1] += im * F[3 * i + 1]
504+ v[3 * i + 2] += im * F[3 * i + 2]
505+ dh = c * h
506+ for q in range(N3):
507+ x[q] += dh * v[q]
508+ tj += c * h
509+ pe = internal_forces(S, x, F, W.hg)
510+ external_forces(S, tj, F)
511+ for i in range(n):
512+ im = S.invm[i] * kh
513+ v[3 * i] += im * F[3 * i]
514+ v[3 * i + 1] += im * F[3 * i + 1]
515+ v[3 * i + 2] += im * F[3 * i + 2]
516+ W.scal[2] = pe
517+ W.scal[0] = S.Delta / 2
518+ if not math.isfinite(pe):
519+ return sample
520+ return -1
beadnet/model.pyadded+263−0View file
@@ -0,0 +1,263 @@
1+"""The bead model: beads, elements, strikes and run settings.
2+
3+Bead indices are 0-based throughout. Element tables are float matrices whose
4+first columns hold bead indices, as in the numbl version of the app:
5+
6+ springs [i, j, k, L0] or [i, j, k, L0, k3]
7+ bends [i, j, k, kb] or [i, j, k, kb, cb] (j the middle bead)
8+ hinges [i, j, k, l, kh] or [i, j, k, l, kh, ch] (j-k the shared edge)
9+ dashpots [i, j, c] or [i, j, c, ca]
10+"""
11+
12+from __future__ import annotations
13+
14+import copy
15+from dataclasses import dataclass, field
16+from typing import List, Optional, Sequence, Union
17+
18+import numpy as np
19+
20+DEFAULT_T60 = 2.5 # s, default decay time when no damping is given
21+
22+
23+@dataclass
24+class Hit:
25+ """A strike on a set of beads at time t.
26+
27+ Either an impulse (velocity added to each bead at time t, in m/s) or a
28+ raised-cosine force pulse on each bead with peak `force` (N) lasting
29+ `duration` (s).
30+ """
31+
32+ beads: Union[int, Sequence[int], np.ndarray]
33+ t: float = 0.0
34+ velocity: Optional[Sequence[float]] = None
35+ force: Optional[Sequence[float]] = None
36+ duration: float = 0.0
37+
38+ def to_dict(self) -> dict:
39+ return {
40+ "beads": [int(b) for b in np.atleast_1d(self.beads)],
41+ "t": float(self.t),
42+ "velocity": None if self.velocity is None else [float(c) for c in self.velocity],
43+ "force": None if self.force is None else [float(c) for c in self.force],
44+ "duration": float(self.duration),
45+ }
46+
47+ @staticmethod
48+ def from_dict(d: dict) -> "Hit":
49+ return Hit(beads=np.asarray(d["beads"], dtype=np.int64), t=d["t"], velocity=d.get("velocity"),
50+ force=d.get("force"), duration=d.get("duration", 0.0))
51+
52+
53+@dataclass
54+class Model:
55+ """A network of beads joined by springs and other elements.
56+
57+ pos (n, 3) rest positions (m)
58+ mass scalar or (n,) masses (kg)
59+ pinned bead indices (or a boolean mask) held fixed
60+ springs, bends, hinges, dashpots: element tables (see module docstring)
61+ friction None (default damping, see below), scalar or (n,): force -c0 v on each bead (N s/m)
62+ hits list of Hit
63+ duration simulated time (s)
64+ sample_rate audio rate of the recorded signals (Hz)
65+ dt integrator step (s); 0 = automatic
66+ safety fraction of the stability limit used when dt is automatic
67+ method 'verlet' or 'yoshida4'
68+ frame_rate rate of the stored 3D displacement frames (Hz), for animation
69+ signal_dir direction along which per-bead signals are recorded (unit vector)
70+ record quantities recorded for every bead at the audio rate:
71+ any of 'acceleration', 'velocity', 'displacement'
72+ modes compute linear modes and record their energies at each frame
73+ listen bead suggested to the viewer as the initial listener ('sum' or an index)
74+ name, notes free text shown by the viewer
75+
76+ When friction is None and no element carries damping, every mode decays
77+ 60 dB in DEFAULT_T60 seconds (friction 2 sigma m per bead).
78+ """
79+
80+ pos: np.ndarray
81+ mass: Union[float, np.ndarray] = 1.0
82+ pinned: Union[Sequence[int], np.ndarray] = field(default_factory=list)
83+ springs: Optional[np.ndarray] = None
84+ bends: Optional[np.ndarray] = None
85+ hinges: Optional[np.ndarray] = None
86+ dashpots: Optional[np.ndarray] = None
87+ friction: Union[None, float, np.ndarray] = None
88+ hits: List[Hit] = field(default_factory=list)
89+ duration: float = 2.0
90+ sample_rate: float = 48000.0
91+ dt: float = 0.0
92+ safety: float = 0.5
93+ method: str = "verlet"
94+ frame_rate: float = 2000.0
95+ signal_dir: Sequence[float] = (0.0, 0.0, 1.0)
96+ record: Sequence[str] = ("acceleration", "displacement")
97+ modes: bool = False
98+ listen: Union[str, int] = "sum"
99+ name: str = ""
100+ notes: str = ""
101+ decay_law: Optional[Sequence[float]] = None # [sigma0, sigma1], set by decay(); informational
102+
103+ @property
104+ def n(self) -> int:
105+ return int(np.asarray(self.pos).shape[0])
106+
107+ def copy(self) -> "Model":
108+ return copy.deepcopy(self)
109+
110+ def scaled_hits(self, factor: float) -> "Model":
111+ """A copy with every strike scaled by factor (velocities and forces)."""
112+ m = self.copy()
113+ for h in m.hits:
114+ if h.velocity is not None:
115+ h.velocity = [factor * c for c in h.velocity]
116+ if h.force is not None:
117+ h.force = [factor * c for c in h.force]
118+ return m
119+
120+
121+class ModelError(ValueError):
122+ pass
123+
124+
125+def _table(a, name: str, cols: Sequence[int], nidx: int, n: int) -> np.ndarray:
126+ """Validate an element table; return it padded to the largest column count."""
127+ full = max(cols)
128+ if a is None:
129+ return np.zeros((0, full))
130+ a = np.asarray(a, dtype=np.float64)
131+ if a.size == 0:
132+ return np.zeros((0, full))
133+ if a.ndim != 2 or a.shape[1] not in cols:
134+ raise ModelError(f"{name} must have {' or '.join(str(c) for c in cols)} columns")
135+ idx = a[:, :nidx]
136+ if np.any(idx != np.round(idx)) or np.any(idx < 0) or np.any(idx >= n):
137+ bad = np.argwhere((idx != np.round(idx)) | (idx < 0) | (idx >= n))[0][0]
138+ raise ModelError(f"{name} row {bad}: bead index not in 0..{n - 1}")
139+ if a.shape[1] < full:
140+ a = np.hstack([a, np.zeros((a.shape[0], full - a.shape[1]))])
141+ return a
142+
143+
144+def _indices(v, name: str, n: int) -> np.ndarray:
145+ if v is None:
146+ return np.zeros(0, dtype=np.int64)
147+ a = np.asarray(v)
148+ if a.dtype == bool:
149+ if a.shape != (n,):
150+ raise ModelError(f"{name}: a boolean mask must have one entry per bead ({n})")
151+ return np.flatnonzero(a)
152+ a = np.atleast_1d(a).ravel()
153+ if a.size == 0:
154+ return np.zeros(0, dtype=np.int64)
155+ if np.any(a != np.round(a)) or np.any(a < 0) or np.any(a >= n):
156+ raise ModelError(f"{name}: bead indices must be integers in 0..{n - 1}")
157+ return a.astype(np.int64)
158+
159+
160+def _per_bead(v, name: str, n: int) -> np.ndarray:
161+ a = np.asarray(v, dtype=np.float64).ravel()
162+ if a.size == 1:
163+ return np.full(n, a[0])
164+ if a.size != n:
165+ raise ModelError(f"{name} must be a scalar or have one entry per bead ({n})")
166+ return a.copy()
167+
168+
169+@dataclass
170+class Checked:
171+ """A validated model in solver form (0-based int arrays, padded tables)."""
172+
173+ model: Model
174+ n: int
175+ pos0: np.ndarray
176+ mass: np.ndarray
177+ pinned: np.ndarray # uint8 (n,)
178+ springs: np.ndarray # (m, 5)
179+ bends: np.ndarray # (m, 5)
180+ hinges: np.ndarray # (m, 6)
181+ dashpots: np.ndarray # (m, 4)
182+ friction: np.ndarray # (n,)
183+ hits: List[Hit]
184+ signal_dir: np.ndarray
185+ warnings: List[str]
186+
187+
188+def check(m: Model) -> Checked:
189+ """Validate a model and convert it to the arrays the solver uses."""
190+ warnings: List[str] = []
191+ pos = np.asarray(m.pos, dtype=np.float64)
192+ if pos.ndim != 2 or pos.shape[1] != 3 or pos.shape[0] < 1:
193+ raise ModelError("pos must be an n-by-3 array of bead positions")
194+ n = pos.shape[0]
195+ mass = _per_bead(m.mass, "mass", n)
196+ if np.any(~(mass > 0)):
197+ raise ModelError(f"mass must be positive (bead {int(np.argmin(mass > 0))})")
198+ pinned = np.zeros(n, dtype=np.uint8)
199+ pinned[_indices(m.pinned, "pinned", n)] = 1
200+
201+ S = _table(m.springs, "springs", (4, 5), 2, n)
202+ if np.any(S[:, 0] == S[:, 1]):
203+ raise ModelError(f"springs row {int(np.argmax(S[:, 0] == S[:, 1]))} joins a bead to itself")
204+ if np.any(S[:, 2:5] < 0):
205+ raise ModelError("springs: k, L0 and k3 must be nonnegative")
206+ B = _table(m.bends, "bends", (4, 5), 3, n)
207+ for r in range(B.shape[0]):
208+ if len({B[r, 0], B[r, 1], B[r, 2]}) != 3:
209+ raise ModelError(f"bends row {r} repeats a bead")
210+ if np.any(B[:, 3:5] < 0):
211+ raise ModelError("bends: kb and cb must be nonnegative")
212+ H = _table(m.hinges, "hinges", (5, 6), 4, n)
213+ for r in range(H.shape[0]):
214+ if len({H[r, 0], H[r, 1], H[r, 2], H[r, 3]}) != 4:
215+ raise ModelError(f"hinges row {r} repeats a bead")
216+ if np.any(H[:, 4:6] < 0):
217+ raise ModelError("hinges: kh and ch must be nonnegative")
218+ D = _table(m.dashpots, "dashpots", (3, 4), 2, n)
219+ if np.any(D[:, 2:4] < 0):
220+ raise ModelError("dashpots: c and ca must be nonnegative")
221+
222+ damped_elements = D.shape[0] > 0 or np.any(B[:, 4] > 0) or np.any(H[:, 5] > 0)
223+ if m.friction is None and not damped_elements:
224+ sigma = np.log(1000.0) / DEFAULT_T60
225+ friction = 2 * sigma * mass
226+ warnings.append(f"No damping given: using the default, every mode falls 60 dB in {DEFAULT_T60} s. "
227+ "Set friction = 0 for none.")
228+ else:
229+ friction = _per_bead(0.0 if m.friction is None else m.friction, "friction", n)
230+
231+ hits = []
232+ for q, h in enumerate(m.hits):
233+ beads = _indices(h.beads, f"hits[{q}].beads", n)
234+ if beads.size == 0:
235+ raise ModelError(f"hits[{q}].beads is required")
236+ if h.duration > 0 and h.velocity is not None:
237+ raise ModelError(f"hits[{q}]: give velocity (impulse) or force with duration (pulse), not both")
238+ if h.duration <= 0 and h.force is not None:
239+ raise ModelError(f"hits[{q}].force needs a positive duration")
240+ for nm in ("velocity", "force"):
241+ val = getattr(h, nm)
242+ if val is not None and len(val) != 3:
243+ raise ModelError(f"hits[{q}].{nm} must have 3 components")
244+ hits.append(Hit(beads=beads, t=float(h.t), velocity=h.velocity, force=h.force, duration=float(h.duration)))
245+ if not hits:
246+ warnings.append("hits is empty: nothing excites the system.")
247+
248+ d = np.asarray(m.signal_dir, dtype=np.float64).ravel()
249+ if d.size != 3 or np.linalg.norm(d) == 0:
250+ raise ModelError("signal_dir must be a nonzero 3-vector")
251+ if m.method not in ("verlet", "yoshida4"):
252+ raise ModelError("method must be 'verlet' or 'yoshida4'")
253+ if not m.duration > 0:
254+ raise ModelError("duration must be positive")
255+ if not (0 < m.safety <= 1):
256+ raise ModelError("safety must be in (0, 1]")
257+ for q in m.record:
258+ if q not in ("acceleration", "velocity", "displacement"):
259+ raise ModelError(f"record: unknown quantity {q!r}")
260+ if S.shape[0] == 0 and B.shape[0] == 0 and H.shape[0] == 0:
261+ warnings.append("springs, bends and hinges are empty: the beads do not interact.")
262+ return Checked(model=m, n=n, pos0=pos, mass=mass, pinned=pinned, springs=S, bends=B, hinges=H,
263+ dashpots=D, friction=friction, hits=hits, signal_dir=d / np.linalg.norm(d), warnings=warnings)
beadnet/modes.pyadded+183−0View file
@@ -0,0 +1,183 @@
1+"""Linear analysis about the rest positions: stiffness, highest frequency, modes.
2+
3+The stiffness at rest is assembled from the elements: a spring contributes the
4+3x3 block (keff - g) d d^T + g I (d its direction, g its tension per length,
5+keff = k + 3 k3 e^2); a bending triplet kb (e_i - 2 e_j + e_k)(...)^T in each
6+component; a hinge kh grad(theta) grad(theta)^T (exact at rest, where
7+theta = theta0).
8+
9+When every bead rests in a plane z = const, small z motion decouples from
10+in-plane motion, so the "transverse" modes use z alone. Otherwise all three
11+components are needed ("full" modes).
12+"""
13+
14+from __future__ import annotations
15+
16+from dataclasses import dataclass
17+from typing import Optional
18+
19+import numpy as np
20+import scipy.linalg
21+import scipy.sparse
22+import scipy.sparse.linalg
23+
24+from .kernels import hinge_angle
25+from .model import Checked, Model, check
26+
27+
28+def hinge_gradients(pos0: np.ndarray, hinges: np.ndarray) -> np.ndarray:
29+ """(nh, 12) gradients of the hinge angles at positions pos0 ((n, 3))."""
30+ x = np.ascontiguousarray(pos0, dtype=np.float64).ravel()
31+ nh = hinges.shape[0]
32+ g = np.zeros(12 * nh)
33+ for h in range(nh):
34+ i, j, k, l = (int(c) for c in hinges[h, :4])
35+ hinge_angle(x, i, j, k, l, g, 12 * h)
36+ return g.reshape(nh, 12)
37+
38+
39+def stiffness(c: Checked) -> scipy.sparse.csr_matrix:
40+ """Stiffness matrix at rest over all 3n coordinates (index 3*bead + component)."""
41+ n = c.n
42+ pos0 = c.pos0
43+ rows, cols, vals = [], [], []
44+ S = c.springs
45+ if S.shape[0]:
46+ i = S[:, 0].astype(np.int64)
47+ j = S[:, 1].astype(np.int64)
48+ d = pos0[j] - pos0[i]
49+ L = np.linalg.norm(d, axis=1)
50+ e = L - S[:, 3]
51+ keff = S[:, 2] + 3 * S[:, 4] * e ** 2
52+ g = (S[:, 2] * e + S[:, 4] * e ** 3) / L
53+ u = d / L[:, None]
54+ B = (keff - g)[:, None, None] * u[:, :, None] * u[:, None, :] + g[:, None, None] * np.eye(3)[None]
55+ a_idx = np.arange(3)
56+ for (p, q, sign) in ((i, i, 1), (j, j, 1), (i, j, -1), (j, i, -1)):
57+ r = 3 * p[:, None, None] + a_idx[None, :, None]
58+ cc = 3 * q[:, None, None] + a_idx[None, None, :]
59+ rows.append(np.broadcast_to(r, B.shape).ravel())
60+ cols.append(np.broadcast_to(cc, B.shape).ravel())
61+ vals.append((sign * B).ravel())
62+ T = c.bends
63+ if T.shape[0]:
64+ beads = T[:, :3].astype(np.int64)
65+ cb = np.array([1.0, -2.0, 1.0])
66+ for p in range(3):
67+ for q in range(3):
68+ for comp in range(3):
69+ rows.append(3 * beads[:, p] + comp)
70+ cols.append(3 * beads[:, q] + comp)
71+ vals.append(T[:, 3] * cb[p] * cb[q])
72+ H = c.hinges
73+ if H.shape[0]:
74+ g = hinge_gradients(pos0, H)
75+ beads = H[:, :4].astype(np.int64)
76+ dofs = (3 * beads[:, :, None] + np.arange(3)[None, None, :]).reshape(-1, 12)
77+ rows.append(np.repeat(dofs, 12, axis=1).ravel())
78+ cols.append(np.tile(dofs, (1, 12)).ravel())
79+ vals.append((H[:, 4][:, None, None] * g[:, :, None] * g[:, None, :]).ravel())
80+ if not rows:
81+ return scipy.sparse.csr_matrix((3 * n, 3 * n))
82+ K = scipy.sparse.coo_matrix((np.concatenate(vals), (np.concatenate(rows), np.concatenate(cols))),
83+ shape=(3 * n, 3 * n))
84+ return K.tocsr()
85+
86+
87+def _scaled(c: Checked, dof: np.ndarray, K: Optional[scipy.sparse.csr_matrix] = None):
88+ if K is None:
89+ K = stiffness(c)
90+ Ks = K[dof][:, dof]
91+ ism = 1.0 / np.sqrt(c.mass[dof // 3])
92+ D = scipy.sparse.diags(ism)
93+ return D @ Ks @ D
94+
95+
96+def omega_max(c: Checked, K: Optional[scipy.sparse.csr_matrix] = None) -> float:
97+ """Highest angular frequency (rad/s) of the system linearized about rest, with a 2% margin."""
98+ free = np.flatnonzero(c.pinned == 0)
99+ dof = (3 * free[:, None] + np.arange(3)[None, :]).ravel()
100+ if dof.size == 0:
101+ return 1.0
102+ A = _scaled(c, dof, K)
103+ if dof.size <= 400:
104+ lam = float(np.max(np.linalg.eigvalsh(A.toarray())))
105+ else:
106+ lam = float(scipy.sparse.linalg.eigsh(A, k=1, which="LA", tol=1e-8, return_eigenvectors=False)[0])
107+ return float(np.sqrt(max(lam, 1e-300)) * 1.02)
108+
109+
110+def is_planar(pos0: np.ndarray) -> bool:
111+ z = pos0[:, 2]
112+ span = max(np.max(np.abs(pos0[:, :2])), 1e-30)
113+ return float(z.max() - z.min()) <= 1e-12 * span
114+
115+
116+@dataclass
117+class Modes:
118+ freqs: np.ndarray # (K,) Hz, ascending
119+ psi: np.ndarray # (K, nd) orthonormal eigenvectors of M^-1/2 K M^-1/2 over dof
120+ dof: np.ndarray # (nd,) coordinate index (3*bead + component) of each column of psi
121+ kind: str # 'transverse' (z of a flat net) or 'full'
122+
123+ def shapes(self, mass: np.ndarray, n: int) -> np.ndarray:
124+ """Mode shapes as (K, n, 3) displacements, normalized so u^T M u = 1."""
125+ U = np.zeros((self.freqs.size, 3 * n))
126+ U[:, self.dof] = self.psi / np.sqrt(mass[self.dof // 3])[None, :]
127+ return U.reshape(-1, n, 3)
128+
129+
130+def modes(model, kind: Optional[str] = None, max_dof: int = 6000) -> Modes:
131+ """Linear modes about the rest positions (dense symmetric eigensolver).
132+
133+ kind: 'transverse' (only valid for a flat net in a plane z = const), 'full',
134+ or None to choose transverse when the net is flat.
135+ """
136+ c = model if isinstance(model, Checked) else check(model)
137+ if kind is None:
138+ kind = "transverse" if is_planar(c.pos0) else "full"
139+ free = np.flatnonzero(c.pinned == 0)
140+ if kind == "transverse":
141+ dof = 3 * free + 2
142+ else:
143+ dof = (3 * free[:, None] + np.arange(3)[None, :]).ravel()
144+ if dof.size > max_dof:
145+ raise ValueError(f"{dof.size} degrees of freedom exceeds max_dof = {max_dof} for the dense eigensolver")
146+ A = _scaled(c, dof).toarray()
147+ w, V = scipy.linalg.eigh(A)
148+ order = np.argsort(w)
149+ w = w[order]
150+ V = V[:, order]
151+ freqs = np.sqrt(np.maximum(w, 0)) / (2 * np.pi)
152+ return Modes(freqs=freqs, psi=np.ascontiguousarray(V.T), dof=dof.astype(np.int64), kind=kind)
153+
154+
155+def modal_damping(model, md: Modes) -> np.ndarray:
156+ """Small-amplitude amplitude decay rate sigma_k (1/s) of each mode: (1/2) u^T C u,
157+ with u normalized so u^T M u = 1 and C the damping matrix at rest. Exact when
158+ C is a combination of M and K (as decay() builds it)."""
159+ c = model if isinstance(model, Checked) else check(model)
160+ n = c.n
161+ U = md.shapes(c.mass, n) # (K, n, 3)
162+ out = np.einsum("i,kic->k", c.friction, U ** 2)
163+ D = c.dashpots
164+ if D.shape[0]:
165+ i = D[:, 0].astype(np.int64)
166+ j = D[:, 1].astype(np.int64)
167+ r = U[:, i, :] - U[:, j, :] # (K, nd, 3)
168+ out += np.einsum("d,kdc->k", D[:, 2], r ** 2)
169+ e = c.pos0[j] - c.pos0[i]
170+ ax = np.einsum("dc,kdc->kd", e, r)
171+ out += np.einsum("d,kd->k", D[:, 3] / np.sum(e ** 2, axis=1), ax ** 2)
172+ B = c.bends
173+ if B.shape[0]:
174+ bi, bj, bk = (B[:, q].astype(np.int64) for q in range(3))
175+ r = U[:, bi, :] - 2 * U[:, bj, :] + U[:, bk, :]
176+ out += np.einsum("t,ktc->k", B[:, 4], r ** 2)
177+ H = c.hinges
178+ if H.shape[0] and np.any(H[:, 5] > 0):
179+ g = hinge_gradients(c.pos0, H).reshape(-1, 4, 3)
180+ beads = H[:, :4].astype(np.int64)
181+ s = np.einsum("hpc,khpc->kh", g, U[:, beads, :])
182+ out += np.einsum("h,kh->k", H[:, 5], s ** 2)
183+ return out / 2
beadnet/page.pyadded+94−0View file
@@ -0,0 +1,94 @@
1+"""Writing HTML pages that use the beadnet components."""
2+
3+from __future__ import annotations
4+
5+import html
6+import os
7+import shutil
8+from typing import Optional, Sequence, Union
9+
10+from .store import Store
11+
12+STATIC = os.path.join(os.path.dirname(__file__), "static")
13+
14+PAGE_CSS = """
15+body { margin: 0; background: var(--bn-bg, #fff); color: var(--bn-fg, #1d1d1b);
16+ font: 14px/1.5 system-ui, -apple-system, "Segoe UI", sans-serif; }
17+main { max-width: 1100px; margin: 0 auto; padding: 16px; }
18+h1 { font-size: 22px; margin: 8px 0 4px; }
19+h2 { font-size: 17px; margin: 28px 0 4px; }
20+p.lead { color: var(--bn-muted, #666); margin: 0 0 12px; }
21+"""
22+
23+
24+def run_block_html(src: str, kind: str = "run", heading: Optional[str] = None) -> str:
25+ """The default set of components for one run (or saved model) at src."""
26+ parts = []
27+ if heading:
28+ parts.append(f"<h2>{html.escape(heading)}</h2>")
29+ parts.append(f'<bn-run src="{html.escape(src)}">')
30+ if kind == "run":
31+ parts += [" <bn-controls></bn-controls>", " <bn-animation></bn-animation>", " <bn-waveform></bn-waveform>",
32+ " <bn-spectrogram></bn-spectrogram>", " <bn-info></bn-info>"]
33+ else:
34+ parts += [" <bn-controls></bn-controls>", " <bn-model></bn-model>", " <bn-info></bn-info>"]
35+ parts.append("</bn-run>")
36+ return "\n".join(parts)
37+
38+
39+def page_html(body: str, title: str = "beadnet", script: str = "beadnet/beadnet.js", lead: str = "") -> str:
40+ lead_html = f'<p class="lead">{html.escape(lead)}</p>' if lead else ""
41+ return f"""<!doctype html>
42+<html lang="en">
43+<head>
44+<meta charset="utf-8">
45+<meta name="viewport" content="width=device-width, initial-scale=1">
46+<title>{html.escape(title)}</title>
47+<style>{PAGE_CSS}</style>
48+<script type="module" src="{html.escape(script)}"></script>
49+</head>
50+<body>
51+<main>
52+<h1>{html.escape(title)}</h1>
53+{lead_html}
54+{body}
55+</main>
56+</body>
57+</html>
58+"""
59+
60+
61+def write_page(path: str, runs: Union[str, Sequence[str]], title: str = "beadnet", lead: str = "",
62+ copy_js: bool = False) -> str:
63+ """Write an HTML page showing one or more runs (or saved models) with the default components.
64+
65+ Paths in the page are relative to the page's directory. The script is
66+ referenced as beadnet/beadnet.js next to the page: `beadnet serve` provides
67+ it, or pass copy_js=True to copy it there for any static server.
68+ """
69+ if isinstance(runs, str):
70+ runs = [runs]
71+ d = os.path.dirname(os.path.abspath(path))
72+ os.makedirs(d, exist_ok=True)
73+ blocks = []
74+ for r in runs:
75+ st = Store(r)
76+ a = st.attrs().get("beadnet", {})
77+ kind = "run" if a.get("kind") == "run" else "model"
78+ name = a.get("model", {}).get("name") or os.path.basename(os.path.normpath(r))
79+ rel = os.path.relpath(os.path.abspath(r), d).replace(os.sep, "/")
80+ blocks.append(run_block_html(rel, kind, heading=name if len(runs) > 1 else None))
81+ with open(path, "w") as f:
82+ f.write(page_html("\n\n".join(blocks), title=title, lead=lead))
83+ if copy_js:
84+ copy_static(d)
85+ return path
86+
87+
88+def copy_static(directory: str) -> str:
89+ """Copy the components (beadnet/beadnet.js and the viewer) into directory/beadnet/."""
90+ dst = os.path.join(directory, "beadnet")
91+ os.makedirs(dst, exist_ok=True)
92+ for name in os.listdir(STATIC):
93+ shutil.copy2(os.path.join(STATIC, name), os.path.join(dst, name))
94+ return dst
beadnet/results.pyadded+175−0View file
@@ -0,0 +1,175 @@
1+"""Reading a run back from its store."""
2+
3+from __future__ import annotations
4+
5+import wave
6+from typing import Optional, Sequence, Union
7+
8+import numpy as np
9+
10+from .store import Store
11+
12+Listener = Union[str, int, Sequence[int]]
13+
14+
15+class Run:
16+ """Results of a run (or a saved model), read lazily from the store directory."""
17+
18+ def __init__(self, path: str):
19+ self.path = path
20+ self.store = Store(path)
21+ self.attrs = self.store.attrs().get("beadnet", {})
22+
23+ def __repr__(self) -> str:
24+ return f"Run({self.path!r})"
25+
26+ @property
27+ def kind(self) -> str:
28+ return self.attrs.get("kind", "?")
29+
30+ @property
31+ def meta(self) -> dict:
32+ """Run statistics (dt, substeps, energy drift, ...)."""
33+ return self.attrs.get("run", {})
34+
35+ @property
36+ def warnings(self):
37+ return self.attrs.get("warnings", [])
38+
39+ @property
40+ def model(self):
41+ from .solver import load_model
42+ return load_model(self.path)
43+
44+ @property
45+ def n(self) -> int:
46+ return int(self.attrs["n"])
47+
48+ @property
49+ def pos(self) -> np.ndarray:
50+ return self.store.read("model/pos")
51+
52+ @property
53+ def sample_rate(self) -> float:
54+ return float(self.meta["sample_rate"])
55+
56+ @property
57+ def t(self) -> np.ndarray:
58+ """Times of the audio-rate samples (s)."""
59+ return np.arange(self.meta["n_samples"]) / self.sample_rate
60+
61+ def signal(self, bead: Listener = "sum", quantity: str = "acceleration") -> np.ndarray:
62+ """Audio-rate signal along the run's signal_dir.
63+
64+ bead: a bead index, a list of beads (their sum) or 'sum' (all beads).
65+ quantity: 'acceleration' (m/s^2), 'velocity' (m/s) or 'displacement' (m).
66+ """
67+ name = f"signals/{quantity}"
68+ if not self.store.exists(name):
69+ raise KeyError(f"{quantity} was not recorded (record = {self.meta.get('quantities')})")
70+ ns = int(self.meta["n_samples"])
71+ if isinstance(bead, str):
72+ if bead != "sum":
73+ raise ValueError("bead must be an index, a list of indices or 'sum'")
74+ return self.store.read(f"{name}_sum", (slice(0, ns),))
75+ if np.ndim(bead) == 0:
76+ return self.store.read(name, (int(bead), slice(0, ns)))
77+ out = np.zeros(ns, dtype=np.float64)
78+ for b in bead:
79+ out += self.store.read(name, (int(b), slice(0, ns)))
80+ return out.astype(np.float32)
81+
82+ def frames(self, start: int = 0, stop: Optional[int] = None) -> np.ndarray:
83+ """3D displacement frames (F, n, 3) (m), frames start <= f < stop (Python slice
84+ convention); times in frame_times."""
85+ return self.store.read("frames/displacement", (slice(start, stop),))
86+
87+ @property
88+ def frame_times(self) -> np.ndarray:
89+ return self.store.read("frames/t")
90+
91+ @property
92+ def energy(self) -> np.ndarray:
93+ """Mechanical energy above the rest state at each frame (J)."""
94+ return self.store.read("frames/energy")
95+
96+ @property
97+ def dissipated(self) -> np.ndarray:
98+ """Cumulative energy removed by damping at each frame (J)."""
99+ return self.store.read("frames/dissipated")
100+
101+ @property
102+ def mode_freqs(self) -> np.ndarray:
103+ return self.store.read("modes/freqs")
104+
105+ @property
106+ def mode_sigma(self) -> np.ndarray:
107+ """Small-amplitude amplitude decay rate of each mode (1/s); T60 = ln(1000)/sigma."""
108+ return self.store.read("modes/sigma")
109+
110+ @property
111+ def mode_energy(self) -> np.ndarray:
112+ """Energy of each linear mode at each frame (F, K) (J)."""
113+ return self.store.read("modes/energy")
114+
115+ def write_wav(self, path: str, bead: Listener = "sum", quantity: str = "acceleration",
116+ peak: float = 0.9, full_scale: Optional[float] = None) -> None:
117+ """Write a signal as a 16-bit mono WAV.
118+
119+ By default the signal is normalized so its peak is `peak` of full scale.
120+ With full_scale (in the signal's units), the signal is divided by it
121+ instead, so WAVs of different runs written with the same full_scale
122+ keep their relative loudness (values beyond it clip).
123+ """
124+ x = self.signal(bead, quantity).astype(np.float64)
125+ m = np.max(np.abs(x)) if x.size else 0.0
126+ if full_scale is not None:
127+ x = x / full_scale
128+ elif m > 0:
129+ x = x * (peak / m)
130+ data = np.round(np.clip(x, -1, 1) * 32767).astype("<i2")
131+ with wave.open(path, "wb") as w:
132+ w.setnchannels(1)
133+ w.setsampwidth(2)
134+ w.setframerate(int(round(self.sample_rate)))
135+ w.writeframes(data.tobytes())
136+
137+ def summary(self) -> str:
138+ a = self.attrs
139+ lines = [f"{self.path}: {a.get('kind')}, {a.get('n')} beads"]
140+ r = self.meta
141+ if r:
142+ lines.append(f" {r['n_samples']} samples at {r['sample_rate']:.0f} Hz; dt = {r['dt']:.3e} s "
143+ f"({r['substeps']} steps per sample); highest frequency {r['f_max']:.0f} Hz "
144+ f"(linearized at rest; usually in-plane stretching, which sets dt)")
145+ lines.append(f" energy drift {r['energy_drift']:.1e}; residual force at rest {r['residual_force']:.1e} N; "
146+ f"{r['realtime_factor']:.1f}x real time")
147+ lines.append(" integrator frequency error: " +
148+ ", ".join(f"{e['cents']:.2f} cents at {e['hz'] / 1000:g} kHz" for e in r["freq_errors"]))
149+ if r.get("aborted"):
150+ lines.append(f" ABORTED: {r['aborted']}")
151+ pv = a.get("preview")
152+ if not r and pv:
153+ m = a.get("model", {})
154+ lines.append(f" planned: {m.get('duration')} s at {m.get('sample_rate'):.0f} Hz; dt = {pv['dt']:.3e} s "
155+ f"({pv['substeps']} steps per sample); highest frequency {pv['omega_max'] / (2 * 3.141592653589793):.0f} Hz "
156+ f"(usually in-plane stretching, which sets dt)")
157+ lines.append(f" residual force at rest {pv['residual_force']:.1e} N; largest spring force {pv['max_tension']:.2e} N")
158+ for w in self.warnings:
159+ lines.append(f" warning: {w}")
160+ return "\n".join(lines)
161+
162+
163+def load(path: str) -> Run:
164+ """Open a run (or saved model) directory."""
165+ return Run(path)
166+
167+
168+def rel_diff(a: np.ndarray, b: np.ndarray, n: Optional[int] = None) -> float:
169+ """Relative RMS difference of b from a over the first n samples:
170+ sqrt(sum((a - b)^2) / sum(a^2)). 0 means identical; 1 means as large as a itself."""
171+ n = min(len(a), len(b)) if n is None else min(n, len(a), len(b))
172+ a = np.asarray(a[:n], dtype=np.float64)
173+ b = np.asarray(b[:n], dtype=np.float64)
174+ den = np.sum(a ** 2)
175+ return float(np.sqrt(np.sum((a - b) ** 2) / den)) if den > 0 else 0.0
beadnet/solver.pyadded+435−0View file
@@ -0,0 +1,435 @@
1+"""Running a model: checks of the rest state, the time step, the integration
2+loop (in blocks of audio samples, written to the store as they finish)."""
3+
4+from __future__ import annotations
5+
6+import datetime
7+import math
8+import sys
9+import time
10+from concurrent.futures import ThreadPoolExecutor
11+from typing import List, Optional
12+
13+import numpy as np
14+
15+from . import __version__
16+from .kernels import Rec, Sys, Work, external_forces, hinge_angle, internal_forces, run_block
17+from .model import Checked, Model, check
18+from .modes import modal_damping, modes as compute_modes, omega_max, stiffness
19+from .store import Store
20+
21+YOSHIDA_W1 = 1 / (2 - 2 ** (1 / 3))
22+YOSHIDA_W0 = -(2 ** (1 / 3)) * YOSHIDA_W1
23+
24+
25+def step_coefficients(method: str) -> np.ndarray:
26+ return np.array([YOSHIDA_W1, YOSHIDA_W0, YOSHIDA_W1] if method == "yoshida4" else [1.0])
27+
28+
29+def _transfer(method: str, h: float, omega: float) -> np.ndarray:
30+ m = np.eye(2)
31+ for c in step_coefficients(method):
32+ kick = np.array([[1, 0], [-c * h * omega * omega / 2, 1]])
33+ drift = np.array([[1, c * h], [0, 1]])
34+ m = kick @ drift @ kick @ m
35+ return m
36+
37+
38+def stability_limit(method: str) -> float:
39+ """Largest h*omega for which the method is stable on x'' = -omega^2 x."""
40+ if method == "verlet":
41+ return 2.0
42+ h = 1e-3
43+ while abs(np.trace(_transfer(method, h + 1e-3, 1.0))) < 2:
44+ h += 1e-3
45+ return h
46+
47+
48+def frequency_error_cents(method: str, omega: float, h: float) -> float:
49+ """Error of the numerical oscillation frequency for x'' = -omega^2 x, in cents (positive: sharp)."""
50+ half = np.trace(_transfer(method, h, omega)) / 2
51+ if abs(half) >= 1:
52+ return float("nan")
53+ return float(1200 * math.log2(math.acos(half) / h / omega))
54+
55+
56+def _element_arrays(c: Checked):
57+ """Element arrays in solver form."""
58+ S = c.springs
59+ B = c.bends
60+ H = c.hinges
61+ D = c.dashpots
62+ keep = (D[:, 2] != 0) | (D[:, 3] != 0) # dashpots with c = ca = 0 are dropped
63+ D = D[keep]
64+ i32 = lambda a: np.ascontiguousarray(a, dtype=np.int32) # noqa: E731
65+ f64 = lambda a: np.ascontiguousarray(a, dtype=np.float64) # noqa: E731
66+ return dict(
67+ si=i32(S[:, 0]), sj=i32(S[:, 1]), sk=f64(S[:, 2]), sL0=f64(S[:, 3]), sk3=f64(S[:, 4]),
68+ bi=i32(B[:, 0]), bj=i32(B[:, 1]), bk=i32(B[:, 2]), bkb=f64(B[:, 3]), bcb=f64(B[:, 4]),
69+ hi=i32(H[:, 0]), hj=i32(H[:, 1]), hk=i32(H[:, 2]), hl=i32(H[:, 3]), hkh=f64(H[:, 4]), hch=f64(H[:, 5]),
70+ di=i32(D[:, 0]), dj=i32(D[:, 1]), dc=f64(D[:, 2]), dca=f64(D[:, 3]),
71+ )
72+
73+
74+def _make_sys(c: Checked, h: float, substeps: int, Delta: float) -> Sys:
75+ n = c.n
76+ a = _element_arrays(c)
77+ invm = np.where(c.pinned == 1, 0.0, 1.0 / c.mass)
78+ pos0 = np.ascontiguousarray(c.pos0.ravel())
79+ hth0 = np.zeros(a["hi"].size)
80+ g = np.zeros(12)
81+ for r in range(hth0.size):
82+ hth0[r] = hinge_angle(pos0, a["hi"][r], a["hj"][r], a["hk"][r], a["hl"][r], g, 0)
83+ if not (np.isfinite(hth0[r]) and np.all(np.isfinite(g))):
84+ raise ValueError(f"hinges row {r}: a triangle has zero area at the rest positions")
85+ pulses = [hh for hh in c.hits if hh.duration > 0]
86+ p_ptr = np.zeros(len(pulses) + 1, dtype=np.int64)
87+ for q, hh in enumerate(pulses):
88+ p_ptr[q + 1] = p_ptr[q] + len(hh.beads)
89+ p_beads = np.concatenate([np.asarray(hh.beads, dtype=np.int64) for hh in pulses]) if pulses else np.zeros(0, np.int64)
90+ # infinity-norm bound of A (without hinges, which are refreshed at run time)
91+ row = c.friction.copy()
92+ np.add.at(row, a["di"], 2 * a["dc"] + 2 * a["dca"])
93+ np.add.at(row, a["dj"], 2 * a["dc"] + 2 * a["dca"])
94+ np.add.at(row, a["bi"], 4 * a["bcb"])
95+ np.add.at(row, a["bj"], 8 * a["bcb"])
96+ np.add.at(row, a["bk"], 4 * a["bcb"])
97+ normA = float(np.max(row * invm)) if n else 0.0
98+ hinge_damped = bool(np.any(a["hch"] > 0))
99+ axial_damped = bool(np.any(a["dca"] > 0))
100+ friction_only = bool(np.all(a["dc"] == 0) and not axial_damped and np.all(a["bcb"] == 0) and not hinge_damped)
101+ return Sys(
102+ n=n, pos0=pos0, invm=invm, mass=c.mass.copy(), pinned=c.pinned.copy(),
103+ si=a["si"], sj=a["sj"], sk=a["sk"], sL0=a["sL0"], sk3=a["sk3"],
104+ bi=a["bi"], bj=a["bj"], bk=a["bk"], bkb=a["bkb"], bcb=a["bcb"],
105+ hi=a["hi"], hj=a["hj"], hk=a["hk"], hl=a["hl"], hkh=a["hkh"], hch=a["hch"], hth0=hth0,
106+ di=a["di"], dj=a["dj"], dc=a["dc"], dca=a["dca"],
107+ friction=c.friction.copy(),
108+ p_t=np.array([hh.t for hh in pulses], dtype=np.float64),
109+ p_dur=np.array([hh.duration for hh in pulses], dtype=np.float64),
110+ p_force=np.array([list(hh.force) for hh in pulses], dtype=np.float64).reshape(-1, 3),
111+ p_ptr=p_ptr, p_beads=p_beads,
112+ cs=step_coefficients(c.model.method), h=float(h), substeps=int(substeps), Delta=float(Delta),
113+ has_damping=bool(normA > 0 or hinge_damped), friction_only=friction_only,
114+ axial_damped=axial_damped, hinge_damped=hinge_damped, normA=normA,
115+ )
116+
117+
118+def _make_work(S: Sys) -> Work:
119+ N3 = 3 * S.n
120+ z = lambda k: np.zeros(k) # noqa: E731
121+ return Work(x=S.pos0.copy(), v=z(N3), F=z(N3), hg=z(12 * S.hi.size), dd=z(3 * S.di.size), hrow=z(S.n),
122+ term=z(N3), tmp=z(N3), vb=z(N3), Av=z(N3), scal=z(4), iscal=np.zeros(2, dtype=np.int64))
123+
124+
125+def prepare(c: Checked, K=None) -> dict:
126+ """Checks of the rest state and the choice of time step."""
127+ m = c.model
128+ warnings: List[str] = []
129+ S0 = _make_sys(c, 1.0, 1, 1.0)
130+ W0 = _make_work(S0)
131+ pe_rest = internal_forces(S0, W0.x, W0.F, W0.hg)
132+ F = W0.F.reshape(-1, 3)
133+ free = c.pinned == 0
134+ residual = float(np.max(np.linalg.norm(F[free], axis=1))) if np.any(free) else 0.0
135+ Sp = c.springs
136+ max_tension = 0.0
137+ force_scale = 0.0
138+ if Sp.shape[0]:
139+ i = Sp[:, 0].astype(np.int64)
140+ j = Sp[:, 1].astype(np.int64)
141+ L = np.linalg.norm(c.pos0[j] - c.pos0[i], axis=1)
142+ e = L - Sp[:, 3]
143+ max_tension = float(np.max(np.abs(Sp[:, 2] * e + Sp[:, 4] * e ** 3)))
144+ force_scale = float(np.max(1e-3 * Sp[:, 2] * Sp[:, 3]))
145+ force_scale = max(force_scale, max_tension)
146+ B = c.bends
147+ if B.shape[0]:
148+ i = B[:, 0].astype(np.int64)
149+ j = B[:, 1].astype(np.int64)
150+ L = np.linalg.norm(c.pos0[j] - c.pos0[i], axis=1)
151+ force_scale = max(force_scale, float(np.max(1e-3 * B[:, 3] * L)))
152+ if c.hinges.shape[0]:
153+ from .modes import hinge_gradients
154+ g = hinge_gradients(c.pos0, c.hinges)
155+ force_scale = max(force_scale, float(np.max(1e-3 * c.hinges[:, 4] * np.max(np.abs(g), axis=1))))
156+ if residual > 1e-6 * max(force_scale, 1e-30):
157+ warnings.append(f"The rest positions are not an equilibrium: the largest net force on a free bead is "
158+ f"{residual:.2e} N (largest spring force {max_tension:.2e} N). The beads will move before any strike.")
159+ om = omega_max(c, K if K is not None else stiffness(c))
160+ fs = float(m.sample_rate)
161+ h_limit = stability_limit(m.method) / om
162+ if m.dt > 0:
163+ substeps = max(1, int(round(1 / (fs * m.dt))))
164+ if 1 / (fs * substeps) > h_limit:
165+ warnings.append(f"dt = {1 / (fs * substeps):.3e} s exceeds the stability limit {h_limit:.3e} s.")
166+ else:
167+ substeps = max(1, int(math.ceil(1 / (fs * m.safety * h_limit))))
168+ return dict(pe_rest=float(pe_rest), residual_force=residual, max_tension=max_tension, omega_max=om,
169+ substeps=substeps, dt=1 / (fs * substeps), n_samples=max(1, int(round(m.duration * fs))),
170+ warnings=warnings)
171+
172+
173+# ---- model storage ------------------------------------------------------------
174+
175+def _model_attrs(m: Model) -> dict:
176+ return dict(
177+ hits=[h.to_dict() for h in m.hits], duration=float(m.duration), sample_rate=float(m.sample_rate),
178+ dt=float(m.dt), safety=float(m.safety), method=m.method, frame_rate=float(m.frame_rate),
179+ signal_dir=[float(x) for x in m.signal_dir], record=list(m.record), modes=bool(m.modes),
180+ listen=m.listen if isinstance(m.listen, str) else int(m.listen), name=m.name, notes=m.notes,
181+ decay_law=None if m.decay_law is None else [float(x) for x in m.decay_law],
182+ )
183+
184+
185+def _edges(c: Checked) -> np.ndarray:
186+ parts = [c.springs[:, :2]]
187+ if c.bends.shape[0]:
188+ parts += [c.bends[:, [0, 1]], c.bends[:, [1, 2]]]
189+ if c.hinges.shape[0]:
190+ parts += [c.hinges[:, [1, 2]]]
191+ E = np.vstack(parts).astype(np.int64) if parts else np.zeros((0, 2), np.int64)
192+ if E.shape[0] == 0:
193+ return E.astype(np.int32)
194+ E = np.unique(np.sort(E, axis=1), axis=0)
195+ return E.astype(np.int32)
196+
197+
198+def _write_model(store: Store, c: Checked) -> None:
199+ store.remove("model")
200+ store.group("model")
201+ store.write("model/pos", c.pos0)
202+ store.write("model/mass", c.mass)
203+ store.write("model/pinned", c.pinned)
204+ store.write("model/friction", c.friction)
205+ store.write("model/springs", c.springs)
206+ store.write("model/bends", c.bends)
207+ store.write("model/hinges", c.hinges)
208+ store.write("model/dashpots", c.dashpots)
209+ store.write("model/edges", _edges(c))
210+
211+
212+def save_model(model: Model, path: str) -> Store:
213+ """Write the model alone (for previewing it before a run). Removes any earlier results at path."""
214+ c = check(model)
215+ prep = prepare(c)
216+ store = Store(path, "w")
217+ for g in ("signals", "frames", "modes"):
218+ store.remove(g)
219+ _write_model(store, c)
220+ store.set_attrs({"beadnet": {
221+ "version": __version__, "kind": "model", "n": c.n, "model": _model_attrs(model),
222+ "preview": {k: prep[k] for k in ("residual_force", "max_tension", "omega_max", "substeps", "dt", "n_samples")},
223+ "warnings": c.warnings + prep["warnings"],
224+ }})
225+ store.close()
226+ return store
227+
228+
229+def load_model(path: str) -> Model:
230+ store = Store(path)
231+ a = store.attrs()["beadnet"]["model"]
232+ m = Model(
233+ pos=store.read("model/pos"), mass=store.read("model/mass"),
234+ pinned=np.flatnonzero(store.read("model/pinned")), friction=store.read("model/friction"),
235+ springs=store.read("model/springs"), bends=store.read("model/bends"),
236+ hinges=store.read("model/hinges"), dashpots=store.read("model/dashpots"),
237+ )
238+ from .model import Hit
239+ m.hits = [Hit.from_dict(h) for h in a["hits"]]
240+ for k in ("duration", "sample_rate", "dt", "safety", "method", "frame_rate", "signal_dir", "record",
241+ "modes", "listen", "name", "notes", "decay_law"):
242+ if k in a:
243+ setattr(m, k, a[k])
244+ m.record = tuple(m.record)
245+ return m
246+
247+
248+# ---- running ------------------------------------------------------------------
249+
250+def _fmt_time(s: float) -> str:
251+ return f"{s:.0f} s" if s < 120 else f"{s / 60:.1f} min"
252+
253+
254+def run(model: Model, out: str, progress: bool = True, block: int = 32768,
255+ max_frame_bytes: float = 1e9) -> "Run":
256+ """Integrate the model and write the results to the store directory `out`.
257+
258+ Every bead's signal along model.signal_dir is recorded at the audio rate for
259+ each quantity in model.record (plus its sum over all beads), together with
260+ 3D displacement frames at model.frame_rate, the energy, and (if
261+ model.modes) the energy of each linear mode at each frame.
262+ """
263+ from .results import Run
264+ t_start = time.time()
265+ c = check(model)
266+ warnings = list(c.warnings)
267+ K = stiffness(c)
268+ prep = prepare(c, K)
269+ warnings += prep["warnings"]
270+ fs = float(model.sample_rate)
271+ substeps = prep["substeps"]
272+ h = prep["dt"]
273+ n_samples = prep["n_samples"]
274+ n = c.n
275+ S = _make_sys(c, h, substeps, 1 / fs)
276+ W = _make_work(S)
277+
278+ md = None
279+ if model.modes:
280+ md = compute_modes(c)
281+ if md.freqs.size > 1 and md.freqs[0] < 1e-6 * md.freqs[-1]:
282+ warnings.append("The linear analysis finds modes at 0 Hz: some part of the net can move or turn freely.")
283+
284+ frame_stride = max(1, int(round(fs / model.frame_rate)))
285+ n_frames = (n_samples - 1) // frame_stride + 1
286+ if n_frames * n * 12 > max_frame_bytes:
287+ f = int(math.ceil(n_frames * n * 12 / max_frame_bytes))
288+ frame_stride *= f
289+ n_frames = (n_samples - 1) // frame_stride + 1
290+ warnings.append(f"Frames limited to {max_frame_bytes / 1e6:.0f} MB: frame rate lowered to {fs / frame_stride:.0f} Hz.")
291+
292+ # impulses, in order of their audio sample
293+ imps = sorted([hh for hh in c.hits if hh.duration <= 0], key=lambda hh: int(round(hh.t * fs)))
294+ imps = [hh for hh in imps if int(round(hh.t * fs)) < n_samples]
295+ imp_ptr = np.zeros(len(imps) + 1, dtype=np.int64)
296+ for q, hh in enumerate(imps):
297+ imp_ptr[q + 1] = imp_ptr[q] + len(hh.beads)
298+ rec = set(model.record)
299+ B = min(block, n_samples)
300+ if md is not None:
301+ psi, dof, om2 = md.psi, md.dof, (2 * np.pi * md.freqs) ** 2
302+ else:
303+ psi, dof, om2 = np.zeros((0, 0)), np.zeros(0, np.int64), np.zeros(0)
304+ quantities = [q for q in ("acceleration", "velocity", "displacement") if q in rec]
305+
306+ def make_rec() -> Rec:
307+ sig = lambda on: np.zeros((n, B) if on else (0, 0), dtype=np.float32) # noqa: E731
308+ sm = lambda on: np.zeros(B if on else 0) # noqa: E731
309+ return Rec(
310+ dirv=c.signal_dir.copy(), rec_acc="acceleration" in rec, rec_vel="velocity" in rec,
311+ rec_disp="displacement" in rec,
312+ sig_acc=sig("acceleration" in rec), sig_vel=sig("velocity" in rec), sig_disp=sig("displacement" in rec),
313+ sum_acc=sm("acceleration" in rec), sum_vel=sm("velocity" in rec), sum_disp=sm("displacement" in rec),
314+ frame_stride=frame_stride, n_frames=n_frames, frames=frames, frame_t=frame_t, energy=energy,
315+ dissip=dissip, pe_rest=prep["pe_rest"], has_modes=md is not None, psi=psi, dof=dof, om2=om2,
316+ mode_energy=mode_energy, imp_sample=imp_sample, imp_ptr=imp_ptr, imp_beads=imp_beads, imp_vel=imp_vel,
317+ )
318+
319+ frames = np.zeros((n_frames, n, 3), dtype=np.float32)
320+ frame_t = np.zeros(n_frames)
321+ energy = np.zeros(n_frames)
322+ dissip = np.zeros(n_frames)
323+ mode_energy = np.zeros((n_frames, om2.size), dtype=np.float32)
324+ imp_sample = np.array([int(round(hh.t * fs)) for hh in imps], dtype=np.int64)
325+ imp_beads = np.concatenate([np.asarray(hh.beads, np.int64) for hh in imps]) if imps else np.zeros(0, np.int64)
326+ imp_vel = np.array([list(hh.velocity) for hh in imps], dtype=np.float64).reshape(-1, 3)
327+ # two sets of signal buffers: one block is compressed and written in the
328+ # background while the next is integrated (run_block releases the GIL)
329+ recs = [make_rec(), make_rec()]
330+
331+ store = Store(out, "w")
332+ for g in ("signals", "frames", "modes"):
333+ store.remove(g)
334+ _write_model(store, c)
335+ store.group("signals")
336+ for q in quantities:
337+ store.create(f"signals/{q}", (n, n_samples), np.float32, (1, B))
338+ store.create(f"signals/{q}_sum", (n_samples,), np.float32, (B,))
339+ base_attrs = {"version": __version__, "kind": "running", "n": n, "model": _model_attrs(model)}
340+ store.set_attrs({"beadnet": base_attrs})
341+
342+ def write_block(R: Rec, blk: int, s0: int, end: int) -> None:
343+ bufs = {"acceleration": (R.sig_acc, R.sum_acc), "velocity": (R.sig_vel, R.sum_vel),
344+ "displacement": (R.sig_disp, R.sum_disp)}
345+ for q in quantities:
346+ a, tot = bufs[q]
347+ store.write_chunks(f"signals/{q}", [((b, blk), a[b:b + 1, : end - s0]) for b in range(n)])
348+ store.write_chunk(f"signals/{q}_sum", (blk,), tot[: end - s0].astype(np.float32))
349+
350+ # initial forces (pulses at t = 0 included)
351+ W.scal[2] = internal_forces(S, W.x, W.F, W.hg)
352+ external_forces(S, 0.0, W.F)
353+
354+ if progress:
355+ print(f"beadnet: {n} beads, {S.si.size} springs, {S.bi.size} bends, {S.hi.size} hinges; "
356+ f"dt = {h:.3e} s ({substeps} steps per sample), {n_samples} samples", file=sys.stderr, flush=True)
357+ aborted = None
358+ t_loop = time.time()
359+ last_print = t_loop
360+ n_blocks = (n_samples + B - 1) // B
361+ done = 0
362+ writer = ThreadPoolExecutor(max_workers=1)
363+ pending = None
364+ try:
365+ for blk in range(n_blocks):
366+ s0 = blk * B
367+ s1 = min(n_samples, s0 + B)
368+ R = recs[blk % 2]
369+ status = run_block(S, W, R, s0, s1)
370+ end = s1 if status < 0 else status
371+ if pending is not None:
372+ pending.result()
373+ pending = writer.submit(write_block, R, blk, s0, end)
374+ done = end
375+ if status >= 0:
376+ aborted = (f"The solution blew up at t = {status / fs:.4f} s. "
377+ "Reduce dt (or safety) or the strike strength.")
378+ break
379+ now = time.time()
380+ if progress and (now - last_print > 5 or blk == n_blocks - 1):
381+ el = now - t_loop
382+ rate = el / (s1 / fs)
383+ print(f"beadnet: t = {s1 / fs:.3f} / {n_samples / fs:.3f} s, {rate:.1f}x real time, "
384+ f"remaining ~{_fmt_time(rate * (n_samples - s1) / fs)}", file=sys.stderr, flush=True)
385+ last_print = now
386+ if pending is not None:
387+ pending.result()
388+ finally:
389+ writer.shutdown()
390+ n_rec = int(W.iscal[0])
391+ elapsed_loop = time.time() - t_loop
392+
393+ # frames, energy, modes
394+ fc = max(1, min(n_rec, int(2 ** 20 // max(1, n * 12)))) if n_rec else 1
395+ store.group("frames")
396+ store.write("frames/displacement", frames[:n_rec], chunks=(fc, n, 3))
397+ store.write("frames/t", frame_t[:n_rec])
398+ store.write("frames/energy", energy[:n_rec])
399+ store.write("frames/dissipated", dissip[:n_rec])
400+ sigma = None
401+ if md is not None:
402+ store.group("modes")
403+ store.write("modes/freqs", md.freqs)
404+ sigma = modal_damping(c, md)
405+ store.write("modes/sigma", sigma)
406+ store.write("modes/energy", mode_energy[:n_rec], chunks=(max(1, min(n_rec, 2 ** 18 // max(1, om2.size))), om2.size))
407+
408+ # energy drift after the last excitation (energy removed by damping added back)
409+ t_exc = max([0.0] + [hh.t + hh.duration for hh in c.hits])
410+ sel = frame_t[:n_rec] >= t_exc
411+ total = (energy[:n_rec] + dissip[:n_rec])[sel]
412+ drift = float(np.max(np.abs(total - total[0])) / total[0]) if total.size > 1 and total[0] > 0 else 0.0
413+ freq_errors = [{"hz": hz, "cents": frequency_error_cents(model.method, 2 * np.pi * hz, h)}
414+ for hz in (1000, 2000, 5000, 10000, 20000) if hz < fs / 2]
415+ elapsed = time.time() - t_start
416+ run_attrs = dict(
417+ sample_rate=fs, n_samples=int(done), dt=h, substeps=substeps, omega_max=prep["omega_max"],
418+ f_max=prep["omega_max"] / (2 * np.pi), residual_force=prep["residual_force"],
419+ max_tension=prep["max_tension"], energy_drift=drift, freq_errors=freq_errors,
420+ quantities=quantities, signal_dir=[float(x) for x in c.signal_dir],
421+ frame_rate=fs / frame_stride, n_frames=n_rec, block=B,
422+ frames_max=float(np.max(np.abs(frames[:n_rec]))) if n_rec else 0.0,
423+ elapsed_s=elapsed, realtime_factor=elapsed_loop / max(done / fs, 1e-12),
424+ aborted=aborted, created=datetime.datetime.now().isoformat(timespec="seconds"),
425+ n_modes=0 if md is None else int(md.freqs.size), mode_kind=None if md is None else md.kind,
426+ )
427+ attrs = dict(base_attrs, kind="run", run=run_attrs, warnings=warnings)
428+ store.set_attrs({"beadnet": attrs})
429+ store.close()
430+ if progress:
431+ print(f"beadnet: done in {_fmt_time(elapsed)} ({run_attrs['realtime_factor']:.1f}x real time); "
432+ f"energy drift {drift:.1e}" + (f"; {aborted}" if aborted else ""), file=sys.stderr, flush=True)
433+ for w in warnings:
434+ print(f"beadnet: warning: {w}", file=sys.stderr, flush=True)
435+ return Run(out)
beadnet/static/beadnet.jsadded+1297−0View file
@@ -0,0 +1,1297 @@
1+// beadnet.js: web components for viewing beadnet models and runs.
2+//
3+// <script type="module" src="beadnet/beadnet.js"></script>
4+// <bn-run src="runs/drum">
5+// <bn-controls></bn-controls>
6+// <bn-animation></bn-animation>
7+// <bn-waveform></bn-waveform>
8+// <bn-spectrogram></bn-spectrogram>
9+// <bn-info></bn-info>
10+// </bn-run>
11+//
12+// <bn-run> loads a run (or saved model) directory, a Zarr v2 store written by
13+// the Python package, and holds the state its children share: the listener
14+// (a bead index or "sum"), the quantity, the time cursor and the visible time
15+// window. A child may sit elsewhere on the page and name its run with
16+// run="id". Data are fetched chunk by chunk as needed.
17+
18+const DTYPES = { "<f4": Float32Array, "<f8": Float64Array, "<i4": Int32Array, "|u1": Uint8Array };
19+const UNITS = { acceleration: "m/s²", velocity: "m/s", displacement: "m" };
20+
21+// ---- styles -----------------------------------------------------------------
22+
23+const CSS = `
24+:root {
25+ --bn-bg: #ffffff; --bn-panel: #f6f6f4; --bn-fg: #1d1d1b; --bn-muted: #6b6b66; --bn-grid: #e2e2dd;
26+ --bn-accent: #2563a8; --bn-pos: #c0392b; --bn-neg: #2166ac; --bn-neutral: #c9c9c4; --bn-edge: rgba(80,80,75,0.25);
27+ --bn-pinned: #3a3a36; --bn-hit: #e08214; --bn-listen: #0b8a5a; --bn-cursor: #e08214;
28+}
29+@media (prefers-color-scheme: dark) {
30+ :root:not([data-theme="light"]) {
31+ --bn-bg: #161615; --bn-panel: #1f1f1d; --bn-fg: #e8e8e3; --bn-muted: #9a9a93; --bn-grid: #33332f;
32+ --bn-accent: #6ea8e8; --bn-pos: #ef6b5b; --bn-neg: #5aa0e6; --bn-neutral: #55554f; --bn-edge: rgba(200,200,190,0.18);
33+ --bn-pinned: #d8d8d0; --bn-hit: #f0a040; --bn-listen: #3fcf94; --bn-cursor: #f0a040;
34+ }
35+}
36+:root[data-theme="dark"] {
37+ --bn-bg: #161615; --bn-panel: #1f1f1d; --bn-fg: #e8e8e3; --bn-muted: #9a9a93; --bn-grid: #33332f;
38+ --bn-accent: #6ea8e8; --bn-pos: #ef6b5b; --bn-neg: #5aa0e6; --bn-neutral: #55554f; --bn-edge: rgba(200,200,190,0.18);
39+ --bn-pinned: #d8d8d0; --bn-hit: #f0a040; --bn-listen: #3fcf94; --bn-cursor: #f0a040;
40+}
41+bn-run { display: block; }
42+bn-model, bn-animation, bn-waveform, bn-spectrogram, bn-controls, bn-info, bn-energy {
43+ display: block; margin: 8px 0; color: var(--bn-fg); font: 13px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif;
44+}
45+.bn-panel { background: var(--bn-panel); border-radius: 8px; padding: 8px; position: relative; }
46+.bn-canvas { display: block; width: 100%; touch-action: none; }
47+.bn-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-bottom: 6px; }
48+.bn-bar label { color: var(--bn-muted); }
49+.bn-title { font-weight: 600; }
50+.bn-muted { color: var(--bn-muted); }
51+.bn-bar button, .bn-bar select, .bn-bar input {
52+ font: inherit; color: var(--bn-fg); background: var(--bn-bg); border: 1px solid var(--bn-grid);
53+ border-radius: 6px; padding: 2px 8px; min-height: 26px;
54+}
55+.bn-bar button { cursor: pointer; }
56+.bn-bar button:hover { border-color: var(--bn-accent); }
57+.bn-bar input[type=number] { width: 6em; }
58+.bn-bar input[type=range] { flex: 1; min-width: 120px; padding: 0; border: none; background: none; }
59+.bn-error { color: var(--bn-pos); padding: 8px; }
60+.bn-info table { border-collapse: collapse; }
61+.bn-info td { padding: 1px 12px 1px 0; vertical-align: top; }
62+.bn-info td:first-child { color: var(--bn-muted); white-space: nowrap; }
63+.bn-warn { color: var(--bn-hit); }
64+.bn-legend { position: absolute; left: 14px; bottom: 10px; color: var(--bn-muted); font-size: 12px; pointer-events: none; }
65+.bn-legend span { margin-right: 10px; }
66+.bn-readout { position: absolute; right: 14px; top: 44px; color: var(--bn-muted); font-size: 12px; pointer-events: none; }
67+`;
68+
69+function injectStyle() {
70+ if (document.getElementById("bn-style")) return;
71+ const s = document.createElement("style");
72+ s.id = "bn-style";
73+ s.textContent = CSS;
74+ document.head.prepend(s);
75+}
76+
77+function cssVar(el, name) {
78+ return getComputedStyle(el).getPropertyValue(name).trim() || "#888";
79+}
80+
81+// ---- Zarr v2 reading ----------------------------------------------------------
82+
83+async function fetchJSON(url) {
84+ const r = await fetch(url, { cache: "no-store" });
85+ if (!r.ok) throw new Error(`${url}: HTTP ${r.status}`);
86+ return r.json();
87+}
88+
89+async function gunzip(buf) {
90+ const stream = new Blob([buf]).stream().pipeThrough(new DecompressionStream("gzip"));
91+ return new Response(stream).arrayBuffer();
92+}
93+
94+class ZArray {
95+ constructor(base, name, meta) {
96+ this.url = `${base}/${name}`;
97+ this.shape = meta.shape;
98+ this.chunks = meta.chunks;
99+ this.T = DTYPES[meta.dtype];
100+ if (!this.T) throw new Error(`${name}: unsupported dtype ${meta.dtype}`);
101+ this.gzip = meta.compressor && meta.compressor.id === "gzip";
102+ this.chunkSize = meta.chunks.reduce((a, b) => a * b, 1);
103+ }
104+ static async open(base, name) {
105+ return new ZArray(base, name, await fetchJSON(`${base}/${name}/.zarray`));
106+ }
107+ async chunk(idx) {
108+ const r = await fetch(`${this.url}/${idx.join(".")}`, { cache: "no-store" });
109+ if (r.status === 404) return new this.T(this.chunkSize);
110+ if (!r.ok) throw new Error(`${this.url}: HTTP ${r.status}`);
111+ let buf = await r.arrayBuffer();
112+ if (this.gzip) buf = await gunzip(buf);
113+ return new this.T(buf);
114+ }
115+ // The whole array, C order.
116+ async readAll() {
117+ const { shape, chunks } = this;
118+ const d = shape.length;
119+ const total = shape.reduce((a, b) => a * b, 1);
120+ const out = new this.T(total);
121+ if (total === 0) return out;
122+ const grid = shape.map((s, k) => Math.ceil(s / chunks[k]));
123+ const idxs = [];
124+ const rec = (k, cur) => {
125+ if (k === d) return idxs.push(cur.slice());
126+ for (let i = 0; i < grid[k]; i++) { cur[k] = i; rec(k + 1, cur); }
127+ };
128+ rec(0, new Array(d));
129+ const blocks = await Promise.all(idxs.map(ix => this.chunk(ix)));
130+ const strideOut = new Array(d).fill(1);
131+ const strideIn = new Array(d).fill(1);
132+ for (let k = d - 2; k >= 0; k--) {
133+ strideOut[k] = strideOut[k + 1] * shape[k + 1];
134+ strideIn[k] = strideIn[k + 1] * chunks[k + 1];
135+ }
136+ idxs.forEach((ix, q) => {
137+ const block = blocks[q];
138+ const valid = ix.map((i, k) => Math.min(chunks[k], shape[k] - i * chunks[k]));
139+ const rowLen = valid[d - 1];
140+ const rows = [];
141+ const rr = (k, cur) => {
142+ if (k === d - 1) return rows.push(cur.slice());
143+ for (let i = 0; i < valid[k]; i++) { cur[k] = i; rr(k + 1, cur); }
144+ };
145+ rr(0, new Array(d - 1));
146+ for (const r of rows) {
147+ let oin = 0, oout = ix[d - 1] * chunks[d - 1];
148+ for (let k = 0; k < d - 1; k++) {
149+ oin += r[k] * strideIn[k];
150+ oout += (ix[k] * chunks[k] + r[k]) * strideOut[k];
151+ }
152+ out.set(block.subarray(oin, oin + rowLen), oout);
153+ }
154+ });
155+ return out;
156+ }
157+}
158+
159+// ---- helpers ------------------------------------------------------------------
160+
161+function fmtSI(v, unit, digits = 3) {
162+ if (!isFinite(v)) return `${v}`;
163+ if (v === 0) return `0 ${unit}`;
164+ const prefixes = [[1e9, "G"], [1e6, "M"], [1e3, "k"], [1, ""], [1e-3, "m"], [1e-6, "µ"], [1e-9, "n"], [1e-12, "p"]];
165+ const a = Math.abs(v);
166+ for (const [s, p] of prefixes) {
167+ if (a >= s * 0.9995) return `${+(v / s).toPrecision(digits)} ${p}${unit}`;
168+ }
169+ return `${v.toExponential(digits - 1)} ${unit}`;
170+}
171+
172+function fmtTime(t) {
173+ if (Math.abs(t) < 1) return `${(t * 1000).toFixed(Math.abs(t) < 0.01 ? 3 : 2)} ms`;
174+ return `${t.toFixed(4)} s`;
175+}
176+
177+function niceTicks(lo, hi, n = 6) {
178+ const span = hi - lo;
179+ if (!(span > 0)) return [lo];
180+ let raw = span / n;
181+ for (let tries = 0; tries < 4; tries++) {
182+ const mag = Math.pow(10, Math.floor(Math.log10(raw)));
183+ const step = [1, 2, 2.5, 5, 10].map(m => m * mag).find(s => s >= raw) || 10 * mag;
184+ const out = [];
185+ for (let v = Math.ceil(lo / step) * step; v <= hi + 1e-12 * span; v += step) out.push(Math.abs(v) < 1e-12 * step ? 0 : v);
186+ if (out.length >= 3 || tries === 3) return out;
187+ raw /= 2;
188+ }
189+ return [lo, hi];
190+}
191+
192+function parseListener(s) {
193+ if (s === null || s === undefined || s === "" || s === "sum") return "sum";
194+ const v = Number(s);
195+ return Number.isInteger(v) ? v : "sum";
196+}
197+
198+function listenerLabel(l) {
199+ return l === "sum" ? "sum of all beads" : `bead ${l}`;
200+}
201+
202+function setupCanvas(canvas, cssHeight) {
203+ const dpr = window.devicePixelRatio || 1;
204+ const w = canvas.clientWidth || 600;
205+ canvas.style.height = `${cssHeight}px`;
206+ canvas.width = Math.round(w * dpr);
207+ canvas.height = Math.round(cssHeight * dpr);
208+ const ctx = canvas.getContext("2d");
209+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
210+ return { ctx, w, h: cssHeight };
211+}
212+
213+function fft(re, im) {
214+ const n = re.length;
215+ for (let i = 1, j = 0; i < n; i++) {
216+ let bit = n >> 1;
217+ for (; j & bit; bit >>= 1) j ^= bit;
218+ j ^= bit;
219+ if (i < j) {
220+ let t = re[i]; re[i] = re[j]; re[j] = t;
221+ t = im[i]; im[i] = im[j]; im[j] = t;
222+ }
223+ }
224+ for (let len = 2; len <= n; len <<= 1) {
225+ const ang = (-2 * Math.PI) / len;
226+ const wr = Math.cos(ang), wi = Math.sin(ang);
227+ for (let i = 0; i < n; i += len) {
228+ let cr = 1, ci = 0;
229+ for (let k = 0; k < len / 2; k++) {
230+ const a = i + k, b = a + len / 2;
231+ const tr = re[b] * cr - im[b] * ci;
232+ const ti = re[b] * ci + im[b] * cr;
233+ re[b] = re[a] - tr; im[b] = im[a] - ti;
234+ re[a] += tr; im[a] += ti;
235+ const nr = cr * wr - ci * wi;
236+ ci = cr * wi + ci * wr;
237+ cr = nr;
238+ }
239+ }
240+ }
241+}
242+
243+// Perceptual colormap (magma-like), 256 entries of [r, g, b].
244+const MAGMA = (() => {
245+ const stops = [[0, [0, 0, 4]], [0.2, [40, 11, 84]], [0.4, [101, 21, 110]], [0.55, [159, 42, 99]],
246+ [0.7, [212, 72, 66]], [0.85, [245, 125, 21]], [1, [252, 255, 164]]];
247+ const lut = [];
248+ for (let i = 0; i < 256; i++) {
249+ const u = i / 255;
250+ let k = 0;
251+ while (k < stops.length - 2 && u > stops[k + 1][0]) k++;
252+ const [u0, c0] = stops[k], [u1, c1] = stops[k + 1];
253+ const f = (u - u0) / (u1 - u0);
254+ lut.push(c0.map((c, q) => Math.round(c + f * (c1[q] - c))));
255+ }
256+ return lut;
257+})();
258+
259+function wavBlob(x, fs, fullScale = 0, peak = 0.9) {
260+ let m = 0;
261+ for (const v of x) m = Math.max(m, Math.abs(v));
262+ const g = fullScale > 0 ? 1 / fullScale : m > 0 ? peak / m : 1;
263+ const buf = new ArrayBuffer(44 + 2 * x.length);
264+ const dv = new DataView(buf);
265+ const w = (o, s) => [...s].forEach((c, i) => dv.setUint8(o + i, c.charCodeAt(0)));
266+ w(0, "RIFF"); dv.setUint32(4, 36 + 2 * x.length, true); w(8, "WAVE"); w(12, "fmt ");
267+ dv.setUint32(16, 16, true); dv.setUint16(20, 1, true); dv.setUint16(22, 1, true);
268+ dv.setUint32(24, fs, true); dv.setUint32(28, 2 * fs, true); dv.setUint16(32, 2, true); dv.setUint16(34, 16, true);
269+ w(36, "data"); dv.setUint32(40, 2 * x.length, true);
270+ for (let i = 0; i < x.length; i++) dv.setInt16(44 + 2 * i, Math.round(32767 * Math.max(-1, Math.min(1, g * x[i]))), true);
271+ return new Blob([buf], { type: "audio/wav" });
272+}
273+
274+// ---- <bn-run> -------------------------------------------------------------------
275+
276+class BnRun extends HTMLElement {
277+ constructor() {
278+ super();
279+ this.state = { listener: "sum", quantity: null, cursor: 0, view: [0, 1] };
280+ this._signals = new Map();
281+ this._frameChunks = new Map();
282+ this._ready = null;
283+ this._audio = null;
284+ }
285+ connectedCallback() {
286+ injectStyle();
287+ this.ready;
288+ }
289+ get ready() {
290+ if (!this._ready) {
291+ this._ready = this._load().catch(e => {
292+ const div = document.createElement("div");
293+ div.className = "bn-error";
294+ div.textContent = `beadnet: could not load ${this.getAttribute("src")}: ${e.message}`;
295+ this.prepend(div);
296+ throw e;
297+ });
298+ }
299+ return this._ready;
300+ }
301+ async _load() {
302+ const src = this.getAttribute("src");
303+ if (!src) throw new Error("bn-run needs a src attribute");
304+ this.base = src.replace(/\/+$/, "");
305+ const attrs = (await fetchJSON(`${this.base}/.zattrs`)).beadnet;
306+ if (!attrs) throw new Error("not a beadnet store");
307+ this.attrs = attrs;
308+ this.model = attrs.model;
309+ this.meta = attrs.kind === "run" ? attrs.run : null;
310+ this.n = attrs.n;
311+ const [pos, pinned, edges] = await Promise.all(
312+ ["model/pos", "model/pinned", "model/edges"].map(async name => (await ZArray.open(this.base, name)).readAll())
313+ );
314+ this.pos = pos;
315+ this.pinned = pinned;
316+ this.edges = edges;
317+ this.hitBeads = new Set();
318+ for (const h of this.model.hits || []) for (const b of h.beads) this.hitBeads.add(b);
319+ this.quantities = this.meta ? this.meta.quantities : [];
320+ this.duration = this.meta ? this.meta.n_samples / this.meta.sample_rate : this.model.duration;
321+ if (this.meta && this.meta.n_frames > 0) {
322+ this.framesArr = await ZArray.open(this.base, "frames/displacement");
323+ this.frameT = await (await ZArray.open(this.base, "frames/t")).readAll();
324+ this.frameRate = this.meta.frame_rate;
325+ }
326+ const q = this.getAttribute("quantity");
327+ this.state = {
328+ listener: parseListener(this.getAttribute("listener") ?? (this.model.listen ?? "sum")),
329+ quantity: q && this.quantities.includes(q) ? q : this.quantities[0] || null,
330+ cursor: 0,
331+ view: [0, this.duration],
332+ };
333+ }
334+ // Update shared state; listeners get a "bn-change" event with the changed keys.
335+ set(patch, source = null) {
336+ Object.assign(this.state, patch);
337+ this.dispatchEvent(new CustomEvent("bn-change", { detail: { patch, source } }));
338+ }
339+ // Signal for a listener ("sum", a bead index, or an array of beads) and quantity.
340+ async signal(listener = this.state.listener, quantity = this.state.quantity) {
341+ if (!this.meta) throw new Error("this store holds a model only (no run results)");
342+ const key = `${Array.isArray(listener) ? listener.join(",") : listener}:${quantity}`;
343+ if (!this._signals.has(key)) {
344+ this._signals.set(key, this._readSignal(listener, quantity));
345+ if (this._signals.size > 24) this._signals.delete(this._signals.keys().next().value);
346+ }
347+ return this._signals.get(key);
348+ }
349+ async _readSignal(listener, quantity) {
350+ const ns = this.meta.n_samples;
351+ if (Array.isArray(listener)) {
352+ const parts = await Promise.all(listener.map(b => this.signal(b, quantity)));
353+ const out = new Float32Array(ns);
354+ for (const p of parts) for (let i = 0; i < ns; i++) out[i] += p[i];
355+ return out;
356+ }
357+ const arr = await ZArray.open(this.base, listener === "sum" ? `signals/${quantity}_sum` : `signals/${quantity}`);
358+ const B = arr.chunks[arr.chunks.length - 1];
359+ const nc = Math.ceil(ns / B);
360+ const chunks = await Promise.all(
361+ Array.from({ length: nc }, (_, j) => arr.chunk(listener === "sum" ? [j] : [listener, j]))
362+ );
363+ const out = new Float32Array(ns);
364+ chunks.forEach((c, j) => out.set(c.subarray(0, Math.min(B, ns - j * B)), j * B));
365+ return out;
366+ }
367+ // Displacement (3n, Float32Array) at frame f, or null while its chunk loads.
368+ frame(f, onLoad) {
369+ if (!this.framesArr) return null;
370+ const fc = this.framesArr.chunks[0];
371+ const ci = Math.floor(f / fc);
372+ let entry = this._frameChunks.get(ci);
373+ if (!entry) {
374+ entry = { data: null, promise: null };
375+ entry.promise = this.framesArr.chunk([ci, 0, 0]).then(d => { entry.data = d; if (onLoad) onLoad(); });
376+ this._frameChunks.set(ci, entry);
377+ if (this._frameChunks.size > 64) this._frameChunks.delete(this._frameChunks.keys().next().value);
378+ }
379+ if (!entry.data) return null;
380+ const off = (f - ci * fc) * this.n * 3;
381+ return entry.data.subarray(off, off + this.n * 3);
382+ }
383+ prefetchFrame(f) {
384+ if (this.framesArr && f < this.meta.n_frames) this.frame(f);
385+ }
386+ // Play a signal from time t0 (normalized to 0.9 of its peak). The cursor follows.
387+ async play(listener = this.state.listener, quantity = this.state.quantity, t0 = this.state.cursor) {
388+ this.stop();
389+ const x = await this.signal(listener, quantity);
390+ const fs = this.meta.sample_rate;
391+ if (!this._ctx) this._ctx = new AudioContext();
392+ const ctx = this._ctx;
393+ if (ctx.state === "suspended") await ctx.resume();
394+ let m = 0;
395+ for (const v of x) m = Math.max(m, Math.abs(v));
396+ const buf = ctx.createBuffer(1, x.length, fs);
397+ const ch = buf.getChannelData(0);
398+ // normalized to the signal's peak, or to the run's full-scale attribute
399+ // (signal units at 0 dBFS) so that runs sharing it keep their relative loudness
400+ const fsAttr = Number(this.getAttribute("full-scale"));
401+ const g = fsAttr > 0 ? 1 / fsAttr : m > 0 ? 0.9 / m : 1;
402+ for (let i = 0; i < x.length; i++) ch[i] = Math.max(-1, Math.min(1, g * x[i]));
403+ const node = ctx.createBufferSource();
404+ node.buffer = buf;
405+ node.connect(ctx.destination);
406+ if (t0 >= this.duration - 1e-3) t0 = 0;
407+ const start = ctx.currentTime;
408+ node.start(start, t0);
409+ const audio = { node, start, t0 };
410+ this._audio = audio;
411+ this.set({ playing: true });
412+ node.onended = () => {
413+ if (this._audio === audio) {
414+ this._audio = null;
415+ this.set({ playing: false });
416+ }
417+ };
418+ const tick = () => {
419+ if (this._audio !== audio) return;
420+ this.set({ cursor: Math.min(this.duration, t0 + (ctx.currentTime - start)) }, "audio");
421+ requestAnimationFrame(tick);
422+ };
423+ requestAnimationFrame(tick);
424+ }
425+ stop() {
426+ if (this._audio) {
427+ const a = this._audio;
428+ this._audio = null;
429+ try { a.node.stop(); } catch (e) { /* already stopped */ }
430+ this.set({ playing: false });
431+ }
432+ }
433+}
434+
435+// Base class for the run's children: finds the run, waits for it, redraws on change.
436+class BnChild extends HTMLElement {
437+ connectedCallback() {
438+ injectStyle();
439+ if (this._connected) return;
440+ this._connected = true;
441+ customElements.whenDefined("bn-run").then(async () => {
442+ const id = this.getAttribute("run");
443+ const run = id ? document.getElementById(id) : this.closest("bn-run");
444+ if (!run) {
445+ this.innerHTML = `<div class="bn-error">${this.localName}: no enclosing &lt;bn-run&gt; (or run="id")</div>`;
446+ return;
447+ }
448+ this.run = run;
449+ try {
450+ await run.ready;
451+ } catch (e) {
452+ return;
453+ }
454+ this.init();
455+ run.addEventListener("bn-change", e => this.onChange(e.detail.patch, e.detail.source));
456+ if (typeof ResizeObserver !== "undefined") {
457+ let w = 0;
458+ new ResizeObserver(() => {
459+ if (this.clientWidth !== w) { w = this.clientWidth; this.redraw(); }
460+ }).observe(this);
461+ }
462+ window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => this.redraw());
463+ });
464+ }
465+ init() {}
466+ onChange() {}
467+ redraw() {}
468+ // Listener and quantity: fixed by attributes, or the run's shared state.
469+ get listener() {
470+ return this.hasAttribute("listener") ? parseListener(this.getAttribute("listener")) : this.run.state.listener;
471+ }
472+ get quantity() {
473+ return this.getAttribute("quantity") || this.run.state.quantity;
474+ }
475+ get fixedSignal() {
476+ return this.hasAttribute("listener") || this.hasAttribute("quantity");
477+ }
478+ get height() {
479+ return Number(this.getAttribute("height")) || this.defaultHeight;
480+ }
481+}
482+
483+// ---- 3D bead view: <bn-model> and <bn-animation> -------------------------------------
484+
485+class BeadView extends BnChild {
486+ get defaultHeight() { return 420; }
487+ get animated() { return false; }
488+ init() {
489+ const run = this.run;
490+ this.az = Number(this.getAttribute("azimuth") ?? -0.6);
491+ this.el = Number(this.getAttribute("elevation") ?? 0.75);
492+ this.zoom = 1;
493+ this.pan = [0, 0];
494+ this.time = 0;
495+ this.playing = false;
496+ this.speed = Number(this.getAttribute("speed")) || 1 / 128;
497+ this.gainExp = 0;
498+ const n = run.n, P = run.pos;
499+ let cx = 0, cy = 0, cz = 0;
500+ for (let i = 0; i < n; i++) { cx += P[3 * i]; cy += P[3 * i + 1]; cz += P[3 * i + 2]; }
501+ this.center = [cx / n, cy / n, cz / n];
502+ let ext = 0;
503+ for (let i = 0; i < n; i++) {
504+ ext = Math.max(ext, Math.hypot(P[3 * i] - this.center[0], P[3 * i + 1] - this.center[1], P[3 * i + 2] - this.center[2]));
505+ }
506+ this.extent = ext || 1;
507+ const E = run.edges;
508+ const lens = [];
509+ for (let e = 0; e < E.length / 2 && e < 2000; e++) {
510+ const i = E[2 * e], j = E[2 * e + 1];
511+ lens.push(Math.hypot(P[3 * j] - P[3 * i], P[3 * j + 1] - P[3 * i + 1], P[3 * j + 2] - P[3 * i + 2]));
512+ }
513+ lens.sort((a, b) => a - b);
514+ this.spacing = lens.length ? lens[lens.length >> 1] : this.extent / Math.sqrt(n);
515+ const dir = run.meta ? run.meta.signal_dir : run.model.signal_dir || [0, 0, 1];
516+ this.sigDir = dir;
517+ this.dmax = run.meta && run.meta.frames_max > 0 ? run.meta.frames_max : 0;
518+ this.hasFrames = this.animated && !!run.framesArr;
519+
520+ const panel = document.createElement("div");
521+ panel.className = "bn-panel";
522+ if (this.animated) {
523+ const bar = document.createElement("div");
524+ bar.className = "bn-bar";
525+ if (this.hasFrames) {
526+ bar.innerHTML = `
527+ <button data-k="play" title="Play / pause the animation">▶</button>
528+ <input data-k="slider" type="range" min="0" max="1000" value="0" step="1" title="Time">
529+ <span data-k="time" class="bn-muted" style="min-width:7em"></span>
530+ <label>speed <select data-k="speed">${[1, 1 / 4, 1 / 16, 1 / 64, 1 / 128, 1 / 256, 1 / 1024, 1 / 4096]
531+ .map(s => `<option value="${s}" ${Math.abs(s - this.speed) < 1e-12 ? "selected" : ""}>${s === 1 ? "real time" : "1/" + Math.round(1 / s)}</option>`).join("")}</select></label>
532+ <label>exaggeration <select data-k="gain">${[-4, -2, 0, 2, 4, 6].map(g => `<option value="${g}" ${g === 0 ? "selected" : ""}>${g === 0 ? "auto" : (g > 0 ? "×" + 2 ** g : "/" + 2 ** -g)}</option>`).join("")}</select></label>`;
533+ } else {
534+ bar.innerHTML = `<span class="bn-muted">No displacement frames in this store (a model, not a run).</span>`;
535+ }
536+ panel.appendChild(bar);
537+ this.bar = bar;
538+ }
539+ this.canvas = document.createElement("canvas");
540+ this.canvas.className = "bn-canvas";
541+ panel.appendChild(this.canvas);
542+ const legend = document.createElement("div");
543+ legend.className = "bn-legend";
544+ panel.appendChild(legend);
545+ this.legend = legend;
546+ this.replaceChildren(panel);
547+
548+ if (this.bar && this.hasFrames) {
549+ const q = k => this.bar.querySelector(`[data-k=${k}]`);
550+ this.ui = { play: q("play"), slider: q("slider"), time: q("time") };
551+ q("play").onclick = () => this.setPlaying(!this.playing);
552+ q("slider").oninput = e => this.setTime((Number(e.target.value) / 1000) * this.maxTime(), true);
553+ q("speed").onchange = e => { this.speed = Number(e.target.value); };
554+ q("gain").onchange = e => { this.gainExp = Number(e.target.value); this.redraw(); };
555+ }
556+ this.setupMouse();
557+ this.redraw();
558+ }
559+ maxTime() {
560+ const r = this.run;
561+ return r.frameT && r.frameT.length ? r.frameT[r.frameT.length - 1] : 0;
562+ }
563+ setPlaying(p) {
564+ this.playing = p;
565+ if (this.ui) this.ui.play.textContent = p ? "❚❚" : "▶";
566+ if (!p) return;
567+ if (this.time >= this.maxTime()) this.time = 0;
568+ let last = performance.now();
569+ const tick = now => {
570+ if (!this.playing || !this.isConnected) return;
571+ let t = this.time + ((now - last) / 1000) * this.speed;
572+ last = now;
573+ if (t > this.maxTime()) t = 0;
574+ this.setTime(t, true);
575+ requestAnimationFrame(tick);
576+ };
577+ requestAnimationFrame(tick);
578+ }
579+ setTime(t, broadcast) {
580+ this.time = Math.max(0, Math.min(this.maxTime(), t));
581+ if (broadcast) this.run.set({ cursor: this.time }, this);
582+ this.redraw();
583+ }
584+ onChange(patch, source) {
585+ if ("cursor" in patch && source !== this && this.hasFrames) {
586+ if (source === "audio" || !this.playing) {
587+ this.time = Math.max(0, Math.min(this.maxTime(), patch.cursor));
588+ this.redraw();
589+ }
590+ }
591+ if ("listener" in patch) this.redraw();
592+ }
593+ project(px, py, pz) {
594+ const x = px - this.center[0], y = py - this.center[1], z = pz - this.center[2];
595+ const ca = Math.cos(this.az), sa = Math.sin(this.az);
596+ const xr = ca * x - sa * y;
597+ const yr = sa * x + ca * y;
598+ const up = Math.sin(this.el) * yr + Math.cos(this.el) * z;
599+ return [xr, up];
600+ }
601+ setupMouse() {
602+ const c = this.canvas;
603+ let drag = null;
604+ c.addEventListener("pointerdown", e => {
605+ drag = { x: e.clientX, y: e.clientY, az: this.az, el: this.el, pan: this.pan.slice(), moved: false, shift: e.shiftKey };
606+ c.setPointerCapture(e.pointerId);
607+ });
608+ c.addEventListener("pointermove", e => {
609+ if (!drag) return;
610+ const dx = e.clientX - drag.x, dy = e.clientY - drag.y;
611+ if (Math.hypot(dx, dy) > 3) drag.moved = true;
612+ if (!drag.moved) return;
613+ if (drag.shift) {
614+ this.pan = [drag.pan[0] + dx, drag.pan[1] + dy];
615+ } else {
616+ this.az = drag.az + dx * 0.01;
617+ this.el = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, drag.el + dy * 0.01));
618+ }
619+ this.redraw();
620+ });
621+ c.addEventListener("pointerup", e => {
622+ if (drag && !drag.moved) this.pick(e);
623+ drag = null;
624+ });
625+ c.addEventListener("wheel", e => {
626+ if (!(e.ctrlKey || e.metaKey)) return;
627+ e.preventDefault();
628+ this.zoom *= Math.pow(1.15, -Math.sign(e.deltaY));
629+ this.redraw();
630+ }, { passive: false });
631+ c.addEventListener("dblclick", () => {
632+ this.zoom = 1;
633+ this.pan = [0, 0];
634+ this.az = Number(this.getAttribute("azimuth") ?? -0.6);
635+ this.el = Number(this.getAttribute("elevation") ?? 0.75);
636+ this.redraw();
637+ });
638+ }
639+ pick(e) {
640+ if (!this.screen) return;
641+ const r = this.canvas.getBoundingClientRect();
642+ const mx = e.clientX - r.left, my = e.clientY - r.top;
643+ let best = -1, bd = 12 * 12;
644+ const S = this.screen;
645+ for (let i = 0; i < this.run.n; i++) {
646+ const d = (S[2 * i] - mx) ** 2 + (S[2 * i + 1] - my) ** 2;
647+ if (d < bd) { bd = d; best = i; }
648+ }
649+ if (best < 0) return;
650+ if (this.hasAttribute("listener")) return;
651+ this.run.set({ listener: this.run.state.listener === best ? "sum" : best }, this);
652+ }
653+ redraw() {
654+ if (!this.canvas || this._raf) return;
655+ this._raf = requestAnimationFrame(() => {
656+ this._raf = 0;
657+ this.draw();
658+ });
659+ }
660+ draw() {
661+ const run = this.run;
662+ const { ctx, w, h } = setupCanvas(this.canvas, this.height);
663+ const n = run.n, P = run.pos;
664+ const scale = (0.45 * Math.min(w, h) / this.extent) * this.zoom;
665+ const ox = w / 2 + this.pan[0], oy = h / 2 + this.pan[1];
666+ // displacement at the current time (linear between frames)
667+ let disp = null;
668+ let gain = 0;
669+ if (this.hasFrames) {
670+ const fr = run.frameRate;
671+ const ff = this.time * fr;
672+ const f0 = Math.max(0, Math.min(run.meta.n_frames - 1, Math.floor(ff)));
673+ const f1 = Math.min(run.meta.n_frames - 1, f0 + 1);
674+ const redraw = () => this.redraw();
675+ const a = run.frame(f0, redraw), b = run.frame(f1, redraw);
676+ run.prefetchFrame(f1 + run.framesArr.chunks[0]);
677+ if (a && b) {
678+ const u = Math.max(0, Math.min(1, ff - f0));
679+ disp = new Float32Array(3 * n);
680+ for (let q = 0; q < 3 * n; q++) disp[q] = a[q] + u * (b[q] - a[q]);
681+ }
682+ // auto: the largest displacement shows as 8% of the object's size, but never shrunk below true scale
683+ const fixed = Number(this.getAttribute("exaggeration"));
684+ gain = fixed > 0 ? fixed * 2 ** this.gainExp
685+ : this.dmax > 0 ? Math.max(1, (0.08 * this.extent) / this.dmax) * 2 ** this.gainExp : 0;
686+ if (this.ui) {
687+ this.ui.slider.value = String(Math.round((this.time / (this.maxTime() || 1)) * 1000));
688+ this.ui.time.textContent = `t = ${fmtTime(this.time)}`;
689+ }
690+ }
691+ const S = new Float32Array(2 * n);
692+ for (let i = 0; i < n; i++) {
693+ let x = P[3 * i], y = P[3 * i + 1], z = P[3 * i + 2];
694+ if (disp) { x += gain * disp[3 * i]; y += gain * disp[3 * i + 1]; z += gain * disp[3 * i + 2]; }
695+ const [sx, sy] = this.project(x, y, z);
696+ S[2 * i] = ox + scale * sx;
697+ S[2 * i + 1] = oy - scale * sy;
698+ }
699+ this.screen = S;
700+ ctx.clearRect(0, 0, w, h);
701+ // edges
702+ const E = run.edges;
703+ ctx.strokeStyle = cssVar(this, "--bn-edge");
704+ ctx.lineWidth = 1;
705+ ctx.beginPath();
706+ for (let e = 0; e < E.length; e += 2) {
707+ ctx.moveTo(S[2 * E[e]], S[2 * E[e] + 1]);
708+ ctx.lineTo(S[2 * E[e + 1]], S[2 * E[e + 1] + 1]);
709+ }
710+ ctx.stroke();
711+ // beads, colored by displacement along the signal direction when animating
712+ const rad = Math.max(1.5, Math.min(6, 0.28 * this.spacing * scale));
713+ const neutral = cssVar(this, "--bn-neutral"), pos = cssVar(this, "--bn-pos"), neg = cssVar(this, "--bn-neg");
714+ const NB = 21;
715+ const buckets = Array.from({ length: NB }, () => []);
716+ const pinnedList = [];
717+ // color scale: the displacement that the exaggeration shows as 8% of the object's size
718+ const dmaxShown = gain > 0 ? (0.08 * this.extent) / gain : 1;
719+ for (let i = 0; i < n; i++) {
720+ if (run.pinned[i]) { pinnedList.push(i); continue; }
721+ let k = (NB - 1) / 2;
722+ if (disp) {
723+ const d = this.sigDir[0] * disp[3 * i] + this.sigDir[1] * disp[3 * i + 1] + this.sigDir[2] * disp[3 * i + 2];
724+ const u = Math.max(-1, Math.min(1, d / dmaxShown));
725+ k = Math.round(((u + 1) / 2) * (NB - 1));
726+ }
727+ buckets[k].push(i);
728+ }
729+ const mix = (c1, c2, f) => `color-mix(in srgb, ${c2} ${Math.round(f * 100)}%, ${c1})`;
730+ buckets.forEach((list, k) => {
731+ if (!list.length) return;
732+ const u = (k / (NB - 1)) * 2 - 1;
733+ ctx.fillStyle = u === 0 ? neutral : u > 0 ? mix(neutral, pos, u) : mix(neutral, neg, -u);
734+ ctx.beginPath();
735+ for (const i of list) { ctx.moveTo(S[2 * i] + rad, S[2 * i + 1]); ctx.arc(S[2 * i], S[2 * i + 1], rad, 0, 2 * Math.PI); }
736+ ctx.fill();
737+ });
738+ ctx.fillStyle = cssVar(this, "--bn-pinned");
739+ ctx.beginPath();
740+ for (const i of pinnedList) { ctx.moveTo(S[2 * i] + rad, S[2 * i + 1]); ctx.arc(S[2 * i], S[2 * i + 1], rad, 0, 2 * Math.PI); }
741+ ctx.fill();
742+ // struck beads and listener
743+ ctx.strokeStyle = cssVar(this, "--bn-hit");
744+ ctx.lineWidth = 1.5;
745+ ctx.beginPath();
746+ for (const i of run.hitBeads) { ctx.moveTo(S[2 * i] + rad + 2, S[2 * i + 1]); ctx.arc(S[2 * i], S[2 * i + 1], rad + 2, 0, 2 * Math.PI); }
747+ ctx.stroke();
748+ const L = this.listener;
749+ if (L !== "sum" && L >= 0 && L < n) {
750+ ctx.strokeStyle = cssVar(this, "--bn-listen");
751+ ctx.lineWidth = 2.5;
752+ ctx.beginPath();
753+ ctx.arc(S[2 * L], S[2 * L + 1], rad + 5, 0, 2 * Math.PI);
754+ ctx.stroke();
755+ }
756+ const exag = disp && gain > 0 ? (gain === 1 ? " · true scale" : ` · displacement ×${+gain.toPrecision(3)}`) : "";
757+ this.legend.innerHTML =
758+ `<span style="color:var(--bn-pinned)">●</span><span>pinned</span>` +
759+ `<span style="color:var(--bn-hit)">○</span><span>struck</span>` +
760+ `<span style="color:var(--bn-listen)">○</span><span>listener: ${listenerLabel(L)}</span>` +
761+ `<span>${n} beads${exag}</span>`;
762+ }
763+}
764+
765+class BnModel extends BeadView {}
766+class BnAnimation extends BeadView {
767+ get animated() { return true; }
768+}
769+
770+// ---- time-axis plots: <bn-waveform> and <bn-spectrogram> ---------------------------
771+
772+const MARGIN = { left: 62, right: 10, top: 8, bottom: 24 };
773+
774+class TimePlot extends BnChild {
775+ init() {
776+ const panel = document.createElement("div");
777+ panel.className = "bn-panel";
778+ const bar = document.createElement("div");
779+ bar.className = "bn-bar";
780+ bar.innerHTML = `<span class="bn-title" data-k="title"></span><span style="flex:1"></span>
781+ ${this.toolbar()}
782+ <button data-k="play" title="Play this signal from the cursor">▶ play</button>
783+ <button data-k="reset" title="Show the whole run">full view</button>`;
784+ panel.appendChild(bar);
785+ this.canvas = document.createElement("canvas");
786+ this.canvas.className = "bn-canvas";
787+ panel.appendChild(this.canvas);
788+ this.readout = document.createElement("div");
789+ this.readout.className = "bn-readout";
790+ panel.appendChild(this.readout);
791+ this.replaceChildren(panel);
792+ this.bar = bar;
793+ this.q = k => bar.querySelector(`[data-k=${k}]`);
794+ this.q("play").onclick = () => {
795+ if (this.run.state.playing) this.run.stop();
796+ else this.run.play(this.listener, this.quantity);
797+ };
798+ this.q("reset").onclick = () => this.setView([0, this.run.duration]);
799+ this.view = this.run.state.view.slice();
800+ this.setupMouse();
801+ this.initExtra();
802+ this.load();
803+ }
804+ toolbar() { return ""; }
805+ initExtra() {}
806+ get independent() { return this.hasAttribute("independent"); }
807+ setView(v) {
808+ const D = this.run.duration;
809+ let [a, b] = v;
810+ const w = Math.max(1e-3, Math.min(D, b - a));
811+ if (a < 0) a = 0;
812+ if (a + w > D) a = D - w;
813+ this.view = [a, a + w];
814+ if (!this.independent) this.run.set({ view: this.view.slice() }, this);
815+ this.redraw();
816+ }
817+ async load() {
818+ if (!this.run.meta) {
819+ this.q("title").textContent = "no run results (model only)";
820+ return;
821+ }
822+ const L = this.listener, Q = this.quantity;
823+ this.q("title").textContent = `${listenerLabel(L)} · ${Q}`;
824+ const token = (this._token = {});
825+ const x = await this.run.signal(L, Q);
826+ if (token !== this._token) return;
827+ this.x = x;
828+ this.prepare();
829+ this.redraw();
830+ }
831+ prepare() {}
832+ onChange(patch, source) {
833+ if (("listener" in patch && !this.hasAttribute("listener")) || ("quantity" in patch && !this.hasAttribute("quantity"))) {
834+ this.load();
835+ }
836+ if ("view" in patch && source !== this && !this.independent) {
837+ this.view = patch.view.slice();
838+ this.redraw();
839+ }
840+ if ("cursor" in patch) this.redrawCursor();
841+ if ("playing" in patch) this.q("play").textContent = patch.playing ? "■ stop" : "▶ play";
842+ }
843+ tOfX(px, w) {
844+ const [a, b] = this.view;
845+ return a + ((px - MARGIN.left) / (w - MARGIN.left - MARGIN.right)) * (b - a);
846+ }
847+ xOfT(t, w) {
848+ const [a, b] = this.view;
849+ return MARGIN.left + ((t - a) / (b - a)) * (w - MARGIN.left - MARGIN.right);
850+ }
851+ setupMouse() {
852+ const c = this.canvas;
853+ let drag = null;
854+ c.addEventListener("pointerdown", e => {
855+ drag = { x: e.clientX, view: this.view.slice(), moved: false };
856+ c.setPointerCapture(e.pointerId);
857+ });
858+ c.addEventListener("pointermove", e => {
859+ const r = c.getBoundingClientRect();
860+ this.hover(e.clientX - r.left, e.clientY - r.top, r.width);
861+ if (!drag) return;
862+ const dx = e.clientX - drag.x;
863+ if (Math.abs(dx) > 3) drag.moved = true;
864+ if (!drag.moved) return;
865+ const [a, b] = drag.view;
866+ const dt = (-dx / (r.width - MARGIN.left - MARGIN.right)) * (b - a);
867+ this.setView([a + dt, b + dt]);
868+ });
869+ c.addEventListener("pointerup", e => {
870+ if (drag && !drag.moved) {
871+ const r = c.getBoundingClientRect();
872+ const t = Math.max(0, Math.min(this.run.duration, this.tOfX(e.clientX - r.left, r.width)));
873+ const wasPlaying = this.run.state.playing;
874+ this.run.stop();
875+ this.run.set({ cursor: t }, this);
876+ if (wasPlaying) this.run.play(this.listener, this.quantity, t);
877+ }
878+ drag = null;
879+ });
880+ c.addEventListener("pointerleave", () => { this.readout.textContent = ""; });
881+ c.addEventListener("wheel", e => {
882+ if (!(e.ctrlKey || e.metaKey)) return;
883+ e.preventDefault();
884+ const r = c.getBoundingClientRect();
885+ const t = this.tOfX(e.clientX - r.left, r.width);
886+ const f = Math.pow(1.25, Math.sign(e.deltaY));
887+ const [a, b] = this.view;
888+ this.setView([t - (t - a) * f, t + (b - t) * f]);
889+ }, { passive: false });
890+ c.addEventListener("dblclick", () => this.setView([0, this.run.duration]));
891+ }
892+ hover() {}
893+ redraw() {
894+ if (!this.canvas || this._raf) return;
895+ this._raf = requestAnimationFrame(() => {
896+ this._raf = 0;
897+ this.drawBase();
898+ this.drawCursor();
899+ });
900+ }
901+ redrawCursor() {
902+ if (!this.base || this._rafc) return;
903+ this._rafc = requestAnimationFrame(() => {
904+ this._rafc = 0;
905+ this.drawCursor();
906+ });
907+ }
908+ // Draws the plot into an offscreen canvas (this.base); the cursor goes on top.
909+ drawBase() {
910+ const { ctx, w, h } = setupCanvas(this.canvas, this.height);
911+ this.w = w;
912+ this.h = h;
913+ if (!this.x) {
914+ ctx.fillStyle = cssVar(this, "--bn-muted");
915+ ctx.fillText(this.run.meta ? "loading…" : "", MARGIN.left, 20);
916+ this.base = null;
917+ return;
918+ }
919+ const off = document.createElement("canvas");
920+ off.width = this.canvas.width;
921+ off.height = this.canvas.height;
922+ const octx = off.getContext("2d");
923+ const dpr = window.devicePixelRatio || 1;
924+ octx.setTransform(dpr, 0, 0, dpr, 0, 0);
925+ octx.font = "11px system-ui, sans-serif";
926+ this.plot(octx, w, h);
927+ this.timeAxis(octx, w, h);
928+ this.base = off;
929+ }
930+ drawCursor() {
931+ if (!this.base) return;
932+ const ctx = this.canvas.getContext("2d");
933+ ctx.setTransform(1, 0, 0, 1, 0, 0);
934+ ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
935+ ctx.drawImage(this.base, 0, 0);
936+ const dpr = window.devicePixelRatio || 1;
937+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
938+ const t = this.run.state.cursor;
939+ const [a, b] = this.view;
940+ if (t >= a && t <= b) {
941+ const x = this.xOfT(t, this.w);
942+ ctx.strokeStyle = cssVar(this, "--bn-cursor");
943+ ctx.lineWidth = 1.5;
944+ ctx.beginPath();
945+ ctx.moveTo(x, MARGIN.top);
946+ ctx.lineTo(x, this.h - MARGIN.bottom);
947+ ctx.stroke();
948+ }
949+ }
950+ timeAxis(ctx, w, h) {
951+ const [a, b] = this.view;
952+ const y = h - MARGIN.bottom;
953+ ctx.strokeStyle = cssVar(this, "--bn-grid");
954+ ctx.fillStyle = cssVar(this, "--bn-muted");
955+ ctx.textAlign = "center";
956+ ctx.textBaseline = "top";
957+ const ms = b - a < 0.5;
958+ for (const t of niceTicks(a, b, Math.max(2, Math.floor((w - 80) / 90)))) {
959+ const x = this.xOfT(t, w);
960+ ctx.beginPath();
961+ ctx.moveTo(x, y);
962+ ctx.lineTo(x, y + 4);
963+ ctx.stroke();
964+ ctx.fillText(ms ? `${+(t * 1000).toPrecision(6)} ms` : `${+t.toPrecision(6)} s`, Math.min(x, w - 22), y + 6);
965+ }
966+ }
967+}
968+
969+class BnWaveform extends TimePlot {
970+ get defaultHeight() { return 170; }
971+ plot(ctx, w, h) {
972+ const x = this.x, fs = this.run.meta.sample_rate;
973+ const [a, b] = this.view;
974+ const i0 = Math.max(0, Math.floor(a * fs)), i1 = Math.min(x.length, Math.ceil(b * fs) + 1);
975+ let m = 0;
976+ for (let i = i0; i < i1; i++) m = Math.max(m, Math.abs(x[i]));
977+ if (m === 0) m = 1;
978+ m *= 1.08;
979+ if (Number(this.getAttribute("ymax")) > 0) m = Number(this.getAttribute("ymax"));
980+ const pw = w - MARGIN.left - MARGIN.right, ph = h - MARGIN.top - MARGIN.bottom;
981+ const yOf = v => MARGIN.top + (0.5 - v / (2 * m)) * ph;
982+ // grid and y labels
983+ ctx.strokeStyle = cssVar(this, "--bn-grid");
984+ ctx.fillStyle = cssVar(this, "--bn-muted");
985+ ctx.textAlign = "right";
986+ ctx.textBaseline = "middle";
987+ const unit = UNITS[this.quantity] || "";
988+ for (const v of niceTicks(-m, m, 4)) {
989+ const y = yOf(v);
990+ ctx.beginPath();
991+ ctx.moveTo(MARGIN.left, y);
992+ ctx.lineTo(w - MARGIN.right, y);
993+ ctx.stroke();
994+ ctx.fillText(fmtSI(v, unit, 2), MARGIN.left - 6, y);
995+ }
996+ // signal: min/max per pixel column, or a line when zoomed in
997+ ctx.strokeStyle = cssVar(this, "--bn-accent");
998+ ctx.fillStyle = cssVar(this, "--bn-accent");
999+ ctx.lineWidth = 1;
1000+ const spp = (b - a) * fs / pw;
1001+ ctx.beginPath();
1002+ if (spp > 2) {
1003+ for (let px = 0; px < pw; px++) {
1004+ const s0 = Math.max(0, Math.floor((a + (px / pw) * (b - a)) * fs));
1005+ const s1 = Math.min(x.length, Math.max(s0 + 1, Math.floor((a + ((px + 1) / pw) * (b - a)) * fs)));
1006+ let lo = Infinity, hi = -Infinity;
1007+ for (let i = s0; i < s1; i++) { if (x[i] < lo) lo = x[i]; if (x[i] > hi) hi = x[i]; }
1008+ if (lo > hi) continue;
1009+ ctx.rect(MARGIN.left + px, yOf(hi), 1, Math.max(1, yOf(lo) - yOf(hi)));
1010+ }
1011+ ctx.fill();
1012+ } else {
1013+ for (let i = i0; i < i1; i++) {
1014+ const px = this.xOfT(i / fs, w), py = yOf(x[i]);
1015+ if (i === i0) ctx.moveTo(px, py);
1016+ else ctx.lineTo(px, py);
1017+ }
1018+ ctx.stroke();
1019+ }
1020+ }
1021+ hover(mx, my, w) {
1022+ if (!this.x) return;
1023+ const t = this.tOfX(mx, w);
1024+ if (t < 0 || t > this.run.duration) { this.readout.textContent = ""; return; }
1025+ const v = this.x[Math.round(t * this.run.meta.sample_rate)] ?? 0;
1026+ this.readout.textContent = `${fmtTime(t)} · ${fmtSI(v, UNITS[this.quantity] || "")}`;
1027+ }
1028+}
1029+
1030+class BnSpectrogram extends TimePlot {
1031+ get defaultHeight() { return 260; }
1032+ toolbar() {
1033+ return `<label>scale <select data-k="scale"><option value="linear">linear</option><option value="log">log</option></select></label>
1034+ <label>range <select data-k="range">${[40, 60, 80, 100, 120].map(r => `<option value="${r}">${r} dB</option>`).join("")}</select></label>`;
1035+ }
1036+ initExtra() {
1037+ this.scale = this.getAttribute("scale") === "log" ? "log" : "linear";
1038+ this.range = Number(this.getAttribute("range")) || 80;
1039+ this.q("scale").value = this.scale;
1040+ this.q("range").value = String(this.range);
1041+ this.q("scale").onchange = e => { this.scale = e.target.value; this.redraw(); };
1042+ this.q("range").onchange = e => { this.range = Number(e.target.value); this.redraw(); };
1043+ }
1044+ get fmax() {
1045+ const nyq = this.run.meta.sample_rate / 2;
1046+ return Math.min(nyq, Number(this.getAttribute("fmax")) || Math.min(nyq, 12000));
1047+ }
1048+ get fmin() {
1049+ return Number(this.getAttribute("fmin")) || (this.scale === "log" ? 20 : 0);
1050+ }
1051+ prepare() {
1052+ const win = Number(this.getAttribute("window")) || 2048;
1053+ const hop = Number(this.getAttribute("hop")) || 256;
1054+ const x = this.x;
1055+ const nF = Math.max(1, Math.floor((x.length - win) / hop) + 1);
1056+ const nB = win / 2;
1057+ const db = new Float32Array(nF * nB);
1058+ const re = new Float64Array(win), im = new Float64Array(win), wnd = new Float64Array(win);
1059+ for (let i = 0; i < win; i++) wnd[i] = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / win);
1060+ let maxDb = -Infinity;
1061+ for (let f = 0; f < nF; f++) {
1062+ for (let i = 0; i < win; i++) { re[i] = (x[f * hop + i] ?? 0) * wnd[i]; im[i] = 0; }
1063+ fft(re, im);
1064+ for (let k = 0; k < nB; k++) {
1065+ const v = 10 * Math.log10(re[k] * re[k] + im[k] * im[k] + 1e-300);
1066+ db[f * nB + k] = v;
1067+ if (v > maxDb) maxDb = v;
1068+ }
1069+ }
1070+ this.spec = { db, nF, nB, win, hop, maxDb };
1071+ }
1072+ fOfY(y, h) {
1073+ const ph = h - MARGIN.top - MARGIN.bottom;
1074+ const u = (h - MARGIN.bottom - y) / ph;
1075+ if (this.scale === "log") return this.fmin * Math.pow(this.fmax / this.fmin, u);
1076+ return this.fmin + u * (this.fmax - this.fmin);
1077+ }
1078+ yOfF(f, h) {
1079+ const ph = h - MARGIN.top - MARGIN.bottom;
1080+ const u = this.scale === "log" ? Math.log(f / this.fmin) / Math.log(this.fmax / this.fmin) : (f - this.fmin) / (this.fmax - this.fmin);
1081+ return h - MARGIN.bottom - u * ph;
1082+ }
1083+ plot(ctx, w, h) {
1084+ const { db, nF, nB, win, hop, maxDb } = this.spec;
1085+ const fs = this.run.meta.sample_rate;
1086+ const dpr = window.devicePixelRatio || 1;
1087+ const pw = Math.round((w - MARGIN.left - MARGIN.right) * dpr), ph = Math.round((h - MARGIN.top - MARGIN.bottom) * dpr);
1088+ if (pw <= 0 || ph <= 0) return;
1089+ const img = ctx.createImageData(pw, ph);
1090+ const [a, b] = this.view;
1091+ const top = this.hasAttribute("max-db") ? Number(this.getAttribute("max-db")) : maxDb;
1092+ const lo = top - this.range;
1093+ const binOfRow = new Int32Array(ph);
1094+ for (let r = 0; r < ph; r++) {
1095+ const f = this.fOfY(MARGIN.top + (r + 0.5) / dpr, h);
1096+ binOfRow[r] = Math.max(0, Math.min(nB - 1, Math.round((f * win) / fs)));
1097+ }
1098+ for (let c = 0; c < pw; c++) {
1099+ const t = a + ((c + 0.5) / pw) * (b - a);
1100+ const fi = Math.round((t * fs - win / 2) / hop);
1101+ for (let r = 0; r < ph; r++) {
1102+ const o = 4 * (r * pw + c);
1103+ if (fi < 0 || fi >= nF) { img.data[o + 3] = 0; continue; }
1104+ const v = db[fi * nB + binOfRow[r]];
1105+ const u = Math.max(0, Math.min(255, Math.round(((v - lo) / this.range) * 255)));
1106+ const col = MAGMA[u];
1107+ img.data[o] = col[0]; img.data[o + 1] = col[1]; img.data[o + 2] = col[2]; img.data[o + 3] = 255;
1108+ }
1109+ }
1110+ ctx.save();
1111+ ctx.setTransform(1, 0, 0, 1, 0, 0);
1112+ ctx.putImageData(img, Math.round(MARGIN.left * dpr), Math.round(MARGIN.top * dpr));
1113+ ctx.restore();
1114+ // frequency axis
1115+ ctx.fillStyle = cssVar(this, "--bn-muted");
1116+ ctx.strokeStyle = cssVar(this, "--bn-grid");
1117+ ctx.textAlign = "right";
1118+ ctx.textBaseline = "middle";
1119+ let ticks;
1120+ if (this.scale === "log") {
1121+ ticks = [];
1122+ for (let d = Math.pow(10, Math.floor(Math.log10(this.fmin))); d <= this.fmax; d *= 10) {
1123+ for (const m of [1, 2, 5]) if (m * d >= this.fmin && m * d <= this.fmax) ticks.push(m * d);
1124+ }
1125+ } else ticks = niceTicks(this.fmin, this.fmax, Math.max(2, Math.floor((h - 40) / 40)));
1126+ for (const f of ticks) {
1127+ const y = this.yOfF(f, h);
1128+ ctx.beginPath();
1129+ ctx.moveTo(MARGIN.left - 4, y);
1130+ ctx.lineTo(MARGIN.left, y);
1131+ ctx.stroke();
1132+ ctx.fillText(f >= 1000 ? `${+(f / 1000).toPrecision(4)} kHz` : `${+f.toPrecision(4)} Hz`, MARGIN.left - 6, y);
1133+ }
1134+ }
1135+ hover(mx, my, w) {
1136+ if (!this.spec) return;
1137+ const t = this.tOfX(mx, w);
1138+ const f = this.fOfY(my, this.h || this.height);
1139+ if (t < 0 || t > this.run.duration || f < this.fmin || f > this.fmax) { this.readout.textContent = ""; return; }
1140+ this.readout.textContent = `${fmtTime(t)} · ${f >= 1000 ? (f / 1000).toFixed(3) + " kHz" : f.toFixed(1) + " Hz"}`;
1141+ }
1142+}
1143+
1144+// ---- <bn-controls> and <bn-info> ------------------------------------------------------
1145+
1146+class BnControls extends BnChild {
1147+ init() {
1148+ const run = this.run;
1149+ const panel = document.createElement("div");
1150+ panel.className = "bn-panel bn-bar";
1151+ panel.style.marginBottom = "0";
1152+ if (!run.meta) {
1153+ panel.innerHTML = `<span class="bn-muted">Model only: run it to hear and animate it. Click a bead to see its index.</span><span data-k="sel"></span>`;
1154+ this.replaceChildren(panel);
1155+ this.sel = panel.querySelector("[data-k=sel]");
1156+ this.onChange({ listener: run.state.listener });
1157+ return;
1158+ }
1159+ panel.innerHTML = `
1160+ <label>listener</label>
1161+ <select data-k="mode"><option value="sum">sum of all beads</option><option value="bead">one bead</option></select>
1162+ <input data-k="bead" type="number" min="0" max="${run.n - 1}" step="1" title="Bead index (or click a bead in the 3D view)">
1163+ <label>quantity</label>
1164+ <select data-k="quantity">${run.quantities.map(q => `<option value="${q}">${q}</option>`).join("")}</select>
1165+ <button data-k="play">▶ play</button>
1166+ <button data-k="wav" title="Download the signal as a WAV file (normalized)">⬇ wav</button>
1167+ <span class="bn-muted">click a bead in the 3D view to listen there</span>`;
1168+ this.replaceChildren(panel);
1169+ const q = k => panel.querySelector(`[data-k=${k}]`);
1170+ this.ui = { mode: q("mode"), bead: q("bead"), quantity: q("quantity"), play: q("play") };
1171+ q("mode").onchange = e => {
1172+ if (e.target.value === "sum") run.set({ listener: "sum" }, this);
1173+ else run.set({ listener: Number(this.ui.bead.value) || 0 }, this);
1174+ };
1175+ q("bead").onchange = e => {
1176+ const b = Math.max(0, Math.min(run.n - 1, Math.round(Number(e.target.value))));
1177+ run.set({ listener: b }, this);
1178+ };
1179+ q("quantity").onchange = e => run.set({ quantity: e.target.value }, this);
1180+ q("play").onclick = () => (run.state.playing ? run.stop() : run.play());
1181+ q("wav").onclick = async () => {
1182+ const x = await run.signal();
1183+ const a = document.createElement("a");
1184+ a.href = URL.createObjectURL(wavBlob(x, run.meta.sample_rate, Number(run.getAttribute("full-scale")) || 0));
1185+ const name = (run.model.name || "run") + `-${run.state.listener === "sum" ? "sum" : "bead" + run.state.listener}-${run.state.quantity}.wav`;
1186+ a.download = name;
1187+ a.click();
1188+ setTimeout(() => URL.revokeObjectURL(a.href), 1000);
1189+ };
1190+ this.onChange({ listener: run.state.listener, quantity: run.state.quantity });
1191+ }
1192+ onChange(patch) {
1193+ if (this.sel && "listener" in patch) {
1194+ const L = patch.listener;
1195+ this.sel.textContent = L === "sum" ? "" : `selected: bead ${L}`;
1196+ }
1197+ if (!this.ui) return;
1198+ if ("listener" in patch) {
1199+ const L = patch.listener;
1200+ this.ui.mode.value = L === "sum" ? "sum" : "bead";
1201+ if (L !== "sum") this.ui.bead.value = String(L);
1202+ this.ui.bead.disabled = L === "sum";
1203+ }
1204+ if ("quantity" in patch) this.ui.quantity.value = patch.quantity;
1205+ if ("playing" in patch) this.ui.play.textContent = patch.playing ? "■ stop" : "▶ play";
1206+ }
1207+}
1208+
1209+class BnInfo extends BnChild {
1210+ init() {
1211+ const run = this.run, a = run.attrs, m = run.model, r = run.meta;
1212+ const rows = [];
1213+ const add = (k, v) => rows.push(`<tr><td>${k}</td><td>${v}</td></tr>`);
1214+ if (m.name) add("model", `<b>${m.name}</b>`);
1215+ if (m.notes) add("notes", m.notes);
1216+ let nPinned = 0;
1217+ for (const p of run.pinned) nPinned += p;
1218+ add("beads", `${a.n} (${nPinned} pinned)`);
1219+ add("strikes", (m.hits || []).map(h => `${h.duration > 0 ? `force pulse ${fmtSI(Math.hypot(...h.force), "N")} for ${fmtTime(h.duration)}` : `impulse ${fmtSI(Math.hypot(...h.velocity), "m/s")}`} on ${h.beads.length} bead${h.beads.length > 1 ? "s" : ""} at ${fmtTime(h.t)}`).join("<br>") || "none");
1220+ if (r) {
1221+ add("run", `${fmtTime(r.n_samples / r.sample_rate)} at ${r.sample_rate} Hz; dt = ${r.dt.toExponential(3)} s (${r.substeps} steps per sample, ${m.method})`);
1222+ add("highest frequency", `${Math.round(r.f_max)} Hz (linearized at rest)`);
1223+ add("accuracy", `energy drift ${r.energy_drift.toExponential(1)}; frequency error ${r.freq_errors.map(e => `${e.cents.toFixed(2)} cents at ${e.hz / 1000} kHz`).slice(0, 3).join(", ")}`);
1224+ add("recorded", `${r.quantities.join(", ")} of every bead along [${r.signal_dir.map(v => +v.toFixed(3)).join(", ")}]; ${r.n_frames} frames at ${Math.round(r.frame_rate)} Hz${r.n_modes ? `; ${r.n_modes} ${r.mode_kind} modes` : ""}`);
1225+ add("cost", `${r.elapsed_s.toFixed(1)} s (${r.realtime_factor.toFixed(1)}× real time)`);
1226+ if (r.aborted) add("aborted", `<span class="bn-warn">${r.aborted}</span>`);
1227+ } else if (a.preview) {
1228+ const p = a.preview;
1229+ add("planned run", `${fmtTime(m.duration)} at ${m.sample_rate} Hz; dt = ${p.dt.toExponential(3)} s (${p.substeps} steps per sample); highest frequency ${Math.round(p.omega_max / (2 * Math.PI))} Hz`);
1230+ }
1231+ for (const w of a.warnings || []) add("warning", `<span class="bn-warn">${w}</span>`);
1232+ this.innerHTML = `<div class="bn-panel bn-info"><table>${rows.join("")}</table></div>`;
1233+ }
1234+}
1235+
1236+// ---- <bn-energy>: energy and dissipated energy over time ---------------------------------
1237+
1238+class BnEnergy extends BnChild {
1239+ get defaultHeight() { return 160; }
1240+ async init() {
1241+ this.innerHTML = `<div class="bn-panel"><div class="bn-bar"><span class="bn-title">energy</span>
1242+ <span class="bn-muted">mechanical energy (solid) and energy removed by damping (dashed), log scale</span></div><canvas class="bn-canvas"></canvas></div>`;
1243+ this.canvas = this.querySelector("canvas");
1244+ if (!this.run.meta) return;
1245+ const open = name => ZArray.open(this.run.base, name).then(a => a.readAll());
1246+ [this.t, this.e, this.d] = await Promise.all([open("frames/t"), open("frames/energy"), open("frames/dissipated")]);
1247+ this.redraw();
1248+ }
1249+ redraw() {
1250+ if (!this.t) return;
1251+ const { ctx, w, h } = setupCanvas(this.canvas, this.height);
1252+ const { t, e, d } = this;
1253+ let hi = 0;
1254+ for (let i = 0; i < e.length; i++) hi = Math.max(hi, e[i] + d[i]);
1255+ if (!(hi > 0)) return;
1256+ const lo = hi * 1e-6;
1257+ const T = t[t.length - 1] || 1;
1258+ const pw = w - MARGIN.left - MARGIN.right, ph = h - MARGIN.top - MARGIN.bottom;
1259+ const X = v => MARGIN.left + (v / T) * pw;
1260+ const Y = v => MARGIN.top + (1 - Math.log10(Math.max(v, lo) / lo) / 6) * ph;
1261+ ctx.font = "11px system-ui, sans-serif";
1262+ ctx.fillStyle = cssVar(this, "--bn-muted");
1263+ ctx.strokeStyle = cssVar(this, "--bn-grid");
1264+ ctx.textAlign = "right";
1265+ ctx.textBaseline = "middle";
1266+ for (let k = 0; k <= 6; k += 2) {
1267+ const v = lo * 10 ** k;
1268+ ctx.beginPath(); ctx.moveTo(MARGIN.left, Y(v)); ctx.lineTo(w - MARGIN.right, Y(v)); ctx.stroke();
1269+ ctx.fillText(fmtSI(v, "J", 2), MARGIN.left - 6, Y(v));
1270+ }
1271+ ctx.textAlign = "center";
1272+ ctx.textBaseline = "top";
1273+ for (const v of niceTicks(0, T, 6)) ctx.fillText(`${+v.toPrecision(6)} s`, X(v), h - MARGIN.bottom + 6);
1274+ const line = (arr, dash) => {
1275+ ctx.setLineDash(dash);
1276+ ctx.strokeStyle = cssVar(this, "--bn-accent");
1277+ ctx.lineWidth = 1.5;
1278+ ctx.beginPath();
1279+ for (let i = 0; i < arr.length; i++) (i ? ctx.lineTo : ctx.moveTo).call(ctx, X(t[i]), Y(arr[i]));
1280+ ctx.stroke();
1281+ ctx.setLineDash([]);
1282+ };
1283+ line(e, []);
1284+ line(d, [4, 3]);
1285+ }
1286+}
1287+
1288+customElements.define("bn-run", BnRun);
1289+customElements.define("bn-model", BnModel);
1290+customElements.define("bn-animation", BnAnimation);
1291+customElements.define("bn-waveform", BnWaveform);
1292+customElements.define("bn-spectrogram", BnSpectrogram);
1293+customElements.define("bn-controls", BnControls);
1294+customElements.define("bn-info", BnInfo);
1295+customElements.define("bn-energy", BnEnergy);
1296+
1297+export { BnRun, ZArray };
beadnet/static/view.htmladded+53−0View file
@@ -0,0 +1,53 @@
1+<!doctype html>
2+<html lang="en">
3+<head>
4+<meta charset="utf-8">
5+<meta name="viewport" content="width=device-width, initial-scale=1">
6+<title>beadnet viewer</title>
7+<style>
8+body { margin: 0; background: var(--bn-bg, #fff); color: var(--bn-fg, #1d1d1b);
9+ font: 14px/1.5 system-ui, -apple-system, "Segoe UI", sans-serif; }
10+main { max-width: 1100px; margin: 0 auto; padding: 16px; }
11+h1 { font-size: 22px; margin: 8px 0 4px; }
12+h2 { font-size: 17px; margin: 28px 0 4px; }
13+a { color: var(--bn-accent, #2563a8); }
14+</style>
15+<script type="module" src="beadnet.js"></script>
16+</head>
17+<body>
18+<main>
19+<h1 id="title">beadnet viewer</h1>
20+<p><a href="/">index</a> · <span id="srcs"></span></p>
21+<div id="runs"></div>
22+</main>
23+<script>
24+// Default layout for each ?src=... (a run or saved model directory, as a URL path).
25+const srcs = new URLSearchParams(location.search).getAll("src");
26+document.getElementById("srcs").textContent = srcs.join(", ") || "add ?src=/path/to/run to the URL";
27+const root = document.getElementById("runs");
28+srcs.forEach(async (src, k) => {
29+ const sec = document.createElement("section");
30+ root.appendChild(sec);
31+ let kind = "model", name = src.replace(/\/+$/, "").split("/").pop();
32+ try {
33+ const a = (await (await fetch(`${src.replace(/\/+$/, "")}/.zattrs`, { cache: "no-store" })).json()).beadnet;
34+ kind = a.kind === "run" ? "run" : "model";
35+ name = (a.model && a.model.name) || name;
36+ } catch (e) { /* bn-run reports the error */ }
37+ if (srcs.length === 1) document.getElementById("title").textContent = name;
38+ else {
39+ const h = document.createElement("h2");
40+ h.textContent = name;
41+ sec.appendChild(h);
42+ }
43+ const run = document.createElement("bn-run");
44+ run.setAttribute("src", src);
45+ const parts = kind === "run"
46+ ? ["bn-controls", "bn-animation", "bn-waveform", "bn-spectrogram", "bn-energy", "bn-info"]
47+ : ["bn-controls", "bn-model", "bn-info"];
48+ for (const p of parts) run.appendChild(document.createElement(p));
49+ sec.appendChild(run);
50+});
51+</script>
52+</body>
53+</html>
beadnet/store.pyadded+182−0View file
@@ -0,0 +1,182 @@
1+"""A minimal Zarr v2 directory store: gzip-compressed chunks, C order.
2+
3+Written without a zarr dependency; the layout is standard, so zarr-python
4+reads it, and the JavaScript components fetch chunks directly over HTTP.
5+"""
6+
7+from __future__ import annotations
8+
9+import gzip
10+import json
11+import os
12+import shutil
13+from concurrent.futures import ThreadPoolExecutor
14+from typing import Optional, Sequence, Tuple
15+
16+import numpy as np
17+
18+_DTYPES = {
19+ np.dtype("float32"): "<f4",
20+ np.dtype("float64"): "<f8",
21+ np.dtype("int32"): "<i4",
22+ np.dtype("int64"): "<i8",
23+ np.dtype("uint8"): "|u1",
24+}
25+
26+
27+def _json_write(path: str, obj) -> None:
28+ with open(path, "w") as f:
29+ json.dump(obj, f, indent=1)
30+
31+
32+class Store:
33+ """A directory holding Zarr v2 groups and arrays."""
34+
35+ def __init__(self, path: str, mode: str = "r"):
36+ self.path = os.path.abspath(path)
37+ if mode == "w":
38+ os.makedirs(self.path, exist_ok=True)
39+ if not os.path.exists(os.path.join(self.path, ".zgroup")):
40+ _json_write(os.path.join(self.path, ".zgroup"), {"zarr_format": 2})
41+ elif not os.path.exists(os.path.join(self.path, ".zgroup")):
42+ raise FileNotFoundError(f"{path} is not a beadnet store (no .zgroup)")
43+ self._pool: Optional[ThreadPoolExecutor] = None
44+
45+ # ---- groups and attributes ------------------------------------------------
46+ def group(self, name: str) -> None:
47+ p = os.path.join(self.path, name)
48+ os.makedirs(p, exist_ok=True)
49+ _json_write(os.path.join(p, ".zgroup"), {"zarr_format": 2})
50+
51+ def remove(self, name: str) -> None:
52+ p = os.path.join(self.path, name)
53+ if os.path.isdir(p):
54+ shutil.rmtree(p)
55+
56+ def exists(self, name: str) -> bool:
57+ return os.path.exists(os.path.join(self.path, name, ".zarray")) or \
58+ os.path.exists(os.path.join(self.path, name, ".zgroup"))
59+
60+ def attrs(self, name: str = "") -> dict:
61+ p = os.path.join(self.path, name, ".zattrs")
62+ if not os.path.exists(p):
63+ return {}
64+ with open(p) as f:
65+ return json.load(f)
66+
67+ def set_attrs(self, attrs: dict, name: str = "") -> None:
68+ _json_write(os.path.join(self.path, name, ".zattrs"), attrs)
69+
70+ # ---- arrays ---------------------------------------------------------------
71+ def create(self, name: str, shape: Sequence[int], dtype, chunks: Sequence[int], level: int = 4) -> None:
72+ dt = np.dtype(dtype)
73+ p = os.path.join(self.path, name)
74+ if os.path.isdir(p):
75+ shutil.rmtree(p)
76+ os.makedirs(p)
77+ meta = {
78+ "zarr_format": 2,
79+ "shape": [int(s) for s in shape],
80+ "chunks": [int(max(1, c)) for c in chunks],
81+ "dtype": _DTYPES[dt],
82+ "compressor": {"id": "gzip", "level": level},
83+ "fill_value": 0,
84+ "order": "C",
85+ "filters": None,
86+ "dimension_separator": ".",
87+ }
88+ _json_write(os.path.join(p, ".zarray"), meta)
89+
90+ def meta(self, name: str) -> dict:
91+ with open(os.path.join(self.path, name, ".zarray")) as f:
92+ return json.load(f)
93+
94+ def write_chunk(self, name: str, idx: Tuple[int, ...], data: np.ndarray, level: int = 4) -> None:
95+ """Write one chunk; data may be smaller than the chunk at the array's edge (it is padded)."""
96+ m = self.meta(name)
97+ dt = np.dtype(m["dtype"])
98+ chunks = tuple(m["chunks"])
99+ a = np.asarray(data, dtype=dt)
100+ if a.ndim < len(chunks):
101+ a = a.reshape((1,) * (len(chunks) - a.ndim) + a.shape)
102+ if a.shape != chunks:
103+ full = np.zeros(chunks, dtype=dt)
104+ full[tuple(slice(0, s) for s in a.shape)] = a
105+ a = full
106+ key = ".".join(str(i) for i in idx) if idx else "0"
107+ with open(os.path.join(self.path, name, key), "wb") as f:
108+ f.write(gzip.compress(np.ascontiguousarray(a).tobytes(), compresslevel=level, mtime=0))
109+
110+ def write_chunks(self, name: str, items) -> None:
111+ """Write many (idx, data) chunks in parallel threads (zlib releases the GIL)."""
112+ if self._pool is None:
113+ self._pool = ThreadPoolExecutor(max_workers=min(8, os.cpu_count() or 1))
114+ list(self._pool.map(lambda it: self.write_chunk(name, it[0], it[1]), items))
115+
116+ def write(self, name: str, data, chunks: Optional[Sequence[int]] = None) -> None:
117+ """Write a whole array (by default as a single chunk)."""
118+ a = np.asarray(data)
119+ if a.dtype == np.bool_:
120+ a = a.astype(np.uint8)
121+ if a.dtype not in _DTYPES:
122+ a = a.astype(np.float64)
123+ if chunks is None:
124+ chunks = a.shape if a.ndim else (1,)
125+ if a.ndim == 0:
126+ a = a.reshape(1)
127+ self.create(name, a.shape, a.dtype, [max(1, c) for c in chunks])
128+ if a.size == 0:
129+ return
130+ grid = [int(np.ceil(s / c)) for s, c in zip(a.shape, chunks)]
131+ items = []
132+ for idx in np.ndindex(*grid):
133+ sl = tuple(slice(i * c, (i + 1) * c) for i, c in zip(idx, chunks))
134+ items.append((idx, a[sl]))
135+ self.write_chunks(name, items)
136+
137+ def read(self, name: str, sel: Optional[Tuple] = None) -> np.ndarray:
138+ """Read an array, or a region of it given as a tuple of slices/ints (reads only the needed chunks)."""
139+ m = self.meta(name)
140+ shape = tuple(m["shape"])
141+ chunks = tuple(m["chunks"])
142+ dt = np.dtype(m["dtype"])
143+ if sel is None:
144+ sel = tuple(slice(None) for _ in shape)
145+ if not isinstance(sel, tuple):
146+ sel = (sel,)
147+ sel = sel + tuple(slice(None) for _ in range(len(shape) - len(sel)))
148+ ranges, squeeze = [], []
149+ for s, n in zip(sel, shape):
150+ if isinstance(s, (int, np.integer)):
151+ s = int(s) + (n if s < 0 else 0)
152+ ranges.append((s, s + 1))
153+ squeeze.append(True)
154+ else:
155+ a, b, step = s.indices(n)
156+ if step != 1:
157+ raise ValueError("Store.read: steps other than 1 are not supported")
158+ ranges.append((a, max(a, b)))
159+ squeeze.append(False)
160+ out = np.full(tuple(b - a for a, b in ranges), m.get("fill_value") or 0, dtype=dt)
161+ grids = [range(a // c, (b - 1) // c + 1) if b > a else range(0) for (a, b), c in zip(ranges, chunks)]
162+ for idx in np.ndindex(*[len(g) for g in grids]):
163+ cidx = tuple(g[i] for g, i in zip(grids, idx))
164+ key = ".".join(str(i) for i in cidx) if cidx else "0"
165+ p = os.path.join(self.path, name, key)
166+ if not os.path.exists(p):
167+ continue
168+ with open(p, "rb") as f:
169+ block = np.frombuffer(gzip.decompress(f.read()), dtype=dt).reshape(chunks)
170+ src, dst = [], []
171+ for ci, c, (a, b) in zip(cidx, chunks, ranges):
172+ lo = max(a, ci * c)
173+ hi = min(b, (ci + 1) * c)
174+ src.append(slice(lo - ci * c, hi - ci * c))
175+ dst.append(slice(lo - a, hi - a))
176+ out[tuple(dst)] = block[tuple(src)]
177+ return out.reshape(tuple(n for n, sq in zip(out.shape, squeeze) if not sq))
178+
179+ def close(self) -> None:
180+ if self._pool is not None:
181+ self._pool.shutdown()
182+ self._pool = None
pyproject.tomladded+23−0View file
@@ -0,0 +1,23 @@
1+[build-system]
2+requires = ["setuptools>=61"]
3+build-backend = "setuptools.build_meta"
4+
5+[project]
6+name = "beadnet"
7+version = "0.1.0"
8+description = "Idealized percussion: networks of beads and springs, integrated accurately, with HTML components for listening and viewing"
9+readme = "README.md"
10+requires-python = ">=3.9"
11+dependencies = ["numpy", "numba", "scipy"]
12+
13+[project.optional-dependencies]
14+test = ["pytest"]
15+
16+[project.scripts]
17+beadnet = "beadnet.cli:main"
18+
19+[tool.setuptools]
20+packages = ["beadnet"]
21+
22+[tool.setuptools.package-data]
23+beadnet = ["static/*", "AGENT_GUIDE.md"]
skills/beadnet/SKILL.mdadded+12−0View file
@@ -0,0 +1,12 @@
1+---
2+name: beadnet
3+description: Build, run and view bead-and-spring percussion models (drums, strings, plates, cymbals, bars) with the beadnet Python package, and write HTML pages with its waveform, spectrogram and animation components. Use when the user asks to set up, simulate, listen to or visualize a bead network or idealized percussion model.
4+---
5+
6+# beadnet
7+
8+1. Run `beadnet guide` (or read `beadnet/AGENT_GUIDE.md` in the beadnet repository) and follow it. It covers the model, the helpers, cost estimates, the store layout and the HTML components.
9+2. Work in the beadnet workspace (`work/` in the repository unless the user names another): scripts in `work/scripts/`, results in `work/runs/`, saved models in `work/models/`, pages in `work/pages/`.
10+3. Preview a model with `bn.save_model` and check its warnings before a long run. Run anything longer than about a minute in the background.
11+4. Serve the workspace with `beadnet serve work` (http://127.0.0.1:8790/) and give the user the URL of the page or viewer.
12+5. Report numbers: fundamental, decay, energy drift, real-time factor, warnings.
tests/fixtures/ts_reference.jsonadded+1−0View file
@@ -0,0 +1 @@
1+{"string_nonlin":{"n":22,"pos0":[0,0,0,0.009523809523809525,0,0,0.01904761904761905,0,0,0.028571428571428574,0,0,0.0380952380952381,0,0,0.047619047619047616,0,0,0.05714285714285715,0,0,0.06666666666666668,0,0,0.0761904761904762,0,0,0.08571428571428572,0,0,0.09523809523809523,0,0,0.10476190476190476,0,0,0.1142857142857143,0,0,0.12380952380952381,0,0,0.13333333333333336,0,0,0.14285714285714285,0,0,0.1523809523809524,0,0,0.1619047619047619,0,0,0.17142857142857143,0,0,0.18095238095238098,0,0,0.19047619047619047,0,0,0.2,0,0],"mass":[0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002,0.0002],"pinned":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],"springs":[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],[60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000,60000],[0.009190476190476192,0.009190476190476192,0.009190476190476192,0.009190476190476192,0.009190476190476185,0.009190476190476199,0.009190476190476199,0.009190476190476185,0.009190476190476185,0.009190476190476185,0.009190476190476199,0.009190476190476199,0.009190476190476185,0.009190476190476212,0.009190476190476157,0.009190476190476212,0.009190476190476185,0.009190476190476185,0.009190476190476212,0.009190476190476157,0.009190476190476212],[1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000,1000000000]],"bends":[[],[],[],[],[]],"hinges":[[],[],[],[],[],[]],"dashpots":[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],[0.00019173384340577087,0.00019173384340577087,0.00019173384340577087,0.00019173384340577087,0.00019173384340577103,0.00019173384340577076,0.00019173384340577076,0.00019173384340577103,0.00019173384340577103,0.00019173384340577103,0.00019173384340577076,0.00019173384340577076,0.00019173384340577103,0.00019173384340577046,0.00019173384340577158,0.00019173384340577046,0.00019173384340577103,0.00019173384340577103,0.00019173384340577046,0.00019173384340577158,0.00019173384340577046],[0.005306627760467147,0.005306627760467147,0.005306627760467147,0.005306627760467147,0.005306627760467146,0.005306627760467147,0.005306627760467147,0.005306627760467146,0.005306627760467146,0.005306627760467146,0.005306627760467147,0.005306627760467147,0.005306627760467146,0.005306627760467147,0.005306627760467145,0.005306627760467147,0.005306627760467146,0.005306627760467146,0.005306627760467147,0.005306627760467145,0.005306627760467147]],"friction":[0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294,0.0027343197979304294],"hits":[{"t":0.001,"beads":[4,5],"velocity":[0,0,0],"force":[0.3,0.5,4],"duration":0.001},{"t":0.012,"beads":[14],"velocity":[0,1,3],"force":[0,0,0],"duration":0}],"duration":0.04,"sampleRate":48000,"dtGiven":0.0000034722222222222224,"method":"yoshida4","listen":8,"dt":0.0000034722222222222224,"energyDrift":1.3560102635845782e-9,"audio":{"acceleration":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7.748804573456925e-16,2.854918523809147e-10,1.056223268847134e-7,0.0000027123437575937714,0.00002687726191652473,0.00015879709098953754,0.000676615396514535,0.0023001262452453375,0.006625448819249868,0.01681058667600155,0.038579270243644714,0.08160726726055145,0.16134798526763916,0.30134376883506775,0.5360580086708069,0.9142528176307678,1.5029269456863403,2.39182186126709,3.698496103286743,5.573965072631836,8.208910942077637,11.840486526489258,16.75975799560547,23.31989097595215,31.94510841369629,43.14046859741211,57.50224304199219,75.72846984863281,98.6289291381836,127.13346862792969,162.2971649169922,205.30081176757812,257.44476318359375,320.1340637207031,394.8530578613281,483.1273193359375,586.4720458984375,706.3275756835938,843.9835205078125,1000.4981079101562,1176.6190185546875,1372.7156982421875,1588.7337646484375,1824.1805419921875,2078.147705078125,2349.375244140625,2636.352783203125,2937.447509765625,3251.0478515625,3575.69482421875,3910.18212890625,4253.591796875,4605.24853515625,4964.580078125,5330.88134765625,5703.0146484375,6079.0732421875,6456.06982421875,6829.68505859375,7194.1123046875,7542.0205078125,7864.6259765625,8151.88427734375,8392.8046875,8575.90234375,8689.8115234375,8724.037109375,8669.8056640625,8520.884765625,8274.2529296875,7930.44873046875,7493.53662109375,6970.673828125,6371.3701171875,5706.59716796875,4987.890625,4226.55908203125,3433.039306640625,2616.370849609375,1783.7808837890625,940.3692016601562,88.9689712524414,-769.7297973632812,-1636.7115478515625,-2513.821044921875,-3402.707763671875,-4303.72607421875,-5215.01953125,-6131.97998046875,-7047.15673828125,-7950.576171875,-8830.3330078125,-9673.283203125,-10465.7080078125,-11193.8828125,-11844.560546875,-12405.40625,-12865.4091796875,-13215.263671875,-13447.6787109375,-13557.5625,-13542.0625,-13400.4541015625,-13133.955078125,-12745.50390625,-12239.5654296875,-11621.990234375,-10899.927734375,-10081.7978515625,-9177.29296875,-8197.435546875,-7154.64013671875,-6062.77197265625,-4937.11767578125,-3794.2158203125,-2651.483642578125,-1526.6392822265625,-436.9625244140625,601.5203247070312,1574.8094482421875,2471.564208984375,3283.519287109375,4005.646728515625,4636.05859375,5175.66748046875,5627.6376953125,5996.6826171875,6288.26953125,6507.82666015625,6660.02685546875,6748.24169921875,6774.2099609375,6737.95068359375,6637.916015625,6471.3515625,6234.84814453125,5925.02734375,5539.32373046875,5076.7919921875,4538.8447265625,3929.828125,3257.327392578125,2532.153564453125,1767.98388671875,980.7053833007812,187.53961181640625,-593.9454345703125,-1346.8289794921875,-2055.743896484375,-2707.61865234375,-3292.197265625,-3802.29638671875,-4233.78857421875,-4585.32177734375,-4857.8388671875,-5053.96923828125,-5177.40185546875,-5232.32373046875,-5222.99755859375,-5153.5078125,-5027.68017578125,-4849.15087890625,-4621.5546875,-4348.7890625,-4035.314453125,-3686.43408203125,-3308.50146484375,-2909.002685546875,-2496.483642578125,-2080.31689453125,-1670.34814453125,-1276.47705078125,-908.2468872070312,-574.4988403320312,-283.1230773925781,-40.9053840637207,146.55532836914062,274.89312744140625,341.01495361328125,343.149658203125,280.90594482421875,155.3275604248047,-31.070205688476562,-274.2977600097656,-568.9324340820312,-908.2119750976562,-1284.1856689453125,-1687.9322509765625,-2109.84765625,-2540.00439453125,-2968.5712890625,-3386.26025390625,-3784.759765625,-4157.09375,-4497.859375,-4803.3017578125,-5071.22998046875,-5300.78955078125,-5492.146484375,-5646.12255859375,-5763.8271484375,-5846.296875,-5894.154296875,-5907.287109375,-5884.58544921875,-5823.78125,-5721.4599609375,-5573.29443359375,-5374.5029296875,-5120.48486328125,-4807.5146484375,-4433.35986328125,-3997.699462890625,-3502.2841796875,-2950.838134765625,-2348.780517578125,-1702.8643798828125,-1020.8204956054688,-311.0557861328125,417.59197998046875,1156.06884765625,1895.31396484375,2626.472412109375,3341.0908203125,4031.270263671875,4689.7548828125,5309.96435546875,5886.00341796875,6412.68603515625,6885.6083984375,7301.26806640625,7657.20703125,7952.12841796875,8185.95263671875,8359.7958984375,8475.875,8537.36328125,8548.2294921875,8513.0556640625,8436.857421875,8324.8837890625,8182.3916015625,8014.416015625,7825.54345703125,7619.71728515625,7400.09228515625,7168.94384765625,6927.6328125,6676.60693359375,6415.45263671875,6142.98095703125,5857.37646484375,5556.400390625,5237.650390625,4898.84619140625,4538.109375,4154.19091796875,3746.62548828125,3315.79736328125,2862.926025390625,2389.99560546875,1899.6488037109375,1395.0638427734375,879.82275390625,357.7749328613281,-167.104248046875,-690.855224609375,-1209.6689453125,-1720.0042724609375,-2218.6767578125,-2702.908447265625,-3170.329345703125,-3618.92041015625,-4046.89501953125,-4452.51708984375,-4833.8798828125,-5188.671875,-5513.9765625,-5806.15478515625,-6060.84130859375,-6273.06787109375,-6437.5029296875,-6548.765625,-6601.775390625,-6592.09619140625,-6516.234375,-6371.88427734375,-6158.09814453125,-5875.3798828125,-5525.68505859375,-5112.32958984375,-4639.8125,-4113.57958984375,-3539.76416015625,-2924.95947265625,-2276.06005859375,-1600.19970703125,-904.7786865234375,-197.5565185546875,513.2356567382812,1218.809326171875,1909.8021240234375,2576.36181640625,3208.34716796875,3795.648681640625,4328.61572265625,4798.55908203125,5198.27490234375,5522.5244140625,5768.3955078125,5935.478515625,6025.82275390625,6043.65185546875,5994.8857421875,5886.51513671875,5725.919921875,5520.2060546875,5275.6435546875,4997.25732421875,4688.6064453125,4351.7578125,3987.44970703125,3595.410888671875,3174.800537109375,2724.71533203125,2244.718994140625,1735.3427734375,1198.510986328125,637.849609375,58.83998489379883,-531.2035522460938,-1123.3416748046875,-1707.3856201171875,-2272.39892578125,-2807.26318359375,-3301.238037109375,-3744.4521484375,-4128.28076171875,-4445.59375,-4690.88427734375,-4860.2998046875,-4951.6123046875,-4964.15185546875,-4898.73046875,-4757.56787109375,-4544.23046875,-4263.5859375,-3921.765869140625,-3526.117431640625,-3085.117919921875,-2608.220947265625,-2105.614990234375,-1587.889404296875,-1065.6287841796875,-548.9783935546875,-47.225730895996094,431.5522155761719,880.745849609375,1295.355712890625,1672.0174560546875,2008.9122314453125,2305.571533203125,2562.58935546875,2781.264404296875,2963.205810546875,3109.944580078125,3222.59619140625,3301.61279296875,3346.642822265625,3356.508544921875,3329.287353515625,3262.4833984375,3153.28076171875,2998.86181640625,2796.786865234375,2545.40771484375,2244.2861328125,1894.56298828125,1499.225830078125,1063.2274169921875,593.4313354492188,98.38652038574219,-412.0384826660156,-927.1162109375,-1435.7615966796875,-1927.0257568359375,-2390.5390625,-2816.875732421875,-3197.817626953125,-3526.509033203125,-3797.512451171875,-4006.77734375,-4151.56396484375,-4230.34765625,-4242.740234375,-4189.44287109375,-4072.22900390625,-3893.9462890625,-3658.512939453125,-3370.89208984375,-3037.031005859375,-2663.759033203125,-2258.644775390625,-1829.8197021484375,-1385.7684326171875,-935.1001586914062,-486.31402587890625,-47.57805633544922,373.4542541503906,769.7703857421875,1135.0576171875,1463.6962890625,1750.70068359375,1991.63330078125,2182.51806640625,2319.78173828125,2400.24951171875,2421.211181640625,2380.572265625,2277.0810546875,2110.6142578125,1882.472900390625,1595.63525390625,1254.900634765625,866.8751220703125,439.7740173339844,-16.95049285888672,-493.1139221191406,-978.372802734375,-1462.796875,-1937.378662109375,-2394.435791015625,-2827.8818359375,-3233.354736328125,-3608.1982421875,-3951.304931640625,-4262.82373046875,-4543.7587890625,-4795.4873046875,-5019.251953125,-5215.68603515625,-5384.435546875,-5523.9326171875,-5631.34814453125,-5702.7353515625,-5733.33984375,-5718.03271484375,-5651.8203125,-5530.36181640625,-5350.45556640625,-5110.44775390625,-4810.52978515625,-4452.91796875,-4041.896240234375,-3583.730224609375,-3086.465576171875,-2559.620849609375,-2013.8060302734375,-1460.287109375,-910.5264282226562,-375.7191162109375,133.65451049804688,608.2442016601562,1040.1982421875,1423.467041015625,1754.0225830078125,2029.9725341796875,2251.552490234375,2420.98779296875,2542.235107421875,2620.6240234375,2662.4384765625,2674.47998046875,2663.65673828125,2636.6259765625,2599.514892578125,2557.71826171875,2515.775146484375,2477.31494140625,2445.0634765625,2420.906005859375,2405.99951171875,2400.9228515625,2405.857177734375,2420.7734375,2445.61376953125,2480.44384765625,2525.56494140625,2581.570068359375,2649.3408203125,2729.97607421875,2824.656494140625,2934.45068359375,3060.083740234375,3201.6982421875,3358.64697265625,3529.35791015625,3711.306640625,3901.11083984375,4094.73681640625,4287.79150390625,4475.85302734375,4654.79150390625,4821.0361328125,4971.76513671875,5104.994140625,5219.57373046875,5315.0888671875,5391.67431640625,5449.7626953125,5489.78369140625,5511.84521484375,5515.43896484375,5499.21142578125,5460.8310546875,5396.9794921875,5303.47509765625,5175.50927734375,5007.9853515625,4795.923828125,4534.9111328125,4221.55908203125,3853.939208984375,3431.959716796875,2957.633544921875,2435.207275390625,1871.1177978515625,1273.7803955078125,653.2244873046875,20.62906837463379,-612.1865234375,-1233.26025390625,-1830.934326171875,-2394.2314453125,-2913.164794921875,-3378.99267578125,-3784.4384765625,-4123.8916015625,-4393.5966796875,-4591.8193359375,-4718.9462890625,-4777.4609375,-4771.71728515625,-4707.490234375,-4591.34912109375,-4429.9873046875,-4229.70556640625,-3996.198974609375,-3734.68359375,-3450.21875,-3147.962158203125,-2833.091796875,-2510.289794921875,-2182.9482421875,-1852.48291015625,-1518.19091796875,-1177.8944091796875,-829.2393188476562,-471.1378479003906,-104.69105529785156,266.8841857910156,639.3180541992188,1008.7996215820312,1373.1070556640625,1731.6851806640625,2084.5634765625,2430.699951171875,2766.75537109375,3087.157958984375,3385.6259765625,3657.442626953125,3901.21923828125,4119.04150390625,4314.73779296875,4491.1240234375,4647.81201171875,4781.0302734375,4885.84423828125,4959.703125,5005.26318359375,5030.57080078125,5046.04296875,5059.57080078125,5072.3994140625,5078.353515625,5067.33154296875,5031.546875,4971.16748046875,4895.88720703125,4820.89453125,4758.79638671875,4711.5830078125,4667.2783203125,4603.8505859375,4499.25537109375,4342.98291015625,4143.1630859375,3925.067626953125,3720.971923828125,3555.76904296875,3435.13134765625,3342.026123046875,3243.423828125,3104.05615234375,2900.651611328125,2629.96240234375,2307.149658203125,1955.967529296875,1596.17431640625,1234.62353515625,864.1771240234375,470.2444763183594,40.784278869628906,-425.894775390625,-919.5713500976562,-1423.1158447265625,-1920.7540283203125,-2404.7177734375,-2876.677734375,-3343.580078125,-3810.777099609375,-4276.75537109375,-4732.63818359375,-5166.6806640625,-5570.97998046875,-5946.330078125,-6302.20703125,-6651.72412109375,-7004.2490234375,-7359.74755859375,-7707.90576171875,-8032.42529296875,-8318.0224609375,-8556.220703125,-8746.833984375,-8894.501953125,-9002.4677734375,-9067.291015625,-9077.5947265625,-9017.623046875,-8873.71875,-8640.201171875,-8321.5556640625,-7929.91357421875,-7479.40380859375,-6980.5908203125,-6438.0126953125,-5851.95263671875,-5223.134765625,-4557.38330078125,-3867.348388671875,-3170.105224609375,-2481.77978515625,-1812.083984375,-1161.757080078125,-524.4177856445312,107.98933410644531,738.8598022460938,1362.9071044921875,1966.5057373046875,2532.267822265625,3045.624755859375,3500.218994140625,3899.547607421875,4254.16064453125,4575.87548828125,4871.86083984375,5141.42529296875,5376.9892578125,5568.68896484375,5710.3759765625,5804.13916015625,5861.2265625,5898.873046875,5934.3916015625,5979.0419921875,6034.2216796875,6091.47021484375,6136.15087890625,6153.18359375,6132.501953125,6072.15771484375,5978.0830078125,5860.88330078125,5731.18505859375,5595.48681640625,5454.10302734375,5301.82275390625,5130.78955078125,4934.2763671875,4709.81689453125,4460.5380859375,4194.33447265625,3921.360107421875,3650.890380859375,3388.69140625,3135.732666015625,2888.488525390625,2640.53076171875,2384.75537109375,2115.51220703125,1830.0711669921875,1529.1265869140625,1216.33056640625,897.078857421875,576.92822265625,260.1058044433594,-51.444435119628906,-358.1650695800781,-662.0816650390625,-965.3630981445312,-1268.802001953125,-1570.873291015625,-1867.8564453125,-2155.089599609375,-2428.90625,-2688.44140625,-2936.46337890625,-3178.759033203125,-3422.214599609375,-3672.35205078125,-3931.353759765625,-4197.447265625,-4465.9208984375,-4731.3232421875,-4989.85205078125,-5240.8515625,-5486.74755859375,-5731.45068359375,-5977.9541015625,-6226.19580078125,-6472.1044921875,-6708.2119140625,-6925.521484375,-7115.8173828125,-7273.478515625,-7396.12255859375,-7483.9580078125,-7538.22314453125,-7559.42431640625,-7546.0595703125,-7494.23388671875,-7398.1826171875,-7251.4208984375,-7048.09716796875,-6784.20556640625,-6458.423828125,-6072.505859375,-5631.2021484375,-5141.72412109375,-4612.7841796875,-4053.333251953125,-3471.287109375,-2872.620849609375,-2261.21435546875,-1639.572509765625,-1010.1655883789062,-376.8006591796875,254.65130615234375,876.5518798828125,1480.647216796875,2059.3857421875,2606.5517578125,3116.719482421875,3583.791259765625,3999.579833984375,4353.60888671875,4634.7587890625,4834.328125,4949.06640625,4982.4326171875,4943.0361328125,4840.6904296875,4681.95751953125,4467.61669921875,4193.68359375,3855.75537109375,3454.52734375,2999.438232421875,2508.16064453125,2001.75537109375,1497.6920166015625,1004.2491455078125,519.2471923828125,33.86473083496094,-460.38092041015625,-965.0855102539062,-1472.1898193359375,-1966.2979736328125,-2430.675048828125,-2853.614990234375,-3231.831298828125,-3569.288330078125,-3872.43798828125,-4144.689453125,-4383.14990234375,-4579.20947265625,-4722.33447265625,-4804.76171875,-4824.5517578125,-4785.650390625,-4695.4208984375,-4561.392578125,-4389.08203125,-4181.7470703125,-3941.57666015625,-3671.052490234375,-3373.396240234375,-3051.98291015625,-2709.50146484375,-2347.845458984375,-1969.0963134765625,-1577.02880859375,-1178.04833984375,-780.7758178710938,-394.4533386230469,-27.26435089111328,314.1636657714844,623.623779296875,893.4060668945312,1113.26318359375,1271.5936279296875,1358.73876953125,1370.66357421875,1310.621826171875,1187.319091796875,1010.192138671875,784.4762573242188,509.3102722167969,180.63601684570312,-202.24252319335938,-630.1800537109375,-1082.1544189453125,-1530.020263671875,-1948.63427734375,-2326.481201171875,-2670.887451171875,-3004.1640625,-3351.603271484375,-3726.805419921875,-4121.74462890625,-4507.06884765625,-4843.1455078125,-5096.82666015625,-5255.77783203125,-5333.189453125,-5360.39892578125,-5370.96826171875,-5383.99951171875,-5394.74755859375,-5376.78173828125,-5294.10400390625,-5116.7763671875,-4832.23291015625,-4447.080078125,-3979.2958984375,-3445.597412109375,-2850.8818359375,-2185.140380859375,-1429.0904541015625,-565.263671875,411.2455139160156,1487.58984375,2635.633056640625,3820.27294921875,5009.17919921875,6179.314453125,7317.7080078125,8417.0859375,9469.4296875,10461.1943359375,11372.6708984375,12181.6318359375,12869.2177734375,13425.0625,13849.203125,14149.998046875,14339.1708984375,14426.291015625,14415.0458984375,14302.6845703125,14082.4990234375,13747.9189453125,13296.2470703125,12730.4814453125,12058.7236328125,11291.8935546875,10441.1435546875,9516.3125,8526.0224609375,7478.99169921875,6385.51904296875,5258.060546875,4110.48779296875,2956.46337890625,1807.93115234375,674.6222534179688,-435.1777648925781,-1513.1756591796875,-2549.95068359375,-3534.97998046875,-4457.88818359375,-5310.208984375,-6086.599609375,-6784.763671875,-7404.1298828125,-7944.0927734375,-8402.85546875,-8777.521484375,-9065.23828125,-9264.564453125,-9376.099609375,-9402.0107421875,-9344.8798828125,-9206.830078125,-8989.76953125,-8696.83984375,-8334.275390625,-7912.41455078125,-7444.9306640625,-6946.30224609375,-6428.59619140625,-5899.13623046875,-5360.24072265625,-4811.14111328125,-4251.0126953125,-3681.5126953125,-3107.539306640625,-2536.00927734375,-1973.5465087890625,-1424.5474853515625,-890.7715454101562,-372.6418762207031,128.58900451660156,609.1392211914062,1062.4866943359375,1480.78466796875,1857.122314453125,2187.4365234375,2471.1572265625,2710.44091796875,2908.61865234375,3068.8095703125,3193.3974609375,3284.435302734375,3344.463623046875,3377.035400390625,3386.533203125,3377.3828125,3353.172119140625,3316.2158203125,3267.7646484375,3208.634521484375,3139.765869140625,3062.341552734375,2977.4296875,2885.4833984375,2786.115478515625,2678.368408203125,2561.324462890625,2434.65283203125,2298.721923828125,2154.231201171875,2001.6759033203125,1841.1212158203125,1672.5645751953125,1496.7337646484375,1315.7801513671875,1133.279052734375,953.3165893554688,779.0370483398438,611.4749145507812,449.4687805175781,290.90362548828125,134.72702026367188,-17.382816314697266,-160.7613067626953,-289.2547607421875,-397.7920837402344,-484.6282043457031,-551.8987426757812,-603.9815673828125,-644.4019165039062,-672.9388427734375,-684.6256103515625,-671.3897094726562,-625.6380615234375,-543.9644165039062,-428.99530029296875,-288.3399963378906,-131.16128540039062,35.808475494384766,210.65699768066406,395.798828125,594.88720703125,808.8408203125,1033.1734619140625,1258.09375,1471.335205078125,1662.224853515625,1824.885986328125,1959.0018310546875,2067.908203125,2155.163330078125,2221.43408203125,2263.211181640625,2273.775390625,2245.635986328125,2173.010009765625,2053.09912109375,1885.768310546875,1672.17138671875,1413.3580322265625,1109.72314453125,761.497802734375,369.8052062988281,-62.47187042236328,-530.510009765625,-1027.9954833984375,-1547.710205078125,-2081.7353515625,-2621.14990234375,-3155.588134765625,-3673.240234375,-4161.64404296875,-4609.06591796875,-5005.818359375,-5344.826171875,-5621.2119140625,-5831.33203125,-5972.07470703125,-6041.0458984375,-6037.6005859375,-5963.927734375,-5825.17431640625,-5628.05419921875,-5378.4072265625,-5079.0244140625,-4729.1923828125,-4326.58544921875,-3870.765869140625,-3366.416259765625,-2824.277587890625,-2258.843017578125,-1683.649658203125,-1106.5330810546875,-527.5091552734375,59.2444953918457,659.9701538085938,1275.08447265625,1895.357177734375,2502.6630859375,3075.1083984375,3593.983154296875,4048.94384765625,4438.70947265625,4766.91552734375,5035.39990234375,5238.6494140625,5362.634765625,5388.9853515625,5302.64501953125,5099.2294921875,4788.3720703125,4391.24951171875,3933.35009765625,3435.840576171875,2909.53369140625,2354.127197265625,1762.7811279296875,1129.5623779296875,456.0235290527344,-246.23452758789062,-958.109375,-1659.246337890625,-2334.852783203125,-2979.77783203125,-3597.977783203125,-4197.75341796875,-4785.13232421875,-5358.56640625,-5907.3935546875,-6414.67578125,-6862.9150390625,-7239.84375,-7541.513671875,-7771.27685546875,-7935.2685546875,-8036.6904296875,-8071.7626953125,-8029.4091796875,-7894.92529296875,-7655.94384765625,-7307.90283203125,-6856.4482421875,-6315.6865234375,-5703.19482421875,-5034.23291015625,-4317.92822265625,-3557.177001953125,-2752.1201171875,-1905.306640625,-1025.8631591796875,-130.5560302734375,758.7841796875,1620.2252197265625,2436.748779296875,3199.08984375,3905.35791015625,4557.99072265625,5159.78955078125,5711.013671875,6208.75439453125,6648.5361328125,7026.9521484375,7343.76318359375,7602.30029296875,7808.013671875,7965.9755859375,8078.623046875,8144.8056640625,8160.48779296875,8120.62548828125,8021.2587890625,7860.896484375,7640.76220703125,7364.08056640625,7035.00927734375,6657.8974609375,6237.25,5778.33447265625,5287.998046875,4775.14404296875,4250.49462890625,3725.610595703125,3211.517822265625,2717.457275390625,2250.232177734375,1814.3277587890625,1412.632080078125,1047.3231201171875,720.4663696289062,434.06707763671875,189.6381378173828,-12.387396812438965,-173.0041046142578,-294.4979553222656,-379.8630065917969,-432.05267333984375,-453.4233703613281,-445.6054382324219,-409.79949951171875,-347.2881774902344,-259.8868713378906,-150.1469268798828,-21.29024887084961,123.02166748046875,278.9637451171875,442.8153991699219,611.2312622070312,781.5090942382812,951.7572021484375,1120.7823486328125,1287.56201171875,1450.3677978515625,1605.879150390625,1748.7938232421875,1872.3328857421875,1969.64990234375,2035.656494140625,2068.448974609375,2069.603515625,2043.109375,1993.399169921875,1923.441162109375,1833.8641357421875,1723.5631103515625,1591.447509765625,1438.3714599609375,1268.1885986328125,1087.3450927734375,903.2158203125,722.0352172851562,547.4419555664062,380.260986328125,219.45242309570312,63.56950759887695,-88.09654235839844,-235.19798278808594,-376.8046569824219,-512.1943969726562,-641.3912353515625,-765.1450805664062,-884.4482421875,-999.9544677734375,-1111.650634765625,-1218.883544921875,-1320.5714111328125,-1415.3372802734375,-1501.438720703125,-1576.629638671875,-1638.230712890625,-1683.586669921875,-1710.76953125,-1719.091796875,-1708.954833984375,-1680.89111328125,-1634.1943359375,-1565.933349609375,-1471.0936279296875,-1344.0302734375,-1180.6278076171875,-980.0361938476562,-744.9607543945312,-480.2543640136719,-190.56085205078125,121.61333465576172,456.2081604003906,814.0568237304688,1194.39306640625,1592.98681640625,2002.1475830078125,2412.671142578125,2816.50732421875,3208.3349609375,3584.802001953125,3941.654296875,4270.48876953125,4557.44189453125,4785.314453125,4938.75390625,5010.24365234375,5003.8349609375,4934.416015625,4822.458984375,4686.49365234375,4536.8232421875,4373.43310546875,4188.94970703125,3974.923583984375,3728.03955078125,3452.950927734375,3160.2607421875,2860.751953125,2558.94287109375,2249.408203125,1917.869384765625,1546.62841796875,1121.753662109375,638.6251831054688,103.3528060913086,-470.32562255859375,-1066.8843994140625,-1674.6185302734375,-2288.381103515625,-2908.392333984375,-3536.0576171875,-4169.126953125,-4798.7265625,-5409.75244140625,-5984.451171875,-6507.498046875,-6970.25634765625,-7372.3466796875,-7719.95751953125,-8021.791015625,-8284.521484375,-8509.724609375,-8693.4453125,-8828.31640625,-8906.9755859375,-8925.07421875,-8882.4912109375,-8782.37890625,-8628.751953125,-8424.0078125,-8167.64453125,-7856.71142578125,-7487.55908203125,-7057.78857421875,-6567.369140625,-6018.5498046875,-5415.02392578125,-4761.28466796875,-4062.897216796875,-3327.625244140625,-2566.537841796875,-1793.92529296875,-1025.3863525390625,-274.5588684082031,449.9923095703125,1145.9656982421875,1815.644775390625,2461.936767578125,3084.103271484375,3675.530517578125,4224.90087890625,4720.26220703125,5153.76611328125,5524.333984375,5836.5546875,6096.2734375,6305.3095703125,6458.4814453125,6544.99072265625,6553.9111328125,6481.1708984375,6334.423828125,6133.099609375,5903.2958984375,5669.76904296875,5448.740234375,5244.76953125,5052.86181640625,4864.345703125,4673.3037109375,4480.2919921875,4291.734375,4115.7451171875,3956.960693359375,3813.3154296875,3676.444580078125,3535.359130859375,3381.290283203125,3211.12646484375,3027.78759765625,2837.622802734375,2646.475341796875,2456.591796875,2265.8642578125,2069.492431640625,1862.865234375,1643.987548828125,1414.280029296875,1177.615234375,938.4071044921875,699.8983764648438,463.4343566894531,228.7877960205078,-4.992832660675049,-238.86683654785156,-473.55291748046875,-709.6310424804688,-947.6304321289062,-1187.8447265625,-1429.935791015625,-1672.651611328125,-1913.974365234375,-2151.73486328125,-2384.376708984375,-2611.388671875,-2833.080322265625,-3049.78564453125,-3260.96630859375,-3464.812255859375,-3658.70068359375,-3840.394775390625,-4009.432373046875,-4168.00830078125,-4320.88037109375,-4474.29833984375,-4634.412109375,-4805.79345703125,-4990.58837890625,-5188.4345703125,-5396.9287109375,-5612.24462890625,-5829.5947265625,-6043.44677734375,-6247.642578125,-6435.6142578125,-6600.80517578125,-6737.23388671875,-6840.01416015625,-6905.671875,-6932.1982421875,-6918.9228515625,-6866.32666015625,-6775.8720703125,-6649.82373046875,-6491.001953125,-6302.40771484375,-6086.80126953125,-5846.3681640625,-5582.6220703125,-5296.5791015625,-4989.0810546875,-4661.060546875,-4313.55029296875,-3947.42138671875,-3563.005126953125,-3159.867431640625,-2736.95849609375,-2293.15771484375,-1828.015625,-1342.3687744140625,-838.5508422851562,-320.1395568847656,208.5836181640625,743.1328125,1278.986572265625,1811.332275390625,2334.543701171875,2841.71044921875,3324.53076171875,3773.713623046875,4179.794921875,4534.11083984375,4829.62548828125,5061.4326171875,5226.896484375,5325.54638671875,5358.85009765625,5329.943359375,5243.28662109375,5104.2080078125,4918.31689453125,4690.90576171875,4426.53564453125,4128.986328125,3801.62890625,3448.07080078125,3072.75,2681.136474609375,2279.341064453125,1873.201416015625,1467.1873779296875,1063.5888671875,662.3607788085938,261.72271728515625,-140.72943115234375,-546.874755859375,-957.3671875,-1371.6392822265625,-1788.497314453125,-2206.8740234375,-2626.19189453125,-3045.961669921875,-3464.630859375,-3878.12890625,-4278.80810546875,-4655.421875,-4994.40576171875,-5282.16845703125,-5507.6435546875,-5664.173828125,-5750.0244140625,-5767.357421875,-5720.12939453125,-5611.83740234375,-5444.1083984375,-5216.7548828125,-4929.27978515625,-4583.134765625,-4183.64990234375,-3740.66162109375,-3267.40625,-2778.0224609375,-2284.68603515625,-1795.6199951171875,-1314.890625,-844.1016845703125,-385.2214660644531,56.80458450317383,472.9618225097656,851.2439575195312,1179.5494384765625,1449.172607421875,1657.3375244140625,1807.6114501953125,1907.9783935546875,1967.4095458984375,1992.455322265625,1985.360595703125,1944.49462890625,1866.8101806640625,1751.126220703125,1600.683349609375,1423.8011474609375,1232.37841796875,1038.9671630859375,853.7637329101562,682.822021484375,528.1456298828125,389.40350341796875,266.2777099609375,160.24354553222656,74.96527862548828,15.251668930053711,-14.749409675598145,-13.087540626525879,19.560718536376953,80.80052185058594,168.29811096191406,281.5271301269531,422.6091613769531,595.8389892578125,806.13330078125,1057.14990234375,1349.9508056640625,1682.7794189453125,2051.956298828125,2453.35107421875,2883.632568359375,3340.64697265625,3822.73681640625,4327.36279296875,4849.72607421875,5382.07373046875,5914.017578125,6433.69189453125,6929.19580078125,7389.70166015625,7805.83447265625,8169.36962890625,8472.6396484375,8708.1455078125,8868.69921875,8948.05859375,8941.7470703125,8847.6435546875,8666.1064453125,8399.6923828125,8052.7412109375,7631.1044921875,7142.11572265625,6594.58837890625,5998.52490234375,5364.31640625,4701.556640625,4017.944091796875,3318.867919921875,2608.053955078125,1889.1209716796875,1167.3740234375,450.8974914550781,-249.75994873046875,-923.3890991210938,-1560.7386474609375,-2156.7939453125,-2711.617431640625,-3229.2568359375,-3715.108642578125,-4172.8427734375,-4602.23046875,-4998.7958984375,-5355.39794921875,-5664.97412109375,-5923.19970703125,-6129.9248046875,-6288.84912109375,-6405.720703125,-6485.9541015625,-6532.72509765625,-6546.26904296875,-6524.50244140625,-6464.49609375,-6364.02734375,-6222.55322265625,-6041.33154296875,-5822.87109375,-5570.2021484375,-5286.44873046875,-4974.93115234375,-4639.6728515625,-4285.91796875,-3920.22412109375,-3549.917236328125,-3182.009765625,-2821.989990234375,-2472.981689453125,-2135.64453125,-1808.864990234375,-1490.9442138671875,-1180.785888671875,-878.60009765625,-585.8818969726562,-304.7588195800781,-37.081947326660156,216.2772216796875,455.59735107421875,681.9046630859375,896.2464599609375,1099.0377197265625,1289.8184814453125,1467.53369140625,1631.173828125,1780.4481201171875,1916.166748046875,2040.1815185546875,2154.971435546875,2263.121826171875,2366.969482421875,2468.544677734375,2569.755859375,2672.605224609375,2779.2109375,2891.519287109375,3010.779052734375,3136.985107421875,3268.53515625,3402.25927734375,3533.811767578125,3658.283935546875,3770.826171875,3867.117431640625,3943.610595703125,3997.594482421875,4027.148681640625,4031.06689453125,4008.774169921875,3960.239013671875,3885.88818359375,3786.556396484375,3663.501953125,3518.48828125,3353.839111328125,3172.322265625,2976.73193359375,2769.16796875,2550.218017578125,2318.41455078125,2070.364990234375,1801.748291015625,1509.0205078125,1191.277587890625,851.5374755859375,496.82244873046875,136.86544799804688,-218.1512908935547,-559.9595947265625,-883.7124633789062,-1188.0294189453125,-1473.630126953125,-1741.26171875,-1989.9556884765625,-2216.485595703125,-2416.292236328125,-2585.4111328125,-2722.433837890625,-2829.511474609375,-2911.89892578125,-2976.258544921875,-3028.54541015625,-3072.46728515625,-3109.174072265625,-3138.187744140625,-3158.964599609375,-3172.227294921875,-3180.404541015625,-3187.048095703125,-3195.634033203125,-3208.423828125,-3225.933837890625,-3247.16259765625,-3270.29052734375,-3293.368896484375,-3314.6328125,-3332.38671875,-3344.738525390625,-3349.542724609375,-3344.746826171875,-3329.027099609375,-3302.35595703125,-3266.12939453125,-3222.71484375,-3174.603271484375,-3123.565673828125,-3070.201904296875,-3014.010498046875,-2953.814697265625,-2888.190673828125,-2815.603515625,-2734.190185546875,-2641.400390625,-2533.811767578125,-2407.34228515625,-2257.83837890625,-2081.80078125,-1876.9622802734375,-1642.565673828125,-1379.4078369140625,-1089.8419189453125,-777.869873046875,-449.2498779296875,-111.34879302978516,227.53138732910156,559.3798217773438,877.905517578125,1179.5482177734375,1463.5,1730.5738525390625,1981.338623046875,2214.384033203125,2425.597412109375,2608.884521484375,2758.03125,2868.809814453125,2940.261962890625,2974.507080078125,2975.18017578125,2945.317138671875,2885.7890625,2795.090087890625,2670.55712890625,2510.360595703125,2315.219970703125,2088.9697265625,1837.7255859375,1568.112060546875,1285.4532470703125,992.79150390625,691.1205444335938,380.5953369140625,62.03062438964844,-262.0701904296875,-587.4026489257812,-908.6160278320312,-1220.4718017578125,-1518.7945556640625,-1800.77001953125,-2064.49560546875,-2308.039794921875,-2528.468505859375,-2721.26611328125,-2880.401611328125,-2999.02099609375,-3070.546630859375,-3089.845703125,-3054.142333984375,-2963.435791015625,-2820.3388671875,-2629.39990234375,-2396.12548828125,-2126.00390625,-1823.83251953125,-1493.54248046875,-1138.5343017578125,-762.333984375,-369.24957275390625,35.2985954284668,444.9621887207031,853.1319580078125,1253.83837890625,1642.5263671875,2016.3848876953125,2374.0986328125,2715.11962890625,3038.7587890625,3343.4638671875,3626.56103515625,3884.549560546875,4113.80078125,4311.36669921875,4475.56494140625,4606.13818359375,4703.962890625,4770.4912109375,4807.2119140625,4815.38427734375,4796.13720703125,4750.8505859375,4681.5771484375,4591.25830078125,4483.59765625,4362.65087890625,4232.32568359375,4096.04345703125,3956.68212890625,3816.771728515625,3678.744384765625,3545.021728515625,3417.82470703125,3298.790283203125,3188.615478515625,3086.9833984375,2992.8740234375,2905.157470703125,2823.1787109375,2747.02197265625,2677.2958984375,2614.52490234375,2558.456298828125,2507.6455078125,2459.55078125,2411.11279296875,2359.54150390625,2302.9287109375,2240.401611328125,2171.7568359375,2096.793212890625,2014.686767578125,1923.739013671875,1821.62646484375,1706.0389404296875,1575.416259765625,1429.4599609375,1269.216552734375,1096.7406005859375,914.5244750976562,724.9757690429688,530.170654296875,331.9654846191406,132.36865234375,-66.05144500732422,-259.9698791503906,-445.4740905761719,-618.58154296875,-775.9135131835938,-915.2312622070312,-1035.5711669921875,-1136.880126953125,-1219.2867431640625,-1282.3458251953125,-1324.6531982421875,-1344.0908203125,-1338.6715087890625,-1307.6343994140625,-1252.261474609375,-1175.958740234375,-1083.47119140625,-979.531005859375,-867.5660400390625,-749.1226806640625,-624.3450927734375,-493.3291931152344,-357.6925354003906,-221.52700805664062,-91.1477279663086,26.380586624145508,125.33518981933594,203.0795440673828,260.5931091308594,301.45306396484375,329.65753173828125,347.24822998046875,352.8190002441406,341.613037109375,307.188232421875,243.9061737060547,149.12461853027344,24.122779846191406,-126.60530853271484,-297.28228759765625,-483.0265197753906,-681.2035522460938,-891.2926025390625,-1113.3402099609375,-1345.764404296875,-1583.5970458984375,-1818.0615234375,-2037.7667236328125,-2231.05615234375,-2388.515380859375,-2504.564697265625,-2577.481689453125,-2607.891845703125,-2596.457763671875,-2541.837890625,-2439.861328125,-2284.311767578125,-2069.011962890625,-1790.332275390625,-1449.09619140625,-1051.151611328125,-606.4765014648438,-127.31156921386719,373.8382263183594,885.5460205078125,1397.787353515625,1901.43701171875,2387.528564453125],"velocity":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7.943883134821987e-21,4.384688550774547e-16,4.945056950728111e-13,1.9032286163733758e-11,2.5080554300060953e-10,1.8505398324819566e-9,9.462558736572646e-9,3.75549475961634e-8,1.237719118307723e-7,3.538378621215088e-7,9.03943259800144e-7,0.000002107921545757563,0.000004557791726256255,0.00000924732466955902,0.000017769129044609144,0.00003257639764342457,0.00005732081990572624,0.0000972784764599055,0.00015987548977136612,0.0002553253434598446,0.0003973894927185029,0.0006042736931703985,0.0008996723336167634,0.0013139757793396711,0.0018856554524973035,0.002662845654413104,0.003705133916810155,0.005085572134703398,0.00689290277659893,0.009233975782990456,0.012236312963068485,0.016050729900598526,0.020853903144598007,0.026850730180740356,0.03427625447511673,0.043396953493356705,0.05451108142733574,0.06794779747724533,0.08406484127044678,0.10324454307556152,0.1258881837129593,0.15240879356861115,0.1832227110862732,0.21874059736728668,0.2593584358692169,0.3054494857788086,0.3573578894138336,0.41539493203163147,0.47983771562576294,0.5509312152862549,0.6288926005363464,0.7139166593551636,0.8061820864677429,0.9058545827865601,1.013087272644043,1.1280145645141602,1.250739574432373,1.3813151121139526,1.5197184085845947,1.6658209562301636,1.8193577527999878,1.9798954725265503,2.1468043327331543,2.319234848022461,2.4961023330688477,2.6760828495025635,2.85762357711792,3.0389695167541504,3.218207359313965,3.393327236175537,3.5622928142547607,3.723116159439087,3.873927354812622,4.013031005859375,4.1389479637146,4.250432968139648,4.346482276916504,4.426318168640137,4.4893670082092285,4.5352253913879395,4.5636186599731445,4.57435417175293,4.567276954650879,4.542226314544678,4.499011993408203,4.437403678894043,4.357149600982666,4.258011817932129,4.139819145202637,4.00252628326416,3.846270799636841,3.6714184284210205,3.47859787940979,3.2687180042266846,3.0429747104644775,2.8028461933135986,2.550077199935913,2.286656379699707,2.014784812927246,1.7368371486663818,1.4553167819976807,1.1728100776672363,0.8919402956962585,0.6153250932693481,0.3455386459827423,0.08507763594388962,-0.1636689454317093,-0.39844754338264465,-0.6171668767929077,-0.8179242610931396,-0.9990326762199402,-1.1590490341186523,-1.2968039512634277,-1.411432147026062,-1.5023999214172363,-1.5695282220840454,-1.61300528049469,-1.6333853006362915,-1.63157057762146,-1.608777642250061,-1.5664877891540527,-1.5063873529434204,-1.4303007125854492,-1.3401243686676025,-1.2377638816833496,-1.1250815391540527,-1.00385582447052,-0.8757582306861877,-0.7423450946807861,-0.6050665378570557,-0.46528810262680054,-0.3243217468261719,-0.18346109986305237,-0.04401625692844391,0.09265712648630142,0.2251380980014801,0.35193368792533875,0.4714876115322113,0.5822056531906128,0.6824973225593567,0.7708312273025513,0.8458000421524048,0.906188428401947,0.9510369300842285,0.9796954989433289,0.9918606281280518,0.987592875957489,0.9673137664794922,0.931782603263855,0.8820561170578003,0.819434642791748,0.7454004287719727,0.6615532040596008,0.5695491433143616,0.47104784846305847,0.36767035722732544,0.2609710097312927,0.15242114663124084,0.04340358451008797,-0.06478618085384369,-0.1709350198507309,-0.27390727400779724,-0.3726426959037781,-0.4661588668823242,-0.5535600781440735,-0.6340516805648804,-0.7069603800773621,-0.7717568874359131,-0.8280792236328125,-0.8757526278495789,-0.9148032069206238,-0.9454634189605713,-0.9681689739227295,-0.9835476279258728,-0.9924017190933228,-0.9956867694854736,-0.9944872260093689,-0.9899915456771851,-0.9834659695625305,-0.9762274026870728,-0.9696153998374939,-0.964962899684906,-0.9635657668113708,-0.966651976108551,-0.9753514528274536,-0.9906669855117798,-1.0134477615356445,-1.044366717338562,-1.083903431892395,-1.1323331594467163,-1.1897246837615967,-1.2559468746185303,-1.3306843042373657,-1.4134621620178223,-1.5036760568618774,-1.6006264686584473,-1.7035521268844604,-1.8116605281829834,-1.9241524934768677,-2.0402398109436035,-2.1591553688049316,-2.2801544666290283,-2.40251088142395,-2.525503396987915,-2.6483991146087646,-2.770430088043213,-2.8907687664031982,-3.0085060596466064,-3.122637987136841,-3.232060432434082,-3.3355822563171387,-3.4319489002227783,-3.51987886428833,-3.5981054306030273,-3.665419101715088,-3.7207064628601074,-3.762981414794922,-3.791409492492676,-3.8053245544433594,-3.8042407035827637,-3.787858247756958,-3.7560672760009766,-3.708944797515869,-3.646747589111328,-3.569904088973999,-3.478999614715576,-3.374764919281006,-3.258059501647949,-3.12985897064209,-2.991238832473755,-2.8433573246002197,-2.6874351501464844,-2.5247318744659424,-2.3565216064453125,-2.184067726135254,-2.0085983276367188,-1.8312857151031494,-1.653226613998413,-1.4754291772842407,-1.2988008260726929,-1.1241416931152344,-0.9521421194076538,-0.7833850979804993,-0.6183526515960693,-0.4574378430843353,-0.3009595572948456,-0.14917996525764465,-0.002323399530723691,0.13940465450286865,0.2757989168167114,0.4066372811794281,0.5316659212112427,0.6505884528160095,0.7630597352981567,0.8686851859092712,0.9670265316963196,1.057612657546997,1.1399542093276978,1.2135610580444336,1.2779600620269775,1.3327112197875977,1.3774231672286987,1.4117653369903564,1.4354777336120605,1.448378324508667,1.450366497039795,1.4414246082305908,1.4216163158416748,1.3910818099975586,1.3500316143035889,1.2987383604049683,1.2375283241271973,1.1667730808258057,1.0868840217590332,0.9983085989952087,0.9015317559242249,0.7970821261405945,0.6855424642562866,0.5675637125968933,0.44388025999069214,0.3153240382671356,0.18283481895923615,0.04746449366211891,-0.08962543308734894,-0.22717377543449402,-0.36383622884750366,-0.49820777773857117,-0.62884920835495,-0.7543166875839233,-0.8731919527053833,-0.984112024307251,-1.0857956409454346,-1.1770654916763306,-1.2568655014038086,-1.3242722749710083,-1.3785033226013184,-1.4189223051071167,-1.4450440406799316,-1.4565409421920776,-1.4532521963119507,-1.4351938962936401,-1.402571201324463,-1.3557900190353394,-1.2954645156860352,-1.2224206924438477,-1.1376913785934448,-1.0425009727478027,-0.9382405877113342,-0.8264316320419312,-0.7086809277534485,-0.5866299867630005,-0.4619029760360718,-0.3360580503940582,-0.21054671704769135,-0.08668486773967743,0.0343625508248806,0.1515825092792511,0.2641022205352783,0.3711670935153961,0.47211214900016785,0.5663309097290039,0.653245747089386,0.7322830557823181,0.802856981754303,0.8643625378608704,0.916179895401001,0.9576892852783203,0.9882959723472595,1.0074626207351685,1.0147465467453003,1.009838581085205,0.992599606513977,0.963090181350708,0.9215920567512512,0.8686177134513855,0.8049082159996033,0.73142009973526,0.6493030786514282,0.55987149477005,0.4645712375640869,0.36494573950767517,0.262601763010025,0.1591760516166687,0.05630374327301979,-0.04441169649362564,-0.1414271742105484,-0.23328754305839539,-0.3186522424221039,-0.39632129669189453,-0.4652596712112427,-0.5246195197105408,-0.5737581253051758,-0.6122497320175171,-0.6398900747299194,-0.6566913723945618,-0.6628691554069519,-0.6588202118873596,-0.6450947523117065,-0.6223640441894531,-0.5913863778114319,-0.5529739260673523,-0.5079621076583862,-0.45718449354171753,-0.4014543890953064,-0.3415539860725403,-0.2782321870326996,-0.2122097909450531,-0.1441909372806549,-0.07487856596708298,-0.004991592839360237,0.06471853703260422,0.13345398008823395,0.20036107301712036,0.2645268440246582,0.3249828815460205,0.3807174563407898,0.43069636821746826,0.4738921821117401,0.5093201398849487,0.5360780954360962,0.5533872842788696,0.5606299638748169,0.5573809742927551,0.5434305667877197,0.5187970995903015,0.48372921347618103,0.4386984407901764,0.3843829333782196,0.3216451406478882,0.2515045702457428,0.1751088947057724,0.09370448440313339,0.008608289994299412,-0.07881848514080048,-0.16719479858875275,-0.2551429569721222,-0.3413110375404358,-0.42439520359039307,-0.5031622052192688,-0.5764712691307068,-0.6432954668998718,-0.7027412056922913,-0.7540651559829712,-0.7966877222061157,-0.8302029371261597,-0.8543832898139954,-0.8691797256469727,-0.8747173547744751,-0.8712863326072693,-0.8593295812606812,-0.8394291400909424,-0.8122910261154175,-0.7787317633628845,-0.7396658658981323,-0.6960952281951904,-0.6491004824638367,-0.5998324751853943,-0.5495036244392395,-0.49937671422958374,-0.4507497549057007,-0.40493571758270264,-0.363235741853714,-0.3269067704677582,-0.2971248924732208,-0.2749471664428711,-0.2612757384777069,-0.25682803988456726,-0.2621158957481384,-0.27743634581565857,-0.30287423729896545,-0.3383163809776306,-0.3834751546382904,-0.43791911005973816,-0.501107931137085,-0.572428286075592,-0.6512280106544495,-0.7368456721305847,-0.8286325931549072,-0.9259656071662903,-1.028249979019165,-1.134911060333252,-1.245377779006958,-1.3590593338012695,-1.4753187894821167,-1.593448519706726,-1.7126494646072388,-1.8320187330245972,-1.950547218322754,-2.0671274662017822,-2.180572986602783,-2.2896456718444824,-2.393092393875122,-2.4896841049194336,-2.5782601833343506,-2.6577696800231934,-2.727311611175537,-2.786168098449707,-2.833831787109375,-2.8700244426727295,-2.894704580307007,-2.9080684185028076,-2.9105377197265625,-2.902742385864258,-2.8854918479919434,-2.8597402572631836,-2.8265480995178223,-2.787036418914795,-2.742344379425049,-2.693584442138672,-2.6418049335479736,-2.587955951690674,-2.5328664779663086,-2.4772276878356934,-2.421588182449341,-2.36635422706604,-2.311798572540283,-2.258073329925537,-2.2052276134490967,-2.1532247066497803,-2.1019625663757324,-2.051290512084961,-2.0010271072387695,-1.9509721994400024,-1.900918960571289,-1.850658893585205,-1.7999845743179321,-1.7486889362335205,-1.696561336517334,-1.6433817148208618,-1.588914394378662,-1.5329033136367798,-1.4750679731369019,-1.4151045083999634,-1.3526893854141235,-1.2874901294708252,-1.2191789150238037,-1.1474510431289673,-1.0720444917678833,-0.9927590489387512,-0.9094721078872681,-0.8221495151519775,-0.7308493852615356,-0.6357195973396301,-0.5369884967803955,-0.43495139479637146,-0.329953670501709,-0.22237324714660645,-0.11260417103767395,-0.0010429323883727193,0.1119203269481659,0.22590501606464386,0.3405366539955139,0.4554371237754822,0.5702091455459595,0.6844173073768616,0.7975671291351318,0.909085750579834,1.0183061361312866,1.1244574785232544,1.2266631126403809,1.323947787284851,1.4152544736862183,1.499469518661499,1.57545804977417,1.6421047449111938,1.6983593702316284,1.7432831525802612,1.7760926485061646,1.7961972951889038,1.8032281398773193,1.797056794166565,1.7778034210205078,1.7458350658416748,1.7017548084259033,1.6463850736618042,1.5807433128356934,1.506014347076416,1.4235179424285889,1.334671139717102,1.2409487962722778,1.1438398361206055,1.0448031425476074,0.9452255368232727,0.8463876843452454,0.7494403719902039,0.6553950309753418,0.5651271939277649,0.4793873727321625,0.39881277084350586,0.32393428683280945,0.25517651438713074,0.19285593926906586,0.13718503713607788,0.08829081058502197,0.04624930024147034,0.011129528284072876,-0.016967695206403732,-0.03789176791906357,-0.05145396292209625,-0.05746486410498619,-0.055781085044145584,-0.04633971303701401,-0.029164571315050125,-0.004343532025814056,0.028007542714476585,0.06776996701955795,0.11481735855340958,0.16897889971733093,0.22998952865600586,0.2974570393562317,0.3708707392215729,0.44965440034866333,0.5332404971122742,0.6211273670196533,0.7128875851631165,0.8081212043762207,0.9063833355903625,1.007132649421692,1.1097438335418701,1.2135891914367676,1.3181554079055786,1.4231288433074951,1.528395414352417,1.6339410543441772,1.7396982908248901,1.845420479774475,1.9506632089614868,2.0548954010009766,2.15769100189209,2.2588939666748047,2.358654022216797,2.4572837352752686,2.554992198944092,2.651620388031006,2.746530294418335,2.838726282119751,2.927182197570801,3.011230707168579,3.090826988220215,3.1665468215942383,3.2392990589141846,3.3098716735839844,3.378511667251587,3.444727659225464,3.5073976516723633,3.565117120742798,3.6166164875030518,3.6610536575317383,3.6980597972869873,3.727552890777588,3.7494428157806396,3.763396739959717,3.768787384033203,3.7648355960845947,3.750854015350342,3.7264535427093506,3.6916019916534424,3.6465203762054443,3.5914909839630127,3.5266942977905273,3.452172040939331,3.367919683456421,3.2740445137023926,3.170880079269409,3.0589759349823,2.938960075378418,2.8113489151000977,2.6764116287231445,2.5341708660125732,2.3845455646514893,2.227565288543701,2.0635483264923096,1.8931539058685303,1.7172960042953491,1.5369768142700195,1.3531426191329956,1.1666467189788818,0.9783377647399902,0.7892208099365234,0.6005934476852417,0.41407138109207153,0.23147962987422943,0.054655320942401886,-0.11474544554948807,-0.2753509283065796,-0.4260544180870056,-0.5659071207046509,-0.6940040588378906,-0.8094415664672852,-0.911378026008606,-0.9991645812988281,-1.0724695920944214,-1.1313174962997437,-1.176010012626648,-1.2069584131240845,-1.2245081663131714,-1.228843331336975,-1.2200183868408203,-1.1981042623519897,-1.163373351097107,-1.1164315938949585,-1.0582294464111328,-0.9899420738220215,-0.9127731323242188,-0.8277721405029297,-0.7357441782951355,-0.6372879147529602,-0.532932460308075,-0.42329826951026917,-0.3091975152492523,-0.19161933660507202,-0.07160031050443649,0.04996390640735626,0.17248286306858063,0.2957373559474945,0.4198151230812073,0.544939398765564,0.6712563633918762,0.7986629009246826,0.9267356395721436,1.054781436920166,1.1819794178009033,1.3075531721115112,1.4309061765670776,1.5516713857650757,1.6696656942367554,1.7847787141799927,1.8968451023101807,2.0055575370788574,2.110450267791748,2.2109572887420654,2.3065197467803955,2.396695852279663,2.4812376499176025,2.5601048469543457,2.6334173679351807,2.7013659477233887,2.764113426208496,2.8217151165008545,2.8740811347961426,2.9209861755371094,2.9621148109436035,2.99713134765625,3.0257463455200195,3.0477676391601562,3.063119411468506,3.0718307495117188,3.0739951133728027,3.0697216987609863,3.059091567993164,3.0421395301818848,3.018867015838623,2.9892823696136475,2.9534497261047363,2.9115238189697266,2.8637490272521973,2.810419797897339,2.7518115043640137,2.688107490539551,2.6193552017211914,2.54546856880188,2.466278553009033,2.381612777709961,2.2913689613342285,2.1955552101135254,2.0942795276641846,1.9876981973648071,1.8759469985961914,1.7590922117233276,1.637123703956604,1.5099982023239136,1.377714991569519,1.2403956651687622,1.0983376502990723,0.9520211815834045,0.8020731210708618,0.6492036581039429,0.49414345622062683,0.3376050889492035,0.18028001487255096,0.022868605330586433,-0.13387241959571838,-0.28908416628837585,-0.4417777955532074,-0.5908336639404297,-0.7350276112556458,-0.8730788826942444,-1.0037109851837158,-1.125715732574463,-1.2380106449127197,-1.3396813869476318,-1.429999589920044,-1.5084151029586792,-1.5745230913162231,-1.6280208826065063,-1.6686705350875854,-1.6962834596633911,-1.710734248161316,-1.7119978666305542,-1.7001913785934448,-1.6756000518798828,-1.6386754512786865,-1.590013027191162,-1.5303270816802979,-1.4604495763778687,-1.3813592195510864,-1.2942302227020264,-1.2004663944244385,-1.1016837358474731,-0.9996269941329956,-0.8960388898849487,-0.7925309538841248,-0.6905150413513184,-0.5912253856658936,-0.49581822752952576,-0.40548813343048096,-0.32152655720710754,-0.24527256190776825,-0.1779627948999405,-0.12054663151502609,-0.07355871796607971,-0.03712024167180061,-0.01107746921479702,0.004784523043781519,0.010555772110819817,0.006133073475211859,-0.00870074238628149,-0.03409596532583237,-0.06995056569576263,-0.1158158928155899,-0.1709376573562622,-0.23440328240394592,-0.30531302094459534,-0.3828856647014618,-0.46645110845565796,-0.555347204208374,-0.6487877368927002,-0.7457787394523621,-0.8451282978057861,-0.9455406069755554,-1.0457429885864258,-1.1445865631103516,-1.2410823106765747,-1.3343796730041504,-1.4237183332443237,-1.5083916187286377,-1.5877403020858765,-1.661164402961731,-1.7281343936920166,-1.7881850004196167,-1.840897798538208,-1.8858935832977295,-1.922851324081421,-1.9515554904937744,-1.9719493389129639,-1.9841651916503906,-1.9885191917419434,-1.9854810237884521,-1.9756513833999634,-1.9597724676132202,-1.938773274421692,-1.9138147830963135,-1.8862862586975098,-1.857724905014038,-1.8296761512756348,-1.803554654121399,-1.7805768251419067,-1.7617988586425781,-1.7482324838638306,-1.7409495115280151,-1.7410839796066284,-1.7496907711029053,-1.767508625984192,-1.7947497367858887,-1.8310515880584717,-1.8756542205810547,-1.927752137184143,-1.9868632555007935,-2.0530266761779785,-2.1267106533050537,-2.208451271057129,-2.298383951187134,-2.395900249481201,-2.499603033065796,-2.6076035499572754,-2.7180235385894775,-2.8294715881347656,-2.9412624835968018,-3.0532851219177246,-3.1655848026275635,-3.2778682708740234,-3.3891654014587402,-3.4977939128875732,-3.6016154289245605,-3.6984364986419678,-3.7863385677337646,-3.8637871742248535,-3.9294862747192383,-3.982083797454834,-4.019906997680664,-4.040878772735596,-4.042674541473389,-4.023049354553223,-3.9801950454711914,-3.9129810333251953,-3.820992946624756,-3.7044007778167725,-3.5637457370758057,-3.3997693061828613,-3.2133612632751465,-3.0056312084198,-2.7780375480651855,-2.532484769821167,-2.2713162899017334,-1.997186303138733,-1.7128562927246094,-1.4209940433502197,-1.124047875404358,-0.8242359161376953,-0.5236340165138245,-0.22431029379367828,0.07156242430210114,0.3616654872894287,0.6435785293579102,0.9148833155632019,1.1732800006866455,1.4166715145111084,1.6431949138641357,1.8512070178985596,2.0392556190490723,2.2060658931732178,2.3505594730377197,2.471895217895508,2.5695083141326904,2.6431238651275635,2.6927356719970703,2.7185628414154053,2.721010684967041,2.700653553009033,2.658250093460083,2.5947673320770264,2.5113930702209473,2.4095146656036377,2.2906641960144043,2.156451463699341,2.008514165878296,1.8484984636306763,1.6780749559402466,1.4989644289016724,1.312949776649475,1.1218609809875488,0.9275366067886353,0.7317849397659302,0.5363625884056091,0.34297657012939453,0.15329329669475555,-0.031070103868842125,-0.2085912674665451,-0.3779200315475464,-0.5379594564437866,-0.6879110932350159,-0.8272586464881897,-0.9556900858879089,-1.0729923248291016,-1.1789636611938477,-1.2733803987503052,-1.3560245037078857,-1.4267464876174927,-1.4855237007141113,-1.5324784517288208,-1.5678502321243286,-1.5919417142868042,-1.6050752401351929,-1.6075862646102905,-1.5998613834381104,-1.5823951959609985,-1.5558357238769531,-1.5209887027740479,-1.4787768125534058,-1.4301702976226807,-1.376121163368225,-1.3175209760665894,-1.2551926374435425,-1.189901351928711,-1.1223676204681396,-1.0532655715942383,-0.9832058548927307,-0.9127159118652344,-0.8422295451164246,-0.772095799446106,-0.7026021480560303,-0.633999764919281,-0.5665193796157837,-0.5003741979598999,-0.43575501441955566,-0.37282830476760864,-0.31174391508102417,-0.25265103578567505,-0.19571377336978912,-0.14111687242984772,-0.08905871957540512,-0.03973710909485817,0.006662271451205015,0.049966953694820404,0.09001023322343826,0.1266249269247055,0.15964992344379425,0.18895332515239716,0.21446365118026733,0.23619157075881958,0.25422558188438416,0.2686989903450012,0.2797428369522095,0.2874508202075958,0.2918800711631775,0.2930923402309418,0.29121649265289307,0.2864980101585388,0.2793039083480835,0.27007514238357544,0.2592475414276123,0.247184619307518,0.23416174948215485,0.22041603922843933,0.20623910427093506,0.19206339120864868,0.1784914880990982,0.1662459820508957,0.1560584157705307,0.14854945242404938,0.14415787160396576,0.14315076172351837,0.14570322632789612,0.1519990861415863,0.16229210793972015,0.17689019441604614,0.19606658816337585,0.21994301676750183,0.248404860496521,0.2810915410518646,0.3174663186073303,0.3569290339946747,0.3989161252975464,0.4429421126842499,0.4885697364807129,0.5353323221206665,0.5826533436775208,0.6298035979270935,0.6759118437767029,0.7200167775154114,0.761128306388855,0.7982696294784546,0.8304888010025024,0.856848955154419,0.8764181137084961,0.8882765173912048,0.891545295715332,0.8854259252548218,0.8692371249198914,0.8424394130706787,0.8046508431434631,0.7556639909744263,0.6954717636108398,0.6242988705635071,0.5426246523857117,0.4511833190917969,0.35093382000923157,0.24300995469093323,0.12866860628128052,0.009253651835024357,-0.11382120102643967,-0.23908370733261108,-0.3650278151035309,-0.49016210436820984,-0.6130727529525757,-0.7324730157852173,-0.8472115397453308,-0.9562293887138367,-1.0584882497787476,-1.1529128551483154,-1.23839271068573,-1.3138574361801147,-1.3783981800079346,-1.4313756227493286,-1.4724516868591309,-1.5015175342559814,-1.518546462059021,-1.5234445333480835,-1.5159807205200195,-1.495844841003418,-1.4628158807754517,-1.4169626235961914,-1.3587827682495117,-1.2892086505889893,-1.2094806432724,-1.1209572553634644,-1.024962067604065,-0.9227493405342102,-0.8156053423881531,-0.7050224542617798,-0.5928417444229126,-0.4812668561935425,-0.3727143406867981,-0.2695470154285431,-0.1737976372241974,-0.08699780702590942,-0.010179205797612667,0.05596607178449631,0.11085177212953568,0.15380576252937317,0.18400944769382477,0.2005898654460907,0.20281101763248444,0.19026510417461395,0.16296781599521637,0.12131135910749435,0.0658990889787674,-0.002658189507201314,-0.08388817310333252,-0.17747919261455536,-0.28317272663116455,-0.40058189630508423,-0.5290241837501526,-0.6674473285675049,-0.8144806623458862,-0.9685823917388916,-1.1282100677490234,-1.2919294834136963,-1.4584132432937622,-1.6263322830200195,-1.7941995859146118,-1.9602504968643188,-2.122427463531494,-2.278488874435425,-2.426204204559326,-2.5635547637939453,-2.6888620853424072,-2.8007988929748535,-2.8982961177825928,-2.9804060459136963,-3.0462050437927246,-3.094787836074829,-3.1253662109375,-3.137422800064087,-3.130849838256836,-3.106003999710083,-3.0636560916900635,-3.004852533340454,-2.9307525157928467,-2.842503070831299,-2.74118971824646,-2.6278634071350098,-2.503602981567383,-2.3695690631866455,-2.227008581161499,-2.077208995819092,-1.921424150466919,-1.7608134746551514,-1.596421480178833,-1.4292118549346924,-1.2601344585418701,-1.090195655822754,-0.9205002188682556,-0.7522500157356262,-0.5867050886154175,-0.4251277446746826,-0.2687322795391083,-0.11865418404340744,0.024060286581516266,0.15845659375190735,0.2836805582046509,0.39900293946266174,0.503858208656311,0.5978864431381226,0.6809619665145874,0.7531968355178833,0.8149161338806152,0.8666122555732727,0.9088946580886841,0.9424479007720947,0.9680078625679016,0.9863541126251221,0.9983090162277222,1.0047324895858765,1.0065058469772339,1.0045045614242554,0.9995694160461426,0.9924848675727844,0.9839721322059631,0.9746965765953064,0.9652820825576782,0.9563239216804504,0.9483925104141235,0.9420263767242432,0.9377188682556152,0.9359027743339539,0.9369387626647949,0.9411090016365051,0.9486166834831238,0.9595907926559448,0.974096953868866,0.9921528697013855,1.013744592666626,1.0388363599777222,1.0673654079437256,1.0992177724838257,1.134189486503601,1.1719491481781006,1.2120205163955688,1.2537994384765625,1.2966078519821167,1.3397645950317383,1.3826494216918945,1.4247335195541382,1.4655678272247314,1.5047411918640137,1.541835069656372,1.5764045715332031,1.607999324798584,1.636217713356018,1.660766839981079,1.6815017461776733,1.6984224319458008,1.7116334438323975,1.7212847471237183,1.7275222539901733,1.730462908744812,1.7302002906799316,1.726824164390564,1.7204389572143555,1.711167573928833,1.699141025543213,1.684481143951416,1.6672910451889038,1.6476556062698364,1.62565279006958,1.6013679504394531,1.5749046802520752,1.5463923215866089,1.5159926414489746,1.4839082956314087,1.4503942728042603,1.4157618284225464,1.3803714513778687,1.3446110486984253,1.308870792388916,1.273528814315796,1.2389625310897827,1.205586552619934,1.1738996505737305,1.144515037536621,1.118151307106018,1.0955809354782104,1.0775558948516846,1.0647459030151367,1.0577175617218018,1.0569607019424438,1.0629396438598633,1.0761306285858154,1.0970149040222168,1.126023769378662,1.1634621620178223,1.2094546556472778,1.263942003250122,1.3267244100570679,1.3975154161453247,1.4759551286697388,1.5615568161010742,1.6536011695861816,1.7510385513305664,1.8524696826934814,1.9562476873397827,2.0606863498687744,2.1643025875091553,2.2659928798675537,2.3650741577148438,2.4611713886260986,2.5540151596069336,2.643251419067383,2.72834849357605,2.8086435794830322,2.8834869861602783,2.95239520072937,3.0151195526123047,3.071580171585083,3.1216909885406494,3.165153980255127,3.2013258934020996,3.229222536087036,3.247659206390381,3.2554690837860107,3.2517001628875732,3.235715866088867,3.207172155380249,3.165900945663452,3.111780881881714,3.0446648597717285,2.964407205581665,2.8709754943847656,2.764590263366699,2.6458234786987305,2.5155999660491943,2.3750996589660645,2.2255964279174805,2.068298101425171,1.9042493104934692,1.7343274354934692,1.5593206882476807,1.380043387413025,1.197433590888977,1.012588381767273,0.8267313838005066,0.6411325335502625,0.4570270776748657,0.27557092905044556,0.09784955531358719,-0.0750720351934433,-0.24209071695804596,-0.4020310342311859,-0.5536515712738037,-0.6956847310066223,-0.8268870711326599,-0.9460787177085876,-1.0521655082702637,-1.1441564559936523,-1.221197485923767,-1.2826292514801025,-1.328058123588562,-1.3574068546295166,-1.3709086179733276,-1.369032382965088,-1.3523598909378052,-1.3214677572250366,-1.2768707275390625,-1.2190544605255127,-1.1485801935195923,-1.0662007331848145,-0.9729200005531311,-0.8699554204940796,-0.758618950843811,-0.6401808261871338,-0.5157931447029114,-0.386520117521286,-0.25345906615257263,-0.1178801953792572,0.018708037212491035,0.15462952852249146,0.28824055194854736,0.41818419098854065,0.5435901284217834,0.6641321778297424,0.7799208760261536,0.8912842273712158,0.9985377788543701,1.1018431186676025,1.2011998891830444,1.2965494394302368,1.3879098892211914,1.475460410118103,1.559520959854126,1.6404407024383545,1.718456745147705,1.7935960292816162,1.8656718730926514,1.9343701601028442,1.9993770122528076,2.060481309890747,2.1176059246063232,2.1707613468170166,2.219959020614624,2.2651333808898926,2.3061163425445557,2.3426671028137207,2.374540328979492,2.40154767036438,2.423590898513794,2.4406538009643555,2.452768325805664,2.4599766731262207,2.4623076915740967,2.459768533706665,2.4523496627807617,2.440027952194214,2.4227685928344727,2.4005281925201416,2.373262405395508,2.3409435749053955,2.3035786151885986,2.2612199783325195,2.2139594554901123,2.1619107723236084,2.1051888465881348,2.043900489807129,1.9781529903411865,1.9080780744552612,1.8338555097579956,1.7557177543640137,1.673927903175354,1.5887315273284912,1.5003010034561157,1.4086912870407104,1.313825249671936,1.2155121564865112,1.1134904623031616,1.0074803829193115,0.897231936454773,0.7825613021850586,0.6633747220039368,0.5396862626075745,0.4116319715976715,0.27948105335235596,0.14364023506641388,0.004647937137633562,-0.1368434876203537,-0.2800942659378052,-0.42430761456489563,-0.5686591267585754,-0.7123228311538696,-0.8544931411743164,-0.9944037795066833,-1.131341814994812,-1.2646559476852417,-1.3937551975250244,-1.5181008577346802,-1.6371926069259644,-1.7505558729171753,-1.85773503780365,-1.9582923650741577,-2.0518112182617188,-2.137895345687866,-2.2161612510681152,-2.286224842071533,-2.3476858139038086,-2.400120258331299,-2.443086624145508,-2.4761459827423096,-2.4988932609558105,-2.5109851360321045,-2.5121617317199707,-2.5022549629211426,-2.4811899662017822,-2.448989152908325,-2.4057819843292236,-2.3518288135528564,-2.2875475883483887,-2.213541269302368,-2.1306099891662598,-2.0397439002990723,-1.9420983791351318,-1.8389531373977661,-1.731666922569275,-1.6216304302215576,-1.510223388671875,-1.3987772464752197,-1.288543462753296,-1.1806707382202148,-1.0761927366256714,-0.976028561592102,-0.8809942603111267,-0.7918192744255066,-0.7091595530509949,-0.6335994601249695,-0.5656405091285706,-0.5056806206703186,-0.4539961814880371,-0.410737007856369,-0.3759438395500183,-0.34958600997924805,-0.33160993456840515,-0.32198259234428406,-0.3207167387008667,-0.3278714120388031,-0.3435327410697937,-0.36778712272644043,-0.4007013142108917,-0.44231733679771423,-0.4926599860191345,-0.5517444610595703,-0.6195670962333679,-0.6960680484771729,-0.7810665965080261,-0.8741840720176697,-0.9747801423072815,-1.0819270610809326,-1.1944361925125122,-1.3109318017959595,-1.4299514293670654,-1.5500398874282837,-1.6698099374771118,-1.7879552841186523,-1.9032244682312012,-2.0143795013427734,-2.1201717853546143,-2.219358444213867,-2.310765266418457,-2.3933756351470947,-2.466417074203491,-2.529407262802124,-2.5821425914764404,-2.624634265899658,-2.65701961517334,-2.6794912815093994,-2.6922736167907715,-2.6956591606140137,-2.690086603164673,-2.6762166023254395,-2.6549670696258545,-2.62747859954834,-2.5950138568878174,-2.558825969696045,-2.52004337310791,-2.4796106815338135,-2.438305616378784,-2.3968138694763184,-2.355816602706909,-2.316049337387085,-2.2782976627349854,-2.2433278560638428,-2.2117862701416016,-2.18410325050354,-2.160449743270874,-2.140754222869873,-2.1247756481170654,-2.112189531326294,-2.102658748626709,-2.095856189727783,-2.0914454460144043,-2.0890352725982666,-2.088143825531006,-2.0881927013397217,-2.0885376930236816,-2.088522434234619,-2.0875244140625,-2.0849740505218506,-2.080334186553955,-2.0730509757995605,-2.062502384185791,-2.047966957092285,-2.028630495071411,-2.003628730773926,-1.9721049070358276,-1.9332612752914429,-1.8863840103149414,-1.830838918685913,-1.7660480737686157,-1.6914719343185425,-1.6066114902496338,-1.5110424757003784,-1.4044709205627441,-1.2867932319641113,-1.1581400632858276,-1.0188921689987183,-0.8696682453155518,-0.7112975120544434,-0.5447915196418762,-0.3713264465332031,-0.19223621487617493,-0.009008345194160938,0.1767282634973526,0.36323174834251404,0.5486908555030823,0.7312761545181274,0.9091892838478088,1.0807044506072998,1.2442020177841187,1.3982000350952148,1.5413846969604492,1.6726387739181519,1.791059970855713,1.8959556818008423,1.986815333366394,2.0632643699645996,2.125021457672119,2.1718780994415283,2.203716278076172,2.2205564975738525,2.2226150035858154,2.2103395462036133,2.1843950748443604,2.1455979347229004,2.0948169231414795,2.0328733921051025,1.9604856967926025,1.8782724142074585,1.7868140935897827,1.6867411136627197,1.578809380531311,1.4639276266098022,1.3431271314620972,1.2174867391586304,1.0880463123321533,0.9557433724403381,0.821395218372345,0.685727059841156,0.5494285821914673,0.4132108986377716,0.2778400778770447,0.14413820207118988,0.012957226485013962,-0.11485888063907623,-0.23850665986537933,-0.3572414815425873,-0.4703831076622009,-0.5773178339004517,-0.6775074601173401,-0.7705096006393433,-0.8560051321983337,-0.9338212013244629,-1.0039362907409668,-1.066461205482483,-1.1215970516204834,-1.1695842742919922,-1.2106564044952393,-1.2450156211853027,-1.2728333473205566,-1.2942707538604736,-1.3095078468322754,-1.3187637329101562,-1.3223003149032593,-1.3204089403152466,-1.3133869171142578,-1.3015165328979492,-1.285057544708252,-1.2642532587051392,-1.2393479347229004,-1.210602045059204,-1.1782989501953125,-1.142736792564392,-1.10420823097229,-1.0629780292510986,-1.0192649364471436,-0.9732338190078735,-0.9249981641769409,-0.8746259808540344,-0.8221448659896851,-0.7675416469573975,-0.7107603549957275,-0.6517016291618347,-0.5902320146560669,-0.5262041687965393,-0.4594871401786804,-0.39000019431114197,-0.3177416920661926,-0.24280759692192078,-0.16539651155471802,-0.08580318093299866,-0.004404550418257713,0.07835724204778671,0.1619919389486313,0.24597686529159546,0.32977092266082764,0.4128268361091614,0.49460160732269287,0.5745654106140137,0.6522101759910583,0.727059006690979,0.7986777424812317,0.8666855692863464,0.9307607412338257,0.9906337261199951,1.0460646152496338,1.0968043804168701,1.1425529718399048,1.1829270124435425,1.2174582481384277,1.245628833770752,1.2669419050216675,1.281005859375,1.2876073122024536,1.2867443561553955,1.2786110639572144,1.2635396718978882,1.241925835609436,1.214168906211853,1.1806493997573853,1.1417478322982788,1.0978888273239136,1.0495805740356445,0.9974241256713867,0.9420791864395142,0.8841982483863831,0.8243547081947327,0.762994110584259,0.7004271745681763,0.6368622183799744,0.572457492351532,0.5073667764663696,0.4417572617530823,0.3757959008216858,0.30961671471595764,0.24328961968421936,0.1768091768026352,0.11010854691267014,0.04309171810746193,-0.02433132752776146,-0.09221985936164856,-0.1605929434299469,-0.22943085432052612,-0.2986782491207123,-0.3682428002357483,-0.43798986077308655,-0.5077401995658875,-0.5772781372070312,-0.6463733315467834,-0.7148098349571228,-0.7824122309684753,-0.8490573167800903,-0.9146674275398254,-0.9791900515556335,-1.042573094367981,-1.1047461032867432,-1.1656111478805542,-1.2250392436981201,-1.2828669548034668,-1.3388851881027222,-1.3928227424621582,-1.4443297386169434,-1.4929687976837158,-1.5382219552993774,-1.5795104503631592,-1.6162235736846924,-1.6477512121200562,-1.673515796661377,-1.693005919456482,-1.7058117389678955,-1.7116608619689941,-1.7104454040527344,-1.702230453491211,-1.6872318983078003,-1.6657695770263672,-1.6382077932357788,-1.6049081087112427,-1.566213846206665,-1.522475242614746,-1.4740996360778809,-1.4216032028198242,-1.3656342029571533,-1.3069528341293335,-1.2463743686676025,-1.184700608253479,-1.1226695775985718,-1.0609462261199951,-1.0001533031463623,-0.9409211277961731,-0.8839263319969177,-0.8298959732055664,-0.779570996761322,-0.7336445450782776,-0.6927036643028259,-0.6571992039680481,-0.6274549961090088,-0.603706955909729,-0.5861504077911377,-0.5749713182449341,-0.5703478455543518,-0.5724248290061951,-0.5812754034996033,-0.5968704223632812,-0.6190683245658875,-0.6476283669471741,-0.6822370290756226,-0.722533106803894,-0.7681171894073486,-0.8185407519340515,-0.873278021812439,-0.9316927194595337,-0.9930128455162048,-1.0563242435455322,-1.120588779449463,-1.1846851110458374,-1.247462272644043,-1.3077976703643799,-1.3646444082260132,-1.4170626401901245,-1.4642279148101807,-1.5054243803024292,-1.5400265455245972,-1.5674844980239868,-1.587319016456604,-1.5991318225860596,-1.6026256084442139,-1.5976264476776123,-1.5840970277786255,-1.562132477760315,-1.5319385528564453,-1.493798017501831,-1.4480355978012085,-1.394993782043457,-1.335026741027832,-1.2685106992721558,-1.1958662271499634,-1.1175789833068848,-1.0342103242874146,-0.9463914632797241,-0.8548024892807007,-0.7601436376571655,-0.6631077527999878,-0.5643625855445862,-0.46454426646232605,-0.3642602860927582,-0.26409366726875305,-0.1646021157503128,-0.06630819290876389,0.030317481607198715,0.12487399578094482,0.21704213321208954,0.30658644437789917,0.3933481276035309,0.4772339463233948,0.5582064390182495,0.6362795233726501,0.7115176916122437,0.7840344905853271,0.8539842367172241,0.9215461015701294,0.9869028925895691,1.0502228736877441,1.1116504669189453,1.1713109016418457,1.229323387145996,1.2858150005340576,1.340925931930542,1.3948004245758057,1.4475650787353516,1.4993046522140503,1.5500439405441284,1.599745750427246,1.6483229398727417,1.6956599950790405,1.7416306734085083,1.7861062288284302,1.8289477825164795,1.8699904680252075,1.9090262651443481,1.9457979202270508,1.9800066947937012,2.011333703994751,2.03946852684021,2.0641331672668457,2.0850987434387207,2.1021878719329834,2.1152701377868652,2.1242551803588867,2.1290926933288574,2.1297788619995117,2.1263720989227295,2.1190056800842285,2.1078972816467285,2.093341827392578,2.075693368911743,2.0553393363952637,2.032676935195923,2.008100748062134,1.982007622718811,1.9548137187957764,1.92697274684906,1.8989828824996948,1.8713730573654175,1.8446675539016724,1.8193409442901611,1.7957813739776611,1.774275302886963,1.7550225257873535,1.738171100616455,1.7238528728485107,1.7122001647949219,1.7033298015594482,1.6973000764846802,1.6940590143203735,1.693412184715271,1.6950281858444214,1.698486089706421,1.7033485174179077,1.7092283964157104,1.7158217430114746,1.7228912115097046,1.7302076816558838,1.7374757528305054,1.7442799806594849,1.7500741481781006,1.754223108291626,1.7560774087905884,1.7550498247146606,1.7506643533706665,1.7425594329833984,1.7304528951644897,1.714093804359436,1.6932326555252075,1.6676322221755981,1.637121319770813,1.6016725301742554,1.561471939086914,1.516950249671936,1.4687615633010864,1.417717695236206,1.364704966545105,1.3106179237365723,1.2563329935073853,1.2027313709259033,1.1507513523101807,1.1014424562454224,1.0559871196746826,1.015674352645874,0.9818248748779297,0.9556892514228821,0.9383507966995239,0.930657684803009,0.9331972599029541,0.9463059902191162,0.9700972437858582,1.0044862031936646,1.0492006540298462],"displacement":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7.990908534399179e-22,1.9023476980027685e-18,1.1691871056658965e-16,2.0808910184430627e-15,1.9279987762549355e-14,1.185822544758769e-13,5.499790076482491e-13,2.0745941856775696e-12,6.6821144971418445e-12,1.8997638531748073e-11,4.881597209793753e-11,1.1536711863602278e-10,2.54107040964513e-10,5.270380243338479e-10,1.0377889658741424e-9,1.952922046299932e-9,3.5311742418997483e-9,6.16259265839858e-9,1.0419760165802927e-8,1.7123568341048667e-8,2.7426217741322034e-8,4.2914425790741006e-8,6.573605304538432e-8,9.875370210465917e-8,1.4572920292721392e-7,2.1154319540528377e-7,3.024543389074097e-7,4.264025506017788e-7,5.933609372732462e-7,8.157393267538282e-7,0.0000011088426390415407,0.0000014913824770701467,0.000001986041752388701,0.0000026200830234301975,0.0000034259919630130753,0.000004442136742000002,0.000005713423888664693,0.000007291921519936295,0.000009237413905793801,0.000011617859854595736,0.000014509714674204588,0.000017998087059822865,0.000022176718630362302,0.00002714776564971544,0.00003302140976302326,0.00003991532139480114,0.000047953992179827765,0.00005726804738515057,0.00006799354741815478,0.00008027135481825098,0.00009424661402590573,0.0001100683439290151,0.0001278891577385366,0.0001478649937780574,0.00017015478806570172,0.0001949199941009283,0.0002223237243015319,0.000252529454883188,0.00028569911955855787,0.0003219906357116997,0.0003615546738728881,0.0004045309033244848,0.00045104362652637064,0.0005011969478800893,0.0005550699424929917,0.0006127117085270584,0.0006741366814821959,0.0007393212290480733,0.0008082005078904331,0.0008806675323285162,0.0009565731743350625,0.0010357281425967813,0.0011179058346897364,0.0012028464116156101,0.0012902619782835245,0.001379840774461627,0.001471252995543182,0.0015641542850062251,0.001658190623857081,0.0017530007753521204,0.0018482188461348414,0.0019434752175584435,0.002038397127762437,0.0021326085552573204,0.002225728239864111,0.0023173706140369177,0.0024071447551250458,0.002494655316695571,0.0025795043911784887,0.002661295235157013,0.002739635994657874,0.0028141457587480545,0.002884458750486374,0.002950231544673443,0.003011148888617754,0.003066928358748555,0.003117327345535159,0.003162146545946598,0.003201233921572566,0.0032344891224056482,0.0032618646509945393,0.0032833670265972614,0.0032990577165037394,0.003309052437543869,0.003313519526273012,0.003312678076326847,0.003306796308606863,0.003296187147498131,0.003281205426901579,0.0032622432336211205,0.00323972525075078,0.0032141038682311773,0.003185852197930217,0.003155458252876997,0.0031234174966812134,0.0030902253929525614,0.003056369489058852,0.003022321965545416,0.002988533116877079,0.002955425065010786,0.002923386637121439,0.002892770105972886,0.0028638888616114855,0.0028370164800435305,0.0028123874217271805,0.002790197730064392,0.0027706080581992865,0.0027537450660020113,0.002739703981205821,0.0027285516262054443,0.002720325719565153,0.0027150376699864864,0.0027126718778163195,0.002713184803724289,0.002716503804549575,0.0027225264348089695,0.0027311176527291536,0.0027421105187386274,0.0027553040999919176,0.002770465100184083,0.00278732948936522,0.0028056057635694742,0.002824979368597269,0.002845119684934616,0.0028656856156885624,0.0028863330371677876,0.002906723879277706,0.0029265317134559155,0.002945449436083436,0.002963194390758872,0.0029795130249112844,0.0029941843822598457,0.0030070210341364145,0.003017870243638754,0.0030266139656305313,0.003033166518434882,0.0030374745838344097,0.003039513947442174,0.003039288567379117,0.0030368284787982702,0.0030321881640702486,0.0030254449229687452,0.0030166974756866693,0.0030060638673603535,0.002993680303916335,0.002979697659611702,0.0029642798472195864,0.002947599859908223,0.0029298365116119385,0.0029111700132489204,0.002891778014600277,0.0028718309476971626,0.002851488534361124,0.0028308951295912266,0.0028101771604269743,0.0027894394006580114,0.002768763108178973,0.002748203929513693,0.002727790270000696,0.0027075232937932014,0.002687375992536545,0.002667294116690755,0.0026471964083611965,0.002626977860927582,0.0026065108831971884,0.0025856480933725834,0.00256422720849514,0.002542072907090187,0.0025190026499330997,0.0024948299396783113,0.0024693692103028297,0.002442439552396536,0.0024138682056218386,0.0023834933526813984,0.002351167844608426,0.002316758967936039,0.00228015030734241,0.0022412424441426992,0.0021999520249664783,0.0021562124602496624,0.0021099725272506475,0.002061196370050311,0.002009863266721368,0.0019559673964977264,0.0018995190039277077,0.0018405443988740444,0.0017790881684049964,0.001715214690193534,0.0016490105772390962,0.0015805861912667751,0.0015100775053724647,0.0014376466860994697,0.0013634830247610807,0.0012878013076260686,0.0012108406517654657,0.00113286217674613,0.0010541458614170551,0.0009749875171110034,0.0008956948295235634,0.0008165838080458343,0.0007379745366051793,0.0006601875647902489,0.0005835400079376996,0.0005083416472189128,0.0004348918446339667,0.0003634761378634721,0.00029436350450851023,0.0002278037864016369,0.00016402540495619178,0.00010323347669327632,0.000045608350774273276,-0.000008695545147929806,-0.00005955020969850011,-0.00010685411689337343,-0.000150531719555147,-0.00019053254800383002,-0.00022682975395582616,-0.0002594184479676187,-0.0002883137494791299,-0.000313548487611115,-0.00033517112024128437,-0.000353243260178715,-0.00036783769610337913,-0.00037903623888269067,-0.0003869280917569995,-0.00039160854066722095,-0.00039317781920544803,-0.0003917406720574945,-0.00038740603486076,-0.00038028735434636474,-0.000370502908481285,-0.0003581767377909273,-0.0003434396057855338,-0.00032642990117892623,-0.0003072947438340634,-0.00028619077056646347,-0.00026328462990932167,-0.00023875318584032357,-0.000212783386814408,-0.00018557172734290361,-0.00015732337487861514,-0.00012825103476643562,-0.00009857358963927254,-0.00006851452781120315,-0.000038300277083180845,-0.000008158514901879244,0.000021683576051145792,0.00005100094131194055,0.00007957220077514648,0.00010718101839302108,0.00013361730088945478,0.0001586782600497827,0.0001821692567318678,0.00020390459394548088,0.0002237082808278501,0.0002414149057585746,0.00025687055313028395,0.0002699341857805848,0.0002804791438393295,0.000288395065581426,0.0002935900120064616,0.0002959928533528,0.00029555545188486576,0.00029225496109575033,0.0002860956883523613,0.0002771106956060976,0.00026536264340393245,0.00025094428565353155,0.00023397829500027,0.00021461628784891218,0.00019303754379507154,0.00016944693925324827,0.00014407263370230794,0.00011716346489265561,0.00008898601663531736,0.000059821664763148874,0.000029963495762785897,-2.869472837119247e-7,-0.00003062300311285071,-0.00006073648910387419,-0.0000903215041034855,-0.00011907849693670869,-0.00014671852113679051,-0.0001729676587274298,-0.00019757133850362152,-0.00022029856336303055,-0.00024094563559629023,-0.0002593392273411155,-0.0002753387379925698,-0.00028883747290819883,-0.00029976278892718256,-0.0003080753958784044,-0.00031376726110465825,-0.00031685936846770346,-0.00031739845871925354,-0.0003154539444949478,-0.0003111149126198143,-0.00030448733014054596,-0.0002956919197458774,-0.0002848625008482486,-0.0002721453201957047,-0.0002576984406914562,-0.000241692119743675,-0.00022430889657698572,-0.00020574415975715965,-0.00018620620539877564,-0.00016591607709415257,-0.00014510662003885955,-0.00012402098218444735,-0.00010291022044839337,-0.00008203008474083617,-0.00006163721991470084,-0.00004198472015559673,-0.00002331741234229412,-0.0000058670566431828775,0.000010152309187105857,0.000024548628061893396,0.0000371555688616354,0.000047835605073487386,0.00005648241494782269,0.00006302254769252613,0.0000674163966323249,0.00006965848297113553,0.00006977713201195002,0.00006783346907468513,0.00006391992792487144,0.00005815808617626317,0.00005069603867013939,0.00004170519969193265,0.0000313766322506126,0.000019916957171517424,0.000007543934316345258,-0.000005518113994185114,-0.000019042880012420937,-0.000032806456147227436,-0.00004659136538975872,-0.000060190042859176174,-0.00007340770389419049,-0.00008606452320236713,-0.00009799707913771272,-0.00010905916860792786,-0.0001191220071632415,-0.00012807401071768254,-0.00013582018436864018,-0.00014228152576833963,-0.00014739428297616541,-0.00015110957610886544,-0.00015339309175033122,-0.0001542253594379872,-0.0001536021300125867,-0.000151535336044617,-0.00014805406681261957,-0.0001432058197678998,-0.0001370577228954062,-0.00012969750969205052,-0.00012123432679800317,-0.00011179882130818442,-0.00010154268238693476,-0.00009063730976777151,-0.00007927168917376548,-0.00006764941645087674,-0.00005598500501946546,-0.00004449959669727832,-0.00003341635238029994,-0.00002295563717780169,-0.000013330299225344788,-0.000004741175416711485,0.0000026269904083164874,0.000008609106771473307,0.000013062709513178561,0.000015870320567046292,0.000016941214198595844,0.000016212603441090323,0.000013650306755152997,0.000009248920832760632,0.000003031514779650024,-0.000004951141363562783,-0.0000146218089867034,-0.000025878483938868158,-0.00003859654680127278,-0.000052631334256147966,-0.00006782112177461386,-0.00008399035868933424,-0.00010095323523273692,-0.0001185173459816724,-0.00013648737512994558,-0.00015466884360648692,-0.00017287160153500736,-0.00019091316789854318,-0.0002086217573378235,-0.0002258390304632485,-0.0002424225240247324,-0.00025824783369898796,-0.00027321052039042115,-0.0002872278855647892,-0.00030024044099263847,-0.00031221340759657323,-0.00032313770498149097,-0.00033303102827630937,-0.0003419383428990841,-0.00034993182634934783,-0.00035711037344299257,-0.00036359831574372947,-0.000369543326087296,-0.00037511350819841027,-0.0003804939042311162,-0.00038588233292102814,-0.00039148511132225394,-0.0003975125146098435,-0.0004041744687128812,-0.00041167662129737437,-0.0004202171985525638,-0.0004299841239117086,-0.00044115333002991974,-0.000453887420007959,-0.00046833534725010395,-0.000484632357256487,-0.0005029004532843828,-0.0005232488620094955,-0.000545774819329381,-0.0005705634830519557,-0.0005976881366223097,-0.0006272091413848102,-0.0006591730052605271,-0.0006936105201020837,-0.0007305348408408463,-0.0007699390989728272,-0.0008117944234982133,-0.0008560479618608952,-0.000902621541172266,-0.0009514110279269516,-0.0010022863280028105,-0.0010550923179835081,-0.001109651057049632,-0.001165763707831502,-0.001223214901983738,-0.0012817763490602374,-0.0013412116095423698,-0.00140128075145185,-0.0014617457054555416,-0.0015223745722323656,-0.0015829467447474599,-0.0016432564007118344,-0.0017031164607033134,-0.001762360567227006,-0.0018208452966064215,-0.0018784509738907218,-0.001935081323608756,-0.001990662654861808,-0.002045141998678446,-0.0020984853617846966,-0.002150674117729068,-0.002201703144237399,-0.0022515763994306326,-0.0023003057576715946,-0.0023479070514440536,-0.002394398208707571,-0.0024397973902523518,-0.0024841208942234516,-0.002527383156120777,-0.0025695941876620054,-0.002610760508105159,-0.0026508846785873175,-0.0026899639051407576,-0.0027279923669993877,-0.0027649588882923126,-0.0028008485678583384,-0.0028356416150927544,-0.0028693138156086206,-0.002901835599914193,-0.002933172043412924,-0.002963281935080886,-0.0029921175446361303,-0.003019624389708042,-0.0030457412358373404,-0.0030703996308147907,-0.0030935260001569986,-0.0031150411814451218,-0.0031348629854619503,-0.003152907593175769,-0.0031690914183855057,-0.003183332970365882,-0.003195554483681917,-0.003205684246495366,-0.0032136566005647182,-0.003219414036720991,-0.003222906729206443,-0.003224093234166503,-0.003222940256819129,-0.0032194226514548063,-0.003213522955775261,-0.0032052313908934593,-0.003194547025486827,-0.003181476378813386,-0.003166036680340767,-0.003148255404084921,-0.0031281737610697746,-0.0031058471649885178,-0.003081348491832614,-0.0030547701753675938,-0.003026225371286273,-0.002995850285515189,-0.002963804407045245,-0.002930270740762353,-0.002895455341786146,-0.0028595845215022564,-0.00282290275208652,-0.0027856689412146807,-0.002748152008280158,-0.002710625994950533,-0.002673365408554673,-0.0026366394013166428,-0.002600706648081541,-0.002565811388194561,-0.002532178768888116,-0.00250001042149961,-0.0024694823659956455,-0.002440741518512368,-0.002413904992863536,-0.002389059169217944,-0.0023662587627768517,-0.002345529617741704,-0.0023268694058060646,-0.0023102504201233387,-0.0022956226021051407,-0.002282916335389018,-0.0022720445413142443,-0.0022629061713814735,-0.0022553878370672464,-0.00224936637096107,-0.002244710922241211,-0.0022412848193198442,-0.0022389478981494904,-0.002237558364868164,-0.0022369727957993746,-0.0022370461374521255,-0.0022376300767064095,-0.0022385737393051386,-0.002239721594378352,-0.0022409146185964346,-0.002241991925984621,-0.002242791699245572,-0.0022431539837270975,-0.0022429204545915127,-0.002241935348138213,-0.002240045927464962,-0.002237101783975959,-0.00223295739851892,-0.0022274740040302277,-0.0022205219138413668,-0.002211983548477292,-0.0022017527371644974,-0.002189735183492303,-0.0021758454386144876,-0.002160007134079933,-0.002142152516171336,-0.002122223610058427,-0.00210017547942698,-0.002075975527986884,-0.0020496039651334286,-0.0020210493821650743,-0.001990304794162512,-0.001957364147529006,-0.0019222222035750747,-0.0018848766339942813,-0.00184533279389143,-0.001803605817258358,-0.0017597218975424767,-0.0017137130489572883,-0.0016656111693009734,-0.0016154433833435178,-0.0015632305294275284,-0.0015089925145730376,-0.001452757976949215,-0.0013945724349468946,-0.0013345035258680582,-0.001272637047804892,-0.0012090664822608232,-0.0011438794899731874,-0.0010771475499495864,-0.0010089235147461295,-0.0009392492938786745,-0.0008681687759235501,-0.0007957433699630201,-0.000722061435226351,-0.000647239969111979,-0.0005714181461371481,-0.0004947476554661989,-0.00041738440631888807,-0.00033948561758734286,-0.00026121261180378497,-0.00018273681052960455,-0.00010424466745462269,-0.00002593837598396931,0.000051968443585792556,0.0001292578235734254,0.00020571405184455216,0.00028112702420912683,0.0003552915877662599,0.0004280049470253289,0.0004990643355995417,0.0005682678893208504,0.0006354181095957756,0.000700326927471906,0.0007628189050592482,0.0008227306534536183,0.0008799073402769864,0.0009341968689113855,0.0009854461532086134,0.0010335014667361975,0.0010782121680676937,0.0011194379767403007,0.001157055259682238,0.0011909606400877237,0.001221071113832295,0.001247322652488947,0.0012696684570983052,0.0012880807043984532,0.0013025555526837707,0.001313119544647634,0.001319835428148508,0.0013228042516857386,0.0013221639674156904,0.0013180839596316218,0.0013107594568282366,0.001300406758673489,0.0012872612569481134,0.0012715775519609451,0.001253628171980381,0.0012337015941739082,0.0012120967730879784,0.0011891156900674105,0.0011650568339973688,0.0011402106611058116,0.0011148598277941346,0.0010892811696976423,0.0010637494269758463,0.001038538059219718,0.0010139174992218614,0.000990149099379778,0.0009674779139459133,0.0009461264708079398,0.0009262921521440148,0.0009081487660296261,0.0008918505627661943,0.0008775375899858773,0.0008653381373733282,0.0008553689694963396,0.0008477320079691708,0.0008425101987086236,0.0008397650672122836,0.0008395377662964165,0.0008418536745011806,0.0008467297884635627,0.0008541819988749921,0.0008642296306788921,0.0008768963743932545,0.0008922065608203411,0.000910178991034627,0.0009308206499554217,0.0009541225736029446,0.0009800588013604283,0.0010085887042805552,0.001039662049151957,0.0010732227237895131,0.0011092117056250572,0.0011475676437839866,0.0011882239487022161,0.0012311062309890985,0.0012761291582137346,0.0013231952907517552,0.0013721968280151486,0.001423018635250628,0.0014755424344912171,0.00152965122833848,0.001585231046192348,0.0016421721084043384,0.001700366847217083,0.0017597073456272483,0.0018200824270024896,0.0018813750939443707,0.0019434615969657898,0.002006211318075657,0.0020694886334240437,0.0021331552416086197,0.0021970723755657673,0.0022611026652157307,0.002325110835954547,0.002388963708654046,0.0024525290355086327,0.002515675500035286,0.002578271320089698,0.002640185412019491,0.002701289253309369,0.0027614582795649767,0.002820573514327407,0.002878522267565131,0.0029351969715207815,0.0029904916882514954,0.0030443009454756975,0.003096515778452158,0.0031470241956412792,0.003195710713043809,0.003242459148168564,0.0032871542498469353,0.003329683793708682,0.003369938815012574,0.0034078124444931746,0.003443198511376977,0.0034759899135679007,0.0035060790833085775,0.003533359384164214,0.0035577290691435337,0.003579093609005213,0.003597371047362685,0.003612492699176073,0.0036244054790586233,0.0036330714356154203,0.003638466587290168,0.003640582086518407,0.003639423754066229,0.003635014407336712,0.00362739572301507,0.0036166319623589516,0.003602811135351658,0.00358604802750051,0.0035664839670062065,0.003544286359101534,0.003519646357744932,0.0034927763044834137,0.00346390507183969,0.0034332755021750927,0.0034011397510766983,0.0033677578903734684,0.0033333946485072374,0.0032983203418552876,0.0032628076151013374,0.0032271312084048986,0.003191565163433552,0.0031563788652420044,0.003121834248304367,0.0030881823040544987,0.003055660519748926,0.0030244896188378334,0.0029948726296424866,0.002966989064589143,0.0029409925919026136,0.0029170047491788864,0.0028951121494174004,0.0028753646183758974,0.0028577768243849277,0.002842332236468792,0.002828986616805196,0.0028176710475236177,0.00280829262919724,0.0028007319197058678,0.0027948422357439995,0.002790450118482113,0.002787358593195677,0.0027853548526763916,0.0027842202689498663,0.00278373621404171,0.0027836880180984735,0.002783865435048938,0.0027840572874993086,0.0027840486727654934,0.002783621195703745,0.0027825552970170975,0.0027806370053440332,0.0027776651550084352,0.002773456508293748,0.002767846453934908,0.002760688541457057,0.0027518512215465307,0.0027412159834057093,0.0027286799158900976,0.0027141582686454058,0.002697589108720422,0.0026789368130266666,0.002658192766830325,0.0026353735011070967,0.0026105178985744715,0.0025836837012320757,0.002554945880547166,0.0025243943091481924,0.0024921330623328686,0.002458279486745596,0.0024229625705629587,0.0023863217793405056,0.0023485058918595314,0.0023096713703125715,0.0022699825931340456,0.0022296097595244646,0.0021887256298214197,0.0021475020330399275,0.0021061066072434187,0.002064698375761509,0.002023425418883562,0.001982421614229679,0.001941803959198296,0.0019016670994460583,0.0018620796035975218,0.0018230791902169585,0.0017846709815785289,0.001746829249896109,0.001709501026198268,0.0016726094763725996,0.0016360566951334476,0.0015997228911146522,0.001563465571962297,0.0015271188458427787,0.0014904977288097143,0.0014534069923684,0.0014156533870846033,0.0013770554214715958,0.0013374490663409233,0.0012966837966814637,0.0012546140933409333,0.001211088616400957,0.0011659449664875865,0.001119012595154345,0.001070125843398273,0.0010191401233896613,0.0009659456554800272,0.0009104729979299009,0.000852687400765717,0.0007925758836790919,0.0007301330333575606,0.0006653534364886582,0.0005982333677820861,0.0005287819658406079,0.00045703627984039485,0.00038307366776280105,0.00030701738432981074,0.00022903394710738212,0.0001493257295805961,0.0000681242163409479,-0.000014312116036307998,-0.00009769359166966751,-0.00018169140093959868,-0.00026593043003231287,-0.0003499873564578593,-0.00043339599505998194,-0.0005156593979336321,-0.000596264551859349,-0.0006746962899342179,-0.0007504471577703953,-0.0008230233797803521,-0.0008919480023905635,-0.0009567648521624506,-0.0010170441819354892,-0.0010723910527303815,-0.0011224552290514112,-0.0011669385712593794,-0.0012055998668074608,-0.0012382547138258815,-0.0012647721450775862,-0.0012850695056840777,-0.0012991090770810843,-0.0013068958651274443,-0.0013084786478430033,-0.0013039534678682685,-0.001293465495109558,-0.0012772107729688287,-0.0012554344721138477,-0.0012284277472645044,-0.0011965231969952583,-0.0011600895086303353,-0.0011195277329534292,-0.001075267675332725,-0.0010277631226927042,-0.0009774882346391678,-0.0009249320137314498,-0.0008705919608473778,-0.0008149684872478247,-0.0007585597923025489,-0.0007018573815003037,-0.0006453427486121655,-0.000589483417570591,-0.000534728926140815,-0.00048150646034628153,-0.00043021628516726196,-0.0003812281647697091,-0.0003348789468873292,-0.00029147163149900734,-0.0002512750797905028,-0.00021452353394124657,-0.00018141602049581707,-0.00015211505524348468,-0.0001267454499611631,-0.00010539373761275783,-0.00008810842700768262,-0.00007490083953598514,-0.00006574626604560763,-0.000060584850871236995,-0.00005932249405304901,-0.00006183228106237948,-0.00006795722583774477,-0.00007751472730888054,-0.00009030241199070588,-0.00010610430035740137,-0.00012469595822039992,-0.00014584769087377936,-0.000169325532624498,-0.00019489113765303046,-0.0002223014598712325,-0.00025130948051810265,-0.000281666376395151,-0.00031312427017837763,-0.00034543927176855505,-0.00037837307900190353,-0.0004116940835956484,-0.0004451774584595114,-0.0004786057397723198,-0.0005117706023156643,-0.0005444756243377924,-0.0005765394307672977,-0.0006077988655306399,-0.0006381106213666499,-0.000667351414449513,-0.0006954172858968377,-0.0007222220883704722,-0.0007476962637156248,-0.0007717856205999851,-0.0007944505196064711,-0.0008156648837029934,-0.0008354143355973065,-0.0008536946261301637,-0.0008705095387995243,-0.0008858695509843528,-0.0008997906697914004,-0.0009122939081862569,-0.0009234048193320632,-0.000933153263758868,-0.0009415728854946792,-0.0009487004717811942,-0.0009545758948661387,-0.0009592424612492323,-0.0009627467952668667,-0.0009651398286223412,-0.0009664764511398971,-0.0009668157435953617,-0.0009662202792242169,-0.0009647563565522432,-0.0009624935919418931,-0.0009595051524229348,-0.0009558672900311649,-0.0009516584104858339,-0.0009469575597904623,-0.000941842736210674,-0.0009363894932903349,-0.0009306707070209086,-0.0009247566922567785,-0.0009187163668684661,-0.000912617368157953,-0.0009065256454050541,-0.0009005031315609813,-0.0008946054731495678,-0.000888879643753171,-0.0008833634783513844,-0.0008780862553976476,-0.0008730707922950387,-0.0008683346095494926,-0.0008638898725621402,-0.0008597413543611765,-0.0008558831177651882,-0.0008522950811311603,-0.0008489419124089181,-0.0008457740186713636,-0.0008427306893281639,-0.000839743937831372,-0.0008367413538508117,-0.0008336469763889909,-0.0008303803042508662,-0.0008268548990599811,-0.0008229780360125005,-0.0008186526829376817,-0.0008137817494571209,-0.0008082730346359313,-0.0008020438835956156,-0.0007950237486511469,-0.0007871542475186288,-0.0007783879991620779,-0.0007686871103942394,-0.000758022943045944,-0.0007463775691576302,-0.0007337467395700514,-0.0007201428525149822,-0.0007055975147522986,-0.0006901628221385181,-0.0006739113014191389,-0.0006569356773979962,-0.000639348232652992,-0.0006212807493284345,-0.000602884276304394,-0.0005843288381583989,-0.0005658018053509295,-0.0005475060315802693,-0.0005296572926454246,-0.0005124808521941304,-0.0004962080856785178,-0.0004810728132724762,-0.00046730655594728887,-0.0004551335296127945,-0.0004447652609087527,-0.0004363956395536661,-0.00043019658187404275,-0.0004263150622136891,-0.0004248709010425955,-0.0004259551933500916,-0.0004296289407648146,-0.0004359220329206437,-0.00044483307283371687,-0.0004563302791211754,-0.0004703536396846175,-0.0004868178511969745,-0.0005056146765127778,-0.0005266140797175467,-0.0005496641388162971,-0.0005745901726186275,-0.0006011944497004151,-0.0006292584585025907,-0.0006585474475286901,-0.0006888165371492505,-0.0007198162493295968,-0.00075129623292014,-0.0007830048562027514,-0.0008146872860379517,-0.0008460826938971877,-0.0008769244886934757,-0.000906944100279361,-0.0009358787792734802,-0.0009634806774556637,-0.0009895251132547855,-0.0010138144716620445,-0.0010361794847995043,-0.0010564777767285705,-0.0010745929321274161,-0.0010904371738433838,-0.0011039573000743985,-0.001115142717026174,-0.0011240307940170169,-0.00113070965744555,-0.001135313417762518,-0.0011380133219063282,-0.0011390075087547302,-0.0011385114630684257,-0.001136753591708839,-0.0011339753400534391,-0.0011304334038868546,-0.0011264027561992407,-0.0011221752502024174,-0.0011180549627169967,-0.0011143501615151763,-0.001111364457756281,-0.0011093911016359925,-0.001108710072003305,-0.0011095900554209948,-0.0011122914729639888,-0.001117069274187088,-0.001124172005802393,-0.0011338371550664306,-0.0011462843976914883,-0.0011617076816037297,-0.001180270453915,-0.001202103914692998,-0.0012273079482838511,-0.0012559539172798395,-0.00128808559384197,-0.0013237178791314363,-0.0013628317974507809,-0.001405368442647159,-0.0014512240886688232,-0.0015002478612586856,-0.0015522442990913987,-0.0016069791745394468,-0.0016641875263303518,-0.0017235791310667992,-0.001784843159839511,-0.0018476495752111077,-0.001911649014800787,-0.0019764741882681847,-0.0020417438354343176,-0.0021070705261081457,-0.002172068925574422,-0.002236365806311369,-0.0022996068000793457,-0.0023614615201950073,-0.002421623095870018,-0.002479808172211051,-0.0025357557460665703,-0.002589226234704256,-0.0026400042697787285,-0.0026878989301621914,-0.0027327456045895815,-0.0027744073886424303,-0.002812771126627922,-0.002847747877240181,-0.002879268955439329,-0.002907285001128912,-0.002931768074631691,-0.0029527111910283566,-0.0029701318126171827,-0.002984073478728533,-0.0029946051072329283,-0.0030018226243555546,-0.0030058459378778934,-0.003006817540153861,-0.0030049008782953024,-0.003000278491526842,-0.0029931494500488043,-0.0029837258625775576,-0.002972230315208435,-0.002958890050649643,-0.0029439320787787437,-0.0029275796841830015,-0.002910046838223934,-0.0028915361035615206,-0.0028722367715090513,-0.0028523229993879795,-0.0028319531120359898,-0.0028112693689763546,-0.0027903954032808542,-0.0027694376185536385,-0.002748483791947365,-0.0027276037726551294,-0.002706850180402398,-0.0026862602680921555,-0.002665856620296836,-0.0026456487830728292,-0.0026256334967911243,-0.0026057949289679527,-0.0025861060712486506,-0.0025665294378995895,-0.0025470172986388206,-0.002527513774111867,-0.002507956465706229,-0.002488277619704604,-0.002468406455591321,-0.002448270097374916,-0.0024277945049107075,-0.002406905870884657,-0.0023855308536440134,-0.0023635970428586006,-0.002341034123674035,-0.002317774575203657,-0.0022937566973268986,-0.0022689271718263626,-0.002243243856355548,-0.0022166783455759287,-0.0021892159711569548,-0.0021608565002679825,-0.0021316111087799072,-0.002101501217111945,-0.0020705570932477713,-0.002038818085566163,-0.0020063314586877823,-0.0019731551874428988,-0.0019393549300730228,-0.0019050048431381583,-0.0018701828084886074,-0.0018349686870351434,-0.0017994409427046776,-0.0017636753618717194,-0.0017277444712817669,-0.0016917181201279163,-0.001655664062127471,-0.001619648071937263,-0.0015837339451536536,-0.0015479831490665674,-0.001512454473413527,-0.0014772039139643312,-0.0014422853710129857,-0.0014077505329623818,-0.001373649574816227,-0.0013400308089330792,-0.0013069410342723131,-0.0012744241394102573,-0.0012425212189555168,-0.0012112695258110762,-0.001180701656267047,-0.0011508442694321275,-0.0011217170394957066,-0.001093331491574645,-0.0010656914673745632,-0.0010387925431132317,-0.0010126224951818585,-0.0009871609508991241,-0.0009623780497349799,-0.0009382325224578381,-0.0009146690717898309,-0.0008916166261769831,-0.0008689883397892118,-0.0008466822910122573,-0.0008245837525464594,-0.0008025671704672277,-0.0007804969791322947,-0.0007582279504276812,-0.0007356047281064093,-0.000712462468072772,-0.0006886284099891782,-0.0006639253697358072,-0.0006381753482855856,-0.0006112033734098077,-0.0005828394205309451,-0.0005529202753677964,-0.0005212913383729756,-0.0004878103791270405,-0.00045235350262373686,-0.0004148223961237818,-0.000375150702893734,-0.0003333072818350047,-0.00028929434483870864,-0.00024314124311786145,-0.00019489593978505582,-0.00014461703540291637,-0.00009236950427293777,-0.000038224545278353617,0.000017737458620104007,0.00007542347884736955,0.0001347265497315675,0.00019552765297703445,0.00025770015781745315,0.00032111426116898656,0.0003856387338601053,0.00045113873784430325,0.0005174697143957019,0.000584469991736114,0.0006519550224766135,0.0007197153172455728,0.0007875190931372344,0.0008551179198548198,0.0009222532971762121,0.0009886616608127952,0.001054076594300568,0.0011182287707924843,0.0011808461276814342,0.001241654041223228,0.001300379866734147,0.0013567589921876788,0.001410542638041079,0.001461504027247429,0.001509442343376577,0.001554182730615139,0.0015955741982907057,0.0016334853135049343,0.0016678022220730782,0.0016984270187094808,0.001725280424579978,0.0017483041156083345,0.001767464098520577,0.0017827526899054646,0.0017941879341378808,0.0018018134869635105,0.0018056957051157951,0.0018059235299006104,0.001802608254365623,0.0017958851531147957,0.0017859144136309624,0.0017728826496750116,0.0017570024356245995,0.0017385120736435056,0.001717673265375197,0.001694769598543644,0.0016701037529855967,0.0016439947066828609,0.0016167720314115286,0.0015887705376371741,0.0015603234060108662,0.0015317562501877546,0.0015033832751214504,0.0014755066949874163,0.0014484173152595758,0.001422395696863532,0.0013977114576846361,0.0013746210606768727,0.0013533623423427343,0.0013341502053663135,0.0013171726604923606,0.0013025905936956406,0.0012905399780720472,0.001281133503653109,0.0012744616251438856,0.0012705905828624964,0.0012695572804659605,0.00127136567607522,0.0012759844539687037,0.0012833504006266594,0.0012933773687109351,0.001305966405197978,0.001321016694419086,0.0013384325429797173,0.0013581252424046397,0.0013800112064927816,0.0014040082460269332,0.0014300334732979536,0.0014580035349354148,0.001487836823798716,0.001519456971436739,0.0015527951763942838,0.0015877886908128858,0.0016243777936324477,0.0016625007847324014,0.001702090841718018,0.0017430740408599377,0.001785371219739318,0.0018288998398929834,0.0018735772464424372,0.0019193209009245038,0.0019660477992147207,0.002013672376051545,0.002062105340883136,0.0021112512331455946,0.0021610106341540813,0.0022112810984253883,0.0022619590163230896,0.002312940778210759,0.0023641237057745457,0.0024154060520231724,0.0024666860699653625,0.0025178624782711267,0.0025688332971185446,0.0026194958481937647,0.002669747220352292,0.0027194831054657698,0.0027685980312526226,0.0028169872239232063,0.002864545676857233,0.0029111704789102077,0.0029567605815827847,0.003001217497512698,0.0030444450676441193,0.003086348995566368,0.0031268380116671324,0.00316582340747118,0.003203221131116152,0.0032389527186751366,0.003272944362834096,0.0033051271457225084,0.0033354347106069326,0.0033638000022619963,0.003390153404325247,0.003414420410990715,0.003436520928516984,0.0034563690423965454,0.0034738746471703053,0.0034889441449195147,0.003501483704894781,0.0035114004276692867,0.0035186063032597303,0.0035230196081101894,0.003524569096043706,0.0035231956280767918,0.003518854733556509,0.003511518007144332,0.0035011740401387215,0.0034878284204751253,0.0034715039655566216,0.003452239790931344,0.003430090844631195,0.003405125578865409,0.003377425717189908,0.003347085090354085,0.003314207773655653,0.00327890831977129,0.0032413105946034193,0.0032015484757721424,0.0031597637571394444,0.0031161077786237,0.003070739097893238,0.0030238244216889143,0.002975539304316044,0.0029260667506605387,0.002875599777325988,0.002824340248480439,0.002772498643025756,0.002720293588936329,0.002667950000613928,0.002615697216242552,0.0025637669023126364,0.0025123916566371918,0.0024618024472147226,0.0024122255854308605,0.002363881329074502,0.0023169787600636482,0.0022717127576470375,0.002228258876129985,0.002186770783737302,0.002147376537322998,0.002110176719725132,0.002075243042781949,0.002042618580162525,0.0020123175345361233,0.0019843277987092733,0.0019586121197789907,0.0019351099617779255,0.001913740998134017,0.0018944066250696778,0.0018769924063235521,0.001861369120888412,0.0018473948584869504,0.001834916416555643,0.001823771046474576,0.0018137890147045255,0.0018047961639240384,0.0017966162413358688,0.0017890733433887362,0.0017819920321926475,0.0017751982668414712,0.001768518122844398,0.001761776627972722,0.0017547976458445191,0.001747403061017394,0.0017394130118191242,0.0017306467052549124,0.0017209224170073867,0.0017100583063438535,0.0016978721832856536,0.0016841825563460588,0.0016688101459294558,0.0016515814932063222,0.0016323336167261004,0.0016109198331832886,0.0015872158110141754,0.0015611237613484263,0.0015325758140534163,0.0015015347162261605,0.0014679927844554186,0.0014319703914225101,0.0013935143360868096,0.0013526976108551025,0.0013096188195049763,0.0012644027592614293,0.0012171993730589747,0.001168181886896491,0.0011175418039783835,0.0010654841316863894,0.0010122209787368774,0.0009579659672454,0.0009029313223436475,0.000847325602080673,0.0007913531153462827,0.0007352128159254789,0.0006790962652303278,0.0006231836159713566,0.0005676386062987149,0.0005126034375280142,0.0004581949906423688,0.00040450377855449915,0.00035159531398676336,0.0002995134855154902,0.0002482843410689384,0.00019791880913544446,0.00014841376105323434,0.00009975135617423803,0.000051897808589274064,0.000004803032879863167,-0.00004159796662861481,-0.00008738152246223763,-0.0001326302590314299,-0.0001774277479853481,-0.00022185416310094297,-0.0002659836027305573,-0.00030988326761871576,-0.0003536133444868028,-0.0003972272388637066,-0.0004407708183862269,-0.0004842809576075524,-0.0005277833552099764,-0.000571291078813374,-0.000614803284406662,-0.000658306002151221,-0.0007017726893536747,-0.0007451654528267682,-0.0007884349324740469,-0.00083151989383623,-0.0008743448997847736,-0.0009168185060843825,-0.0009588318062014878,-0.0010002576746046543,-0.0010409519309177995,-0.0010807544458657503,-0.001119490945711732,-0.0011569750495254993,-0.0011930082691833377,-0.001227381406351924,-0.0012598758330568671,-0.0012902648886665702,-0.0013183180708438158,-0.0013438047608360648,-0.0013664999278262258,-0.0013861890183761716,-0.0014026722637936473,-0.0014157694531604648,-0.001425323192961514,-0.0014312019338831306,-0.0014333038125187159,-0.001431559445336461,-0.0014259343734011054,-0.0014164316235110164,-0.0014030918246135116,-0.0013859937898814678,-0.0013652530033141375,-0.001341019757091999,-0.0013134769396856427,-0.0012828363105654716,-0.0012493351241573691,-0.001213231822475791,-0.0011748013785108924,-0.0011343309888616204,-0.0010921172797679901,-0.0010484635131433606,-0.0010036781895905733,-0.000958072894718498,-0.0009119607857428491,-0.0008656524005346,-0.0008194514084607363,-0.0007736499537713826,-0.0007285243482328951,-0.0006843333248980343,-0.0006413179216906428,-0.0005997029365971684,-0.0005596993723884225,-0.0005215059500187635,-0.0004853088757954538,-0.00045127992052584887,-0.00041957368375733495,-0.0003903243341483176,-0.0003636439214460552,-0.0003396223473828286,-0.0003183287917636335,-0.00029981418629176915,-0.00028411345556378365,-0.00027124688494950533,-0.000261220324318856,-0.0002540241985116154,-0.00024963237228803337,-0.00024800121900625527,-0.0002490693877916783,-0.00025275832740589976,-0.00025897330488078296,-0.00026760477339848876,-0.00027852971106767654,-0.0002916130470111966,-0.00030670943669974804,-0.00032366561936214566,-0.00034232312464155257,-0.0003625214740168303,-0.0003841012076009065,-0.00040690615423955023,-0.0004307848575990647,-0.0004555908963084221,-0.00048118236009031534,-0.0005074212094768882,-0.0005341728101484478,-0.0005613060784526169,-0.0005886941216886044,-0.0006162148783914745,-0.000643752224277705,-0.0006711962632834911,-0.0006984430365264416,-0.0007253942312672734,-0.000751956831663847,-0.000778042885940522,-0.0008035696228034794,-0.0008284598588943481,-0.0008526426972821355,-0.0008760532364249229,-0.0008986325701698661,-0.0009203266818076372,-0.0009410857455804944,-0.0009608626714907587,-0.000979612348601222,-0.000997290713712573,-0.0010138535872101784,-0.0010292563820257783,-0.0010434526484459639,-0.0010563937248662114,-0.001068027806468308,-0.0010783001780509949,-0.001087153679691255,-0.0010945306858047843,-0.0011003741528838873,-0.00110463029704988,-0.001107250340282917,-0.001108192722313106,-0.0011074242647737265,-0.001104921568185091,-0.0011006719432771206,-0.0010946737602353096,-0.001086936448700726,-0.0010774813126772642,-0.0010663404827937484,-0.0010535570327192545,-0.0010391842806711793,-0.0010232852073386312,-0.0010059310588985682,-0.0009872004156932235,-0.0009671783773228526,-0.000945954816415906,-0.0009236247860826552,-0.0009002891601994634,-0.0008760556229390204,-0.0008510409970767796,-0.0008253722917288542,-0.0007991873426362872,-0.0007726334151811898,-0.0007458640029653907,-0.0007190349861048162,-0.0006923001492395997,-0.0006658077472820878,-0.0006396981771104038,-0.0006141035701148212,-0.0005891478504054248,-0.0005649472586810589,-0.0005416095955297351,-0.0005192329408600926,-0.0004979039076715708,-0.00047769586672075093,-0.0004586683353409171,-0.0004408679960761219,-0.00042433085036464036,-0.0004090850707143545,-0.00039515344542451203,-0.00038255509571172297,-0.00037130594137124717,-0.00036141855525784194,-0.0003529019595589489,-0.0003457620332483202,-0.0003400024143047631,-0.00033562612952664495,-0.0003326370206195861,-0.00033104061731137335,-0.0003308444865979254,-0.0003320577961858362,-0.00033469049958512187,-0.00033875255030579865,-0.00034425308695062995,-0.0003511998220346868,-0.00035959796514362097,-0.00036944958264939487,-0.00038075249176472425,-0.00039349988219328225,-0.00040768025792203844,-0.0004232779610902071,-0.0004402742488309741,-0.0004586482828017324,-0.0004783779731951654,-0.000499440124258399,-0.0005218102596700191,-0.0005454622441902757,-0.000570367556065321,-0.000596494588535279,-0.0006238078931346536,-0.0006522671319544315,-0.0006818254478275776,-0.0007124277763068676,-0.0007440090994350612,-0.0007764929323457181,-0.0008097903337329626,-0.0008437996148131788,-0.0008784066885709763,-0.0009134859428741038,-0.0009489021613262594,-0.0009845130844041705,-0.001020172261632979,-0.0010557329514995217,-0.0010910513810813427,-0.0011259893653914332,-0.0011604160536080599,-0.001194208161905408,-0.0012272496242076159,-0.001259431941434741,-0.001290653832256794,-0.0013208239106461406,-0.0013498630141839385,-0.001377706415951252,-0.0014043060364201665,-0.001429630909115076,-0.001453666016459465,-0.0014764107763767242,-0.0014978783437982202,-0.0015180945629253983,-0.0015370987821370363,-0.0015549452509731054,-0.0015717034693807364,-0.0015874578384682536,-0.0016023064963519573,-0.0016163581749424338,-0.0016297297552227974,-0.0016425438225269318,-0.0016549271531403065,-0.0016670109471306205,-0.0016789297806099057,-0.0016908219549804926,-0.0017028279835358262,-0.0017150887288153172,-0.0017277434235438704,-0.0017409274587407708,-0.0017547700554132462,-0.0017693935660645366,-0.001784912426955998,-0.0018014322267845273,-0.0018190484261140227,-0.0018378444947302341,-0.001857889350503683,-0.0018792340997606516,-0.0019019095925614238,-0.0019259242108091712,-0.0019512624712660909,-0.001977885141968727,-0.0020057300571352243,-0.0020347146783024073,-0.00206473795697093,-0.002095682779327035,-0.0021274180617183447,-0.002159800846129656,-0.0021926769986748695,-0.002225883537903428,-0.002259249798953533,-0.002292600693181157,-0.0023257583379745483,-0.0023585460148751736,-0.002390790032222867,-0.0024223215878009796,-0.0024529783986508846,-0.0024826056323945522,-0.002511054975911975,-0.0025381860323250294,-0.002563866786658764,-0.002587974537163973,-0.0026103972923010588,-0.0026310356333851814,-0.002649803878739476,-0.002666630782186985,-0.0026814597658813,-0.0026942482218146324,-0.0027049672789871693,-0.0027136006392538548,-0.0027201452758163214,-0.0027246091049164534,-0.0027270119171589613,-0.0027273832820355892,-0.0027257627807557583,-0.0027221967466175556,-0.0027167373336851597,-0.002709441352635622,-0.002700367709621787,-0.002689576707780361,-0.002677129115909338,-0.0026630847714841366,-0.002647501416504383,-0.0026304342318326235,-0.0026119351387023926,-0.0025920516345649958,-0.002570828190073371,-0.002548305317759514,-0.0025245214346796274,-0.0024995121639221907,-0.002473310101777315,-0.002445945981889963,-0.0024174468126147985,-0.0023878368083387613,-0.002357138553634286,-0.0023253727704286575,-0.002292560413479805,-0.0022587243001908064,-0.0022238888777792454,-0.002188081154599786,-0.002151331165805459,-0.002113671274855733,-0.00207513733766973,-0.002035768935456872,-0.0019956103060394526,-0.001954711740836501,-0.0019131299341097474,-0.001870928332209587,-0.0018281762022525072,-0.0017849483992904425,-0.0017413239693269134,-0.0016973849851638079,-0.0016532160807400942,-0.0016089031705632806,-0.0015645327512174845,-0.001520190853625536,-0.0014759614132344723,-0.0014319249894469976,-0.0013881564373150468,-0.0013447238598018885,-0.0013016880257055163,-0.0012591008562594652,-0.0012170064728707075,-0.001175440615043044,-0.0011344305239617825,-0.0010939945932477713,-0.0010541410883888602,-0.0010148676810786128,-0.0009761609835550189,-0.0009379970724694431,-0.0009003428858704865,-0.0008631586097180843,-0.0008263991330750287,-0.0007900160271674395,-0.0007539577782154083,-0.0007181703113019466,-0.0006825968157500029,-0.0006471785018220544,-0.0006118565797805786,-0.0005765746464021504,-0.0005412820028141141,-0.0005059356917627156,-0.00047050195280462503,-0.00043495575664564967,-0.0003992791462223977,-0.00036345983971841633,-0.00032749027013778687,-0.0002913681382779032,-0.0002550985955167562,-0.0002186967758461833,-0.0001821902405936271,-0.00014562006981577724,-0.00010904036753345281,-0.00007251633360283449,-0.000036121869925409555,6.25026430611797e-8,0.000035950783058069646,0.0000714517809683457,0.00010646917507983744,0.00014090226613916457,0.0001746481575537473,0.00020760548068210483,0.00023967932793311775,0.0002707861422095448,0.00030085776234045625,0.0003298438969068229,0.00035771288094110787,0.0003844514722004533,0.00041006470564752817,0.00043457638821564615,0.000458031048765406,0.00048049644101411104,0.0005020661046728492,0.0005228609661571681,0.00054302898934111,0.0005627424689009786,0.0005821939557790756,0.0006015909602865577,0.000621150596998632,0.0006410946371033788,0.0006616450264118612,0.0006830200436525047]}},"dome":{"n":43,"pos0":[0,-0.06928203230275509,0.00020408163265306367,-0.03,-0.05196152422706632,0.002653061224489799,-0.01,-0.05196152422706632,0.0042857142857142885,0.01,-0.05196152422706632,0.0042857142857142885,0.03,-0.05196152422706632,0.002653061224489799,-0.06,-0.034641016151377546,0.00020408163265306367,-0.04,-0.034641016151377546,0.004285714285714288,-0.02,-0.034641016151377546,0.006734693877551021,0,-0.034641016151377546,0.0075510204081632665,0.02,-0.034641016151377546,0.006734693877551021,0.04,-0.034641016151377546,0.004285714285714288,0.06,-0.034641016151377546,0.00020408163265306367,-0.05,-0.017320508075688773,0.004285714285714288,-0.03,-0.017320508075688773,0.0075510204081632665,-0.01,-0.017320508075688773,0.009183673469387756,0.01,-0.017320508075688773,0.009183673469387756,0.03,-0.017320508075688773,0.0075510204081632665,0.05,-0.017320508075688773,0.004285714285714288,-0.06,0,0.002653061224489799,-0.04,0,0.006734693877551021,-0.02,0,0.009183673469387756,0,0,0.01,0.02,0,0.009183673469387756,0.04,0,0.006734693877551021,0.06,0,0.002653061224489799,-0.05,0.017320508075688773,0.004285714285714288,-0.03,0.017320508075688773,0.0075510204081632665,-0.01,0.017320508075688773,0.009183673469387756,0.01,0.017320508075688773,0.009183673469387756,0.03,0.017320508075688773,0.0075510204081632665,0.05,0.017320508075688773,0.004285714285714288,-0.06,0.034641016151377546,0.00020408163265306367,-0.04,0.034641016151377546,0.004285714285714288,-0.02,0.034641016151377546,0.006734693877551021,0,0.034641016151377546,0.0075510204081632665,0.02,0.034641016151377546,0.006734693877551021,0.04,0.034641016151377546,0.004285714285714288,0.06,0.034641016151377546,0.00020408163265306367,-0.03,0.05196152422706632,0.002653061224489799,-0.01,0.05196152422706632,0.0042857142857142885,0.01,0.05196152422706632,0.0042857142857142885,0.03,0.05196152422706632,0.002653061224489799,0,0.06928203230275509,0.00020408163265306367],"mass":[0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003],"pinned":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"springs":[[0,0,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,23,24,25,25,25,26,26,26,27,27,27,28,28,28,29,29,29,30,30,31,32,32,33,33,33,34,34,34,35,35,35,36,36,38,39,39,40,40],[2,3,2,6,7,3,7,8,4,8,9,9,10,6,12,7,12,13,8,13,14,9,14,15,10,15,16,11,16,17,17,13,18,19,14,19,20,15,20,21,16,21,22,17,22,23,23,24,19,25,20,25,26,21,26,27,22,27,28,23,28,29,24,29,30,30,26,31,32,27,32,33,28,33,34,29,34,35,30,35,36,36,37,32,33,38,34,38,39,35,39,40,36,40,41,37,41,39,40,42,41,42],[2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000,2000000],[0.02041224448987753,0.02041224448987753,0.020066528250256087,0.02006652825025609,0.020412244489877527,0.02,0.02014937966889385,0.020264802591520668,0.020066528250256087,0.020264802591520668,0.02014937966889385,0.020412244489877527,0.02006652825025609,0.02041224448987753,0.020412244489877527,0.020149379668893852,0.020000000000000004,0.02026480259152067,0.02001665279222731,0.020016652792227307,0.02014937966889385,0.02001665279222731,0.02006652825025609,0.02006652825025609,0.020149379668893852,0.02014937966889385,0.020016652792227307,0.02041224448987753,0.02026480259152067,0.020000000000000004,0.020412244489877527,0.02026480259152067,0.020066528250256087,0.020149379668893852,0.020066528250256087,0.020016652792227314,0.020066528250256087,0.02,0.02,0.020016652792227314,0.020066528250256087,0.020016652792227314,0.02,0.02026480259152067,0.020066528250256087,0.020016652792227314,0.020149379668893852,0.020066528250256087,0.02041224448987753,0.020066528250256087,0.020149379668893852,0.020149379668893852,0.020016652792227314,0.02001665279222731,0.020066528250256087,0.02,0.02001665279222731,0.020016652792227314,0.020016652792227314,0.020149379668893852,0.02,0.020066528250256087,0.02041224448987753,0.020016652792227314,0.020149379668893852,0.020066528250256087,0.02026480259152067,0.020412244489877527,0.020000000000000004,0.020066528250256087,0.02026480259152067,0.020016652792227307,0.02,0.02014937966889385,0.02006652825025609,0.020066528250256087,0.02006652825025609,0.02014937966889385,0.02026480259152067,0.020016652792227307,0.02026480259152067,0.020000000000000004,0.020412244489877527,0.02041224448987753,0.020149379668893852,0.02006652825025609,0.02001665279222731,0.020412244489877527,0.02014937966889385,0.02001665279222731,0.020264802591520668,0.020264802591520668,0.020149379668893852,0.02014937966889385,0.020412244489877527,0.02041224448987753,0.02006652825025609,0.020066528250256087,0.02,0.02041224448987753,0.020066528250256087,0.02041224448987753],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],"bends":[[],[],[],[],[]],"hinges":[[6,8,1,7,2,8,3,13,5,12,14,6,13,15,7,14,16,8,15,9,16,19,18,20,12,19,21,13,20,22,14,21,23,15,22,16,25,26,18,25,27,19,26,28,20,27,29,21,28,30,22,29,32,31,33,25,32,34,26,33,35,27,34,36,28,35,29,38,39,32,38,40,33,39,41,34,40,42],[1,2,2,2,3,3,4,6,6,6,7,7,7,8,8,8,9,9,9,10,10,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,23,25,25,26,26,26,27,27,27,28,28,28,29,29,29,30,32,33,33,33,34,34,34,35,35,35,39],[7,3,7,8,8,9,9,7,12,13,8,13,14,9,14,15,10,15,16,16,17,13,19,14,19,20,15,20,21,16,21,22,17,22,23,23,19,20,25,26,21,26,27,22,27,28,23,28,29,24,29,30,26,32,27,32,33,28,33,34,29,34,35,30,35,36,36,33,34,38,39,35,39,40,36,40,41,40],[2,0,8,3,9,4,10,1,13,7,2,14,8,3,15,9,4,16,10,17,11,6,13,7,20,14,8,21,15,9,22,16,10,23,17,24,12,13,26,20,14,27,21,15,28,22,16,29,23,17,30,24,19,26,20,33,27,21,34,28,22,35,29,23,36,30,37,26,27,39,34,28,40,35,29,41,36,34],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50],[0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834,0.0000028007280559346834]],"dashpots":[[0,0,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,23,24,25,25,25,26,26,26,27,27,27,28,28,28,29,29,29,30,30,31,32,32,33,33,33,34,34,34,35,35,35,36,36,38,39,39,40,40],[2,3,2,6,7,3,7,8,4,8,9,9,10,6,12,7,12,13,8,13,14,9,14,15,10,15,16,11,16,17,17,13,18,19,14,19,20,15,20,21,16,21,22,17,22,23,23,24,19,25,20,25,26,21,26,27,22,27,28,23,28,29,24,29,30,30,26,31,32,27,32,33,28,33,34,29,34,35,30,35,36,36,37,32,33,38,34,38,39,35,39,40,36,40,41,37,41,39,40,42,41,42],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733,0.11202912223738733]],"friction":[0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765,0.041380190686819765],"hits":[{"t":0,"beads":[17,23,24,30],"velocity":[0,0,0],"force":[0,0,-100],"duration":0.0003}],"duration":0.02,"sampleRate":48000,"dtGiven":0.0000026041666666666666,"method":"verlet","listen":2,"dt":0.0000026041666666666666,"energyDrift":0.000021289129678313808,"audio":{"acceleration":[1.8818745173287965e-10,-0.0022285007871687412,-0.13702154159545898,-1.329716444015503,-5.7906293869018555,-15.064202308654785,-24.307682037353516,-14.55079174041748,52.0047721862793,227.4971923828125,561.3746337890625,1073.7557373046875,1729.0400390625,2423.092529296875,2994.446533203125,3261.346435546875,3076.114013671875,2381.306884765625,1249.8699951171875,-107.50724792480469,-1378.8697509765625,-2231.01416015625,-2416.48193359375,-1874.03125,-780.6533203125,477.2169494628906,1416.4044189453125,1619.1527099609375,884.1845092773438,-692.82470703125,-2740.24072265625,-4723.171875,-6105.77880859375,-6509.08349609375,-5817.47998046875,-4205.68701171875,-2080.747314453125,42.24344253540039,1690.4412841796875,2558.383056640625,2565.03662109375,1828.3297119140625,579.202392578125,-937.7216186523438,-2530.10595703125,-4068.412353515625,-5452.408203125,-6567.99560546875,-7268.845703125,-7397.484375,-6835.26220703125,-5555.88232421875,-3658.508056640625,-1367.7362060546875,1000.9514770507812,3104.390380859375,4651.51904296875,5479.3212890625,5597.4951171875,5178.1728515625,4487.0537109375,3781.530029296875,3221.742919921875,2836.24072265625,2555.04541015625,2286.844970703125,1996.24951171875,1742.4561767578125,1664.6717529296875,1924.7452392578125,2631.16552734375,3770.848388671875,5172.35302734375,6518.9189453125,7418.34228515625,7516.642578125,6620.04052734375,4778.623046875,2295.66943359375,-344.00921630859375,-2600.921142578125,-4018.899169921875,-4332.8232421875,-3521.65966796875,-1801.918212890625,429.4249572753906,2685.912353515625,4495.7724609375,5496.58251953125,5499.73388671875,4512.06689453125,2714.76513671875,411.6138610839844,-2035.778076171875,-4270.79345703125,-5994.38427734375,-7003.9619140625,-7215.40673828125,-6663.63720703125,-5479.5078125,-3848.552978515625,-1965.6507568359375,-1.909800410270691,1906.7833251953125,3651.4970703125,5132.55126953125,6244.318359375,6871.66650390625,6903.55615234375,6265.16796875,4962.95361328125,3126.98486328125,1027.34619140625,-956.1044311523438,-2415.146240234375,-3026.558349609375,-2659.0078125,-1431.455078125,303.7590637207031,2052.342041015625,3315.21044921875,3726.029052734375,3144.480224609375,1677.0599365234375,-377.5984191894531,-2636.624755859375,-4754.4111328125,-6514.07177734375,-7856.98486328125,-8843.8017578125,-9570.4716796875,-10083.6259765625,-10338.470703125,-10217.9287109375,-9598.3330078125,-8424.9609375,-6761.642578125,-4796.79443359375,-2808.281005859375,-1100.667236328125,68.19286346435547,552.8160400390625,358.8968811035156,-358.75341796875,-1339.3936767578125,-2284.281005859375,-2924.431640625,-3068.725830078125,-2627.022216796875,-1614.3792724609375,-144.02951049804688,1589.2960205078125,3339.5341796875,4855.23779296875,5935.1689453125,6477.8427734375,6505.83349609375,6152.328125,5612.31298828125,5076.41064453125,4672.759765625,4436.86328125,4314.8642578125,4192.0234375,3933.2099609375,3425.0908203125,2612.762451171875,1521.9139404296875,255.64962768554688,-1038.3343505859375,-2218.336669921875,-3190.956787109375,-3921.65234375,-4411.4287109375,-4662.12109375,-4659.96142578125,-4390.43359375,-3870.751708984375,-3171.861328125,-2410.267578125,-1712.121337890625,-1169.027587890625,-805.9107666015625,-570.3986206054688,-342.9908752441406,35.239707946777344,719.2767333984375,1805.7686767578125,3281.39892578125,4996.16650390625,6681.34033203125,8015.42822265625,8718.6220703125,8640.533203125,7807.67724609375,6414.896484375,4767.3037109375,3194.153076171875,1959.565673828125,1192.530029296875,855.7803344726562,768.3385009765625,683.1425170898438,398.0030517578125,-143.95068359375,-812.0609130859375,-1329.4296875,-1384.5484619140625,-767.9718017578125,520.259033203125,2232.1728515625,3916.00732421875,5031.02587890625,5101.369140625,3864.187255859375,1363.9017333984375,-2043.0291748046875,-5778.33544921875,-9195.189453125,-11737.486328125,-13050.962890625,-13020.974609375,-11747.87890625,-9491.80859375,-6614.94091796875,-3530.592041015625,-653.521240234375,1653.9769287109375,3134.66259765625,3674.1279296875,3313.520751953125,2236.85498046875,738.1884155273438,-828.4651489257812,-2116.265869140625,-2862.3056640625,-2951.243896484375,-2434.943359375,-1491.10791015625,-336.6927795410156,859.05029296875,2015.522216796875,3118.958251953125,4160.484375,5077.6533203125,5733.98681640625,5944.33251953125,5531.57080078125,4393.6376953125,2562.981201171875,241.92922973632812,-2204.43701171875,-4311.1962890625,-5625.5703125,-5833.74169921875,-4853.0244140625,-2851.645263671875,-192.4695281982422,2668.09033203125,5280.8505859375,7272.08935546875,8373.720703125,8430.34375,7400.94091796875,5362.3212890625,2510.333251953125,-847.7166137695312,-4312.1484375,-7422.5703125,-9707.0166015625,-10755.4228515625,-10314.1787109375,-8377.1689453125,-5231.9375,-1425.5267333984375,2354.02099609375,5445.3232421875,7373.1640625,7949.322265625,7291.0654296875,5761.82275390625,3856.418701171875,2062.383056640625,734.72021484375,22.43692970275879,-127.34986114501953,109.11788940429688,547.8829345703125,1094.0570068359375,1774.2293701171875,2693.0556640625,3939.787841796875,5491.25634765625,7155.7529296875,8583.7490234375,9346.666015625,9061.5146484375,7521.962890625,4790.107421875,1212.52685546875,-2651.00146484375,-6165.72119140625,-8781.208984375,-10159.12109375,-10231.6083984375,-9181.5654296875,-7364.64208984375,-5208.4755859375,-3122.314453125,-1435.6256103515625,-368.1235046386719,-23.946107864379883,-400.5524597167969,-1404.8453369140625,-2871.944091796875,-4585.28564453125,-6299.97216796875,-7772.365234375,-8795.396484375,-9232.0625,-9034.6875,-8240.6650390625,-6946.6708984375,-5275.3076171875,-3351.7607421875,-1299.9185791015625,746.8082885742188,2634.9755859375,4195.7939453125,5270.48681640625,5749.5703125,5610.96923828125,4940.841796875,3926.65087890625,2821.217529296875,1885.296142578125,1322.2337646484375,1221.3759765625,1527.5159912109375,2050.487548828125,2519.1650390625,2667.5634765625,2323.828369140625,1466.7391357421875,226.20321655273438,-1170.3048095703125,-2479.3076171875,-3516.52294921875,-4201.0546875,-4561.328125,-4708.220703125,-4785.33544921875,-4908.271484375,-5109.505859375,-5310.47021484375,-5338.75537109375,-4991.25244140625,-4120.27783203125,-2704.322265625,-869.9197998046875,1145.004638671875,3067.013671875,4666.35595703125,5807.93408203125,6462.12646484375,6683.73828125,6576.25048828125,6255.556640625,5820.6875,5336.0068359375,4829.5146484375,4309.109375,3789.79443359375,3315.389404296875,2958.172607421875,2792.7744140625,2858.62646484375,3134.409423828125,3540.70703125,3969.062744140625,4320.56103515625,4534.62451171875,4597.28759765625,4528.88232421875,4357.71875,4089.80859375,3687.775634765625,3072.71533203125,2155.6953125,890.1734619140625,-678.4841918945312,-2393.060546875,-4007.377685546875,-5244.23046875,-5866.04638671875,-5735.41064453125,-4851.73779296875,-3359.434814453125,-1527.035400390625,301.0752868652344,1773.5350341796875,2606.885498046875,2647.47314453125,1905.2056884765625,553.8798828125,-1098.5406494140625,-2663.8857421875,-3747.591796875,-4036.257080078125,-3384.1279296875,-1872.6029052734375,186.09674072265625,2316.568115234375,4006.991455078125,4854.30078125,4674.78125,3540.1337890625,1730.844482421875,-368.50469970703125,-2389.729248046875,-4076.937255859375,-5331.80029296875,-6199.82763671875,-6805.95556640625,-7263.4150390625,-7592.0498046875,-7683.451171875,-7333.57470703125,-6332.6728515625,-4573.34814453125,-2128.18798828125,735.7320556640625,3608.282958984375,6030.7578125,7600.630859375,8058.66650390625,7341.21533203125,5590.45263671875,3123.276123046875,367.1386413574219,-2222.137451171875,-4242.1767578125,-5409.26025390625,-5597.17431640625,-4847.2587890625,-3352.409912109375,-1420.3065185546875,577.9304809570312,2266.965087890625,3327.477783203125,3550.245361328125,2876.139404296875,1413.19384765625,-577.2324829101562,-2728.0400390625,-4640.88720703125,-5970.09228515625,-6492.88330078125,-6146.85986328125,-5027.5458984375,-3352.390625,-1405.56591796875,521.6567993164062,2183.7119140625,3418.378662109375,4162.36279296875,4441.40771484375,4339.52001953125,3961.28662109375,3404.520751953125,2753.152587890625,2086.510986328125,1491.158447265625,1062.5494384765625,893.724609375,1057.620361328125,1591.144775390625,2484.28076171875,3673.340576171875,5038.69970703125,6411.0185546875,7589.7412109375,8371.640625,8580.8759765625,8092.36572265625,6847.58251953125,4868.64404296875,2274.65966796875,-705.9659423828125,-3743.0771484375,-6446.5341796875,-8442.5146484375,-9466.2080078125,-9441.06640625,-8515.513671875,-7039.52099609375,-5480.77392578125,-4298.90087890625,-3812.403564453125,-4101.1025390625,-4980.95361328125,-6065.81689453125,-6898.2646484375,-7102.71630859375,-6503.79931640625,-5167.2373046875,-3353.342041015625,-1408.3367919921875,359.86151123046875,1774.7449951171875,2823.8076171875,3625.50830078125,4347.72607421875,5110.55224609375,5912.69921875,6614.27734375,6987.24853515625,6814.23681640625,5991.26611328125,4586.255859375,2827.1708984375,1028.8563232421875,-505.82818603515625,-1570.81787109375,-2102.935791015625,-2183.9658203125,-2005.0655517578125,-1803.82080078125,-1788.219482421875,-2069.372802734375,-2628.983154296875,-3337.83447265625,-4017.48486328125,-4513.49072265625,-4743.4326171875,-4701.93505859375,-4433.45654296875,-3999.99072265625,-3464.39111328125,-2889.944580078125,-2342.129150390625,-1880.6549072265625,-1543.443115234375,-1334.14453125,-1221.9129638671875,-1151.17822265625,-1052.4688720703125,-849.5187377929688,-467.0894775390625,153.4468231201172,1032.2215576171875,2135.629638671875,3382.2568359375,4671.76708984375,5920.97802734375,7084.06591796875,8143.73291015625,9079.8388671875,9836.701171875,10310.4658203125,10365.990234375,9878.078125,8782.5888671875,7119.951171875,5054.86279296875,2860.38330078125,863.933349609375,-633.3182983398438,-1438.8780517578125,-1523.7576904296875,-1029.0628662109375,-222.2240753173828,580.593994140625,1099.489990234375,1158.073974609375,716.4284057617188,-135.66268920898438,-1219.4781494140625,-2326.15869140625,-3271.3310546875,-3925.742919921875,-4214.8466796875,-4097.90869140625,-3548.822998046875,-2557.849365234375,-1157.1424560546875,545.7742919921875,2350.905517578125,3982.634033203125,5141.53173828125,5576.03271484375,5150.859375,3890.5263671875,1984.0941162109375,-252.11199951171875,-2445.906982421875,-4256.5078125,-5452.3876953125,-5954.63818359375,-5830.8916015625,-5243.236328125,-4372.84912109375,-3354.33740234375,-2247.5244140625,-1055.56396484375,224.2792510986328,1545.408935546875,2780.498779296875,3729.589599609375,4165.91796875,3903.6650390625,2865.51904296875,1129.035888671875,-1063.611572265625,-3339.90771484375,-5272.5224609375,-6480.81982421875,-6731.10986328125,-6003.42724609375,-4500.568359375,-2595.39501953125,-735.609619140625,661.3915405273438,1294.0299072265625,1027.5584716796875,-89.97003173828125,-1842.201904296875,-3887.13134765625,-5825.93896484375,-7288.41650390625,-8014.1103515625,-7904.435546875,-7030.64111328125,-5600.2001953125,-3897.837890625,-2219.70849609375,-813.6787719726562,166.1427459716797,682.5777587890625,808.0169067382812,684.6627197265625,463.94122314453125,249.12042236328125,66.58403778076172,-121.79286193847656,-373.2773742675781,-709.8745727539062,-1081.1859130859375,-1360.2230224609375,-1372.4508056640625,-946.6459350585938,28.750125885009766,1560.235595703125,3528.9931640625,5704.75341796875,7792.9970703125,9501.9677734375,10606.5517578125,10987.173828125,10634.5078125,9627.5263671875,8102.18896484375,6225.41650390625,4178.06103515625,2141.4990234375,281.7380676269531,-1269.2166748046875,-2430.083740234375,-3180.997802734375,-3567.24365234375,-3695.077880859375,-3714.84033203125,-3785.56787109375,-4023.65185546875,-4452.802734375,-4981.447265625,-5425.67724609375,-5573.1630859375,-5261.1884765625,-4435.92822265625,-3172.6728515625,-1656.197021484375,-132.9633331298828,1151.1834716796875,2015.6002197265625,2397.37744140625,2374.092529296875,2143.09375,1959.15087890625,2051.888427734375,2554.467529296875,3467.927001953125,4666.93603515625,5935.95166015625,7019.7373046875,7677.3671875,7734.5341796875,7127.65380859375,5927.232421875,4326.77099609375,2593.684814453125,996.2352905273438,-266.9010925292969,-1109.4263916015625,-1561.965576171875,-1744.2620849609375,-1819.550048828125,-1944.876953125,-2227.257568359375,-2694.4775390625,-3290.171875,-3899.26123046875,-4398.58837890625,-4713.7353515625,-4856.70556640625,-4926.41259765625,-5070.923828125,-5426.73095703125,-6057.482421875,-6911.95654296875,-7813.689453125,-8487.4658203125,-8620.984375,-7950.99609375,-6352.08740234375,-3898.43359375,-871.565673828125,2296.385498046875,5129.900390625,7232.67626953125,8384.041015625,8578.52734375,8000.3359375,6947.5849609375,5736.56884765625,4619.47412109375,3740.714111328125,3140.437255859375,2794.604736328125,2666.502197265625,2741.383544921875,3026.47607421875,3518.25048828125,4157.41259765625,4799.5537109375,5222.26171875,5172.5400390625,4440.59521484375,2934.918701171875,731.933349609375,-1919.23046875,-4642.03564453125,-7015.64404296875,-8669.2236328125,-9357.01171875,-8993.4833984375,-7646.4560546875,-5502.5078125,-2824.620849609375,84.23355865478516,2909.0048828125,5346.91357421875,7133.63818359375,8072.48681640625,8063.18798828125,7124.34423828125,5402.58935546875,3161.753173828125,748.0999755859375,-1465.9061279296875,-3148.35546875,-4068.076171875,-4131.71435546875,-3388.919921875,-2007.8671875,-232.23660278320312,1665.8807373046875,3425.053955078125,4819.572265625,5671.68994140625,5857.80126953125,5316.5771484375,4062.93115234375,2203.63232421875,-56.64072799682617,-2430.653076171875,-4589.7333984375,-6223.33935546875,-7100.96484375,-7119.13916015625,-6321.96533203125,-4891.67529296875,-3112.218994140625,-1313.4449462890625,192.7567596435547,1169.8057861328125,1492.669921875,1154.2650146484375,244.63409423828125,-1083.171630859375,-2642.787841796875,-4229.30517578125,-5622.5693359375,-6593.4423828125,-6927.4443359375,-6469.02001953125,-5174.8671875,-3155.63623046875,-686.2723388671875,1825.6219482421875,3911.80712890625,5142.71923828125,5231.54736328125,4114.4677734375,1979.050537109375,-775.6994018554688,-3642.056396484375,-6138.16455078125,-7927.98974609375,-8884.1533203125,-9074.8681640625,-8688.1796875,-7931.10986328125,-6946.9111328125,-5780.4677734375,-4398.6953125,-2750.776123046875,-839.4467163085938,1228.1485595703125,3233.68359375,4892.126953125,5934.1025390625,6195.88134765625,5681.79638671875,4574.51708984375,3190.00732421875,1895.13330078125,1016.6162109375,767.6015014648438,1207.5303955078125,2239.466064453125,3640.646240234375,5116.701171875,6366.369140625,7141.89697265625,7292.16943359375,6781.451171875,5684.1259765625,4161.4619140625,2427.996337890625,713.7105712890625,-773.461181640625,-1880.1947021484375,-2529.87158203125,-2729.125732421875,-2557.013427734375,-2139.974853515625,-1619.79443359375,-1122.6383056640625,-735.09033203125,-490.149169921875,-364.7019958496094,-290.0339050292969,-175.9452667236328,55.356563568115234,436.1317138671875,935.2483520507812,1466.25244140625,1920.523193359375,2211.95263671875,2313.75927734375,2272.4453125,2194.863525390625,2214.959716796875,2452.36962890625,2975.580322265625,3779.878173828125,4785.9775390625,5858.9853515625,6840.26806640625,7580.1650390625,7960.81689453125,7905.5576171875,7379.70361328125,6391.05908203125,4994.54345703125,3297.306396484375,1455.063232421875,-348.120361328125,-1936.291748046875,-3184.313232421875,-4051.104248046875,-4589.046875,-4922.88818359375,-5202.4697265625,-5544.05126953125,-5981.20068359375,-6445.44140625,-6788.00732421875,-6838.91845703125,-6483.35009765625,-5725.02734375,-4708.025390625,-3683.04150390625,-2926.684326171875,-2642.731201171875,-2882.985595703125,-3517.96484375,-4267.966796875,-4782.71484375,-4742.55224609375,-3950.517578125,-2390.70361328125,-239.22482299804688,2173.741455078125,4440.4560546875,6170.13232421875,7075.77685546875,7030.8876953125,6084.77587890625,4439.263671875,2399.17919921875,310.90899658203125,-1500.123046875,-2785.263427734375,-3413.47509765625,-3387.37158203125,-2827.281005859375,-1925.8775634765625,-888.6673583984375,117.01192474365234,985.9163208007812,1667.1881103515625,2135.914794921875,2362.887939453125,2299.010498046875,1881.497314453125,1059.13623046875,-172.8018798828125,-1740.6776123046875,-3477.017333984375,-5132.28271484375,-6417.24267578125,-7067.75927734375,-6912.94384765625,-5923.80078125,-4225.7119140625,-2071.465576171875,214.8683319091797,2305.18798828125,3927.82373046875,4908.9228515625,5189.71826171875,4820.74658203125,3938.283447265625,2730.903076171875,1405.154296875,158.07725524902344,-839.7655029296875,-1452.7650146484375],"velocity":[0,-7.1014802927038545e-9,-8.517100127392041e-7,-0.000012786811566911638,-0.00007920508505776525,-0.0002891028707381338,-0.0007097372435964644,-0.0011729607358574867,-0.0009213411249220371,0.001757407677359879,0.009673075750470161,0.026409437879920006,0.055426858365535736,0.09873401373624802,0.1555308699607849,0.22136010229587555,0.2882328927516937,0.34593555331230164,0.3843700885772705,0.3964153528213501,0.3804958164691925,0.3419238328933716,0.29225051403045654,0.24638663232326508,0.21806468069553375,0.21502333879470825,0.23569224774837494,0.2688276469707489,0.29652318358421326,0.2997169494628906,0.26433712244033813,0.1860058307647705,0.07178905606269836,-0.061479147523641586,-0.1916923075914383,-0.2973872423171997,-0.36332520842552185,-0.38412272930145264,-0.36493921279907227,-0.31920796632766724,-0.26441511511802673,-0.21755580604076385,-0.19181646406650543,-0.1952761858701706,-0.23139476776123047,-0.3003067672252655,-0.3998311161994934,-0.5256155729293823,-0.6705936193466187,-0.824467122554779,-0.9739643931388855,-1.104223608970642,-1.201111078262329,-1.2538959980010986,-1.2575589418411255,-1.2140685319900513,-1.1321407556533813,-1.0253342390060425,-0.9088399410247803,-0.7958846688270569,-0.6949765086174011,-0.608995795249939,-0.5363578796386719,-0.4735126793384552,-0.41744741797447205,-0.36697617173194885,-0.32234126329421997,-0.2835584282875061,-0.24850942194461823,-0.211817666888237,-0.16515928506851196,-0.09911961853504181,-0.006180707830935717,0.11601943522691727,0.26229357719421387,0.4194663465023041,0.5684657692909241,0.6886350512504578,0.7630541324615479,0.7831932902336121,0.7514334917068481,0.6807485222816467,0.5917678475379944,0.5081413388252258,0.4514245092868805,0.4366503655910492,0.46947604417800903,0.5453999042510986,0.6510888338088989,0.7673935294151306,0.8732722997665405,0.9497091174125671,0.9828445315361023,0.9658631086349487,0.8995310664176941,0.7915236353874207,0.6547951102256775,0.5053071975708008,0.35951507091522217,0.23208917677402496,0.13432486355304718,0.07348319888114929,0.05297334864735603,0.07300596684217453,0.13126753270626068,0.22330304980278015,0.3425373435020447,0.48008838295936584,0.6246789693832397,0.763026773929596,0.8810559511184692,0.9660544991493225,1.0094852447509766,1.0096780061721802,0.9733476638793945,0.9150306582450867,0.8541520237922668,0.8103066682815552,0.798083484172821,0.8230448961257935,0.880155622959137,0.9551555514335632,1.0284032821655273,1.0799363851547241,1.0941613912582397,1.062793493270874,0.9853312373161316,0.8672436475753784,0.7168594598770142,0.542370080947876,0.3501760959625244,0.1450732946395874,-0.0681825801730156,-0.2830682694911957,-0.49041926860809326,-0.6790965795516968,-0.8380059599876404,-0.9587082862854004,-1.0377098321914673,-1.0777058601379395,-1.0873745679855347,-1.079691767692566,-1.069123387336731,-1.0684230327606201,-1.0859135389328003,-1.1239662170410156,-1.1789348125457764,-1.2423202991485596,-1.3026726245880127,-1.3477637767791748,-1.366721510887146,-1.3519197702407837,-1.300389051437378,-1.214432954788208,-1.1011662483215332,-0.97092604637146,-0.8348833918571472,-0.7025306224822998,-0.579835832118988,-0.46863630414009094,-0.3673686385154724,-0.27274248003959656,-0.18168935179710388,-0.09295985847711563,-0.007980464026331902,0.06916452199220657,0.13258454203605652,0.17606496810913086,0.19476398825645447,0.18652993440628052,0.15231437981128693,0.09556832164525986,0.02106131799519062,-0.06614702194929123,-0.16107861697673798,-0.2586325705051422,-0.35336512327194214,-0.4398050010204315,-0.5133840441703796,-0.571528434753418,-0.6142677068710327,-0.6439701318740845,-0.6642555594444275,-0.6784574389457703,-0.6880860328674316,-0.69169020652771,-0.6844627857208252,-0.6588788628578186,-0.6064706444740295,-0.5204590559005737,-0.39850038290023804,-0.24454548954963684,-0.06897644698619843,0.11321882158517838,0.28572678565979004,0.43460115790367126,0.5512343049049377,0.6337839961051941,0.6867318153381348,0.7187469005584717,0.7394651770591736,0.7561614513397217,0.7714802622795105,0.7831894159317017,0.7862227559089661,0.7762784957885742,0.753440260887146,0.7241504788398743,0.7005029320716858,0.6969068646430969,0.7251842617988586,0.7897259593009949,0.8843427896499634,0.9919824004173279,1.0876754522323608,1.1440839767456055,1.1381219625473022,1.0566627979278564,0.8996274471282959,0.6797131299972534,0.41923004388809204,0.14537650346755981,-0.11457890272140503,-0.3372253179550171,-0.5057268738746643,-0.6114088892936707,-0.6543107032775879,-0.6426604986190796,-0.5912220478057861,-0.5186756253242493,-0.4444637596607208,-0.38564327359199524,-0.35422036051750183,-0.35535022616386414,-0.38676005601882935,-0.43969589471817017,-0.5013827681541443,-0.5584012866020203,-0.5998429656028748,-0.6190750598907471,-0.613609254360199,-0.5835755467414856,-0.530003547668457,-0.45404157042503357,-0.35750603675842285,-0.24429096281528473,-0.12171721458435059,-0.0009912136010825634,0.10365919768810272,0.17719414830207825,0.20698879659175873,0.18638595938682556,0.11752965301275253,0.012341795489192009,-0.1090671494603157,-0.22235246002674103,-0.3040957748889923,-0.33655858039855957,-0.31072261929512024,-0.22715385258197784,-0.09507220983505249,0.06959107518196106,0.2464902251958847,0.4132290482521057,0.5477777719497681,0.6309504508972168,0.6488246321678162,0.5948848724365234,0.47164130210876465,0.29141896963119507,0.07587822526693344,-0.1462372988462448,-0.34334659576416016,-0.48678144812583923,-0.5567017197608948,-0.546393096446991,-0.46349599957466125,-0.3277261257171631,-0.16581550240516663,-0.005196386482566595,0.13186301290988922,0.2322617471218109,0.2933698296546936,0.3215152323246002,0.3283408284187317,0.32641440629959106,0.32573530077934265,0.3323512077331543,0.3492840826511383,0.37885579466819763,0.42488452792167664,0.493386834859848,0.591210663318634,0.7230097055435181,0.8877205848693848,1.0759910345077515,1.269782304763794,1.4447120428085327,1.574793815612793,1.6383453607559204,1.6233155727386475,1.5303668975830078,1.372768759727478,1.1732161045074463,0.9586671590805054,0.7547889947891235,0.581474781036377,0.450286328792572,0.3639349043369293,0.31735968589782715,0.299751341342926,0.2969321608543396,0.2936893701553345,0.2758369743824005,0.23190928995609283,0.15445007383823395,0.040854357182979584,-0.10633732378482819,-0.27982720732688904,-0.46868419647216797,-0.6600387692451477,-0.8409423232078552,-0.99989914894104,-1.127751111984253,-1.2179452180862427,-1.2665139436721802,-1.2721459865570068,-1.2365094423294067,-1.1646547317504883,-1.0651034116744995,-0.9492428302764893,-0.8298860788345337,-0.7191928625106812,-0.6264352798461914,-0.5562160015106201,-0.5076783895492554,-0.4750215709209442,-0.44931554794311523,-0.4212530553340912,-0.38413745164871216,-0.33620330691337585,-0.28144097328186035,-0.2285366803407669,-0.18824125826358795,-0.17012359201908112,-0.17990396916866302,-0.21825270354747772,-0.2812768816947937,-0.3622782826423645,-0.45403245091438293,-0.5508344769477844,-0.6497287750244141,-0.7505651116371155,-0.8548138737678528,-0.9634791016578674,-1.0748786926269531,-1.1832809448242188,-1.2791533470153809,-1.351112961769104,-1.3888850212097168,-1.3860968351364136,-1.3418463468551636,-1.2605924606323242,-1.150647759437561,-1.0220273733139038,-0.8844303488731384,-0.7458420991897583,-0.6119054555892944,-0.48598238825798035,-0.3697148561477661,-0.26379528641700745,-0.16858309507369995,-0.08424711227416992,-0.010365844704210758,0.05471567064523697,0.11424386501312256,0.17271468043327332,0.23483522236347198,0.3042328655719757,0.38251373171806335,0.4690609574317932,0.5615628361701965,0.6569356918334961,0.7521977424621582,0.8449258804321289,0.9331029057502747,1.0144057273864746,1.0852715969085693,1.140312671661377,1.1726335287094116,1.1752595901489258,1.1433279514312744,1.0762513875961304,0.9790127277374268,0.86207515001297,0.7398940324783325,0.6284013986587524,0.5420206785202026,0.4908139705657959,0.4783557057380676,0.5008445382118225,0.5477432608604431,0.6038760542869568,0.6525400280952454,0.6789724826812744,0.6735019087791443,0.6338181495666504,0.5659053325653076,0.4832773804664612,0.4043658375740051,0.3483353853225708,0.3301979601383209,0.35658687353134155,0.42360353469848633,0.5175840258598328,0.6186174750328064,0.7056375741958618,0.7613867521286011,0.7757416367530823,0.7466161251068115,0.6785516738891602,0.5798069834709167,0.4591197669506073,0.32330983877182007,0.1765558421611786,0.021539652720093727,-0.13813914358615875,-0.29551368951797485,-0.43912234902381897,-0.5540265440940857,-0.6248397827148438,-0.6397482752799988,-0.5941265821456909,-0.492579847574234,-0.3488559126853943,-0.18371903896331787,-0.021351953968405724,0.11489925533533096,0.20655520260334015,0.24302051961421967,0.22304649651050568,0.15445411205291748,0.052302293479442596,-0.06403792649507523,-0.17431749403476715,-0.2607739269733429,-0.31093618273735046,-0.3195004463195801,-0.2890428304672241,-0.2294754981994629,-0.15629957616329193,-0.08786346763372421,-0.04201143607497215,-0.0326874777674675,-0.06718126684427261,-0.14466698467731476,-0.25642940402030945,-0.38773491978645325,-0.5208490490913391,-0.6384183168411255,-0.726432204246521,-0.7762075066566467,-0.7851543426513672,-0.756354570388794,-0.6971856355667114,-0.6173793077468872,-0.5270211100578308,-0.43498939275741577,-0.3481372892856598,-0.27117905020713806,-0.20694062113761902,-0.1565704345703125,-0.11950324475765228,-0.09326871484518051,-0.07340539991855621,-0.053692180663347244,-0.026740608736872673,0.015132569707930088,0.0788513794541359,0.1694287359714508,0.2888471186161041,0.43519389629364014,0.6022971272468567,0.779988706111908,0.9549336433410645,1.111860752105713,1.2350938320159912,1.310398817062378,1.327151894569397,1.2805863618850708,1.1735416650772095,1.016968011856079,0.8286252021789551,0.6299363374710083,0.44159096479415894,0.2789933383464813,0.1488432139158249,0.047946855425834656,-0.0352061502635479,-0.11639027297496796,-0.2102639079093933,-0.32537150382995605,-0.46121010184288025,-0.6083499193191528,-0.7514761686325073,-0.8741381764411926,-0.9634261131286621,-1.012962818145752,-1.0233840942382812,-1.0004854202270508,-0.9520291090011597,-0.8845685124397278,-0.8015095591545105,-0.7031000852584839,-0.5882641673088074,-0.45742514729499817,-0.31497690081596375,-0.17014147341251373,-0.03563980013132095,0.07538800686597824,0.15296407043933868,0.19292491674423218,0.19770947098731995,0.17517481744289398,0.13602346181869507,0.09073307365179062,0.04685074836015701,0.007333428133279085,-0.029634008184075356,-0.0692841187119484,-0.11783087998628616,-0.17987680435180664,-0.256692111492157,-0.3459656834602356,-0.44287219643592834,-0.5416978597640991,-0.6371955275535583,-0.7252726554870605,-0.8031490445137024,-0.869351863861084,-0.9237531423568726,-0.9675518870353699,-1.0029927492141724,-1.0327656269073486,-1.0592665672302246,-1.0839711427688599,-1.1070369482040405,-1.1270933151245117,-1.1411731243133545,-1.1448801755905151,-1.1329609155654907,-1.1002904176712036,-1.0429736375808716,-0.9590715765953064,-0.8486117720603943,-0.7129769921302795,-0.5541680455207825,-0.3745134472846985,-0.1770872324705124,0.03337206691503525,0.24958331882953644,0.4614694118499756,0.6568944454193115,0.8234166502952576,0.9507245421409607,1.0331271886825562,1.071309208869934,1.0726518630981445,1.0498048067092896,1.017782211303711,0.9903964996337891,0.9770935773849487,0.9810929298400879,0.9992677569389343,1.023648738861084,1.0439903736114502,1.0506105422973633,1.0367149114608765,0.9996510148048401,0.9409403800964355,0.8653969764709473,0.7799339890480042,0.6926236152648926,0.612214982509613,0.5478562712669373,0.5085195899009705,0.5017731785774231,0.5319858193397522,0.5985110998153687,0.6946006417274475,0.8076393008232117,0.9208802580833435,1.0163785219192505,1.0784417390823364,1.096738576889038,1.068252444267273,0.9975428581237793,0.8952421545982361,0.7752509117126465,0.6515336036682129,0.5355437994003296,0.4350280463695526,0.35435646772384644,0.29586562514305115,0.26130199432373047,0.25250810384750366,0.2709513008594513,0.31630992889404297,0.38480421900749207,0.46810612082481384,0.5534669160842896,0.6252935528755188,0.6679431796073914,0.6691230535507202,0.6230394244194031,0.5323880314826965,0.40846356749534607,0.26911279559135437,0.13489536941051483,0.024427348747849464,-0.04980659857392311,-0.0840512216091156,-0.08373323082923889,-0.06188776716589928,-0.03615141287446022,-0.025064243003726006,-0.044363442808389664,-0.10387379676103592,-0.20556668937206268,-0.3432524502277374,-0.5040505528450012,-0.6712866425514221,-0.8280262351036072,-0.9603234529495239,-1.0594710111618042,-1.1229227781295776,-1.153891921043396,-1.1598405838012695,-1.15023934841156,-1.1341512203216553,-1.1183123588562012,-1.1062904596328735,-1.0989198684692383,-1.0956686735153198,-1.0961824655532837,-1.1011940240859985,-1.112347960472107,-1.1310310363769531,-1.1567593812942505,-1.1858354806900024,-1.2108629941940308,-1.2214082479476929,-1.2057472467422485,-1.1533185243606567,-1.0572509765625,-0.9162434935569763,-0.7352217435836792,-0.5245891213417053,-0.2983773648738861,-0.07194190472364426,0.1401384174823761,0.3255757987499237,0.4752735495567322,0.5837813019752502,0.649445652961731,0.6742622256278992,0.6633630394935608,0.6241260766983032,0.5649953484535217,0.49415063858032227,0.41817739605903625,0.3409450650215149,0.2630234360694885,0.18201887607574463,0.09400779753923416,-0.004229483660310507,-0.11296375095844269,-0.22820644080638885,-0.3419353663921356,-0.4438011050224304,-0.5236791968345642,-0.5742160081863403,-0.5926478505134583,-0.581451416015625,-0.547651469707489,-0.500880241394043,-0.4506218135356903,-0.40342244505882263,-0.36098575592041016,-0.31982818245887756,-0.27259013056755066,-0.21048946678638458,-0.12607921659946442,-0.015541709959506989,0.11994536221027374,0.2739437520503998,0.4356044828891754,0.5915377140045166,0.7284113168716431,0.8356956243515015,0.9077735543251038,0.9447395205497742,0.9516552686691284,0.9365923404693604,0.9081790447235107,0.873409628868103,0.8362459540367126,0.7972307205200195,0.7540906667709351,0.7031157612800598,0.640910267829895,0.5659330487251282,0.47922393679618835,0.3839696943759918,0.284043550491333,0.18212932348251343,0.07824759930372238,-0.03065657988190651,-0.149816632270813,-0.2846433222293854,-0.4381629526615143,-0.6086202263832092,-0.7880088090896606,-0.9621689915657043,-1.1127537488937378,-1.2208155393600464,-1.271153211593628,-1.256147861480713,-1.1778441667556763,-1.0475685596466064,-0.8831974267959595,-0.7049744725227356,-0.531187891960144,-0.37494465708732605,-0.24278947710990906,-0.13523173332214355,-0.048615001142024994,0.02259674109518528,0.08401993662118912,0.14055633544921875,0.19653888046741486,0.25625374913215637,0.32410046458244324,0.4038964807987213,0.4973610043525696,0.6023442149162292,0.7116342186927795,0.8130622506141663,0.8912063837051392,0.9304362535476685,0.9185476303100586,0.8499694466590881,0.7275979518890381,0.5627296566963196,0.37318262457847595,0.18024806678295135,0.0053604100830852985,-0.13276736438274384,-0.22017505764961243,-0.24885201454162598,-0.21726790070533752,-0.1303701400756836,0.0009388298494741321,0.16090314090251923,0.3306275010108948,0.49033644795417786,0.6219749450683594,0.7118017077445984,0.7525103092193604,0.7443904280662537,0.6951837539672852,0.618584930896759,0.5317067503929138,0.4520988464355469,0.39497998356819153,0.3711974620819092,0.38614922761917114,0.43962007761001587,0.5262898206710815,0.6366222500801086,0.7579323649406433,0.8755896091461182,0.9744520783424377,1.0406227111816406,1.063452959060669,1.0374670028686523,0.9636945724487305,0.8499332666397095,0.7097148895263672,0.5601105690002441,0.41881972551345825,0.30114343762397766,0.21744532883167267,0.1715889722108841,0.16064466536045074,0.17588506639003754,0.2047780305147171,0.23342999815940857,0.24886393547058105,0.24069468677043915,0.20211203396320343,0.13039374351501465,0.0272480808198452,-0.10091453790664673,-0.24300344288349152,-0.38398438692092896,-0.5066633224487305,-0.594497561454773,-0.6349773406982422,-0.6227932572364807,-0.5619109272956848,-0.46583035588264465,-0.355680912733078,-0.2563458979129791,-0.1914128065109253,-0.17823204398155212,-0.2244933396577835,-0.32734525203704834,-0.4752489924430847,-0.6517942547798157,-0.8400384783744812,-1.025873064994812,-1.1994742155075073,-1.354773759841919,-1.487674355506897,-1.594125509262085,-1.6690802574157715,-1.7068771123886108,-1.7029438018798828,-1.6561311483383179,-1.570648431777954,-1.4566386938095093,-1.3288971185684204,-1.2039470672607422,-1.0963321924209595,-1.0152852535247803,-0.9627689123153687,-0.9333733320236206,-0.9159645438194275,-0.8965323567390442,-0.8614827990531921,-0.8006278276443481,-0.7092722654342651,-0.5890369415283203,-0.44735366106033325,-0.29586341977119446,-0.14816412329673767,-0.01742461696267128,0.08569159358739853,0.15449821949005127,0.18700502812862396,0.18584494292736053,0.15746265649795532,0.1107240840792656,0.05522056296467781,-0.00038140526157803833,-0.049607206135988235,-0.08883240818977356,-0.11727207899093628,-0.1363905966281891,-0.148912712931633,-0.15765999257564545,-0.16446784138679504,-0.16946455836296082,-0.1709670126438141,-0.16609732806682587,-0.15195532143115997,-0.12690304219722748,-0.09140675514936447,-0.048036929219961166,-0.0005868151201866567,0.047355182468891144,0.09384065121412277,0.13949735462665558,0.1876651644706726,0.24369676411151886,0.3136303722858429,0.40261322259902954,0.5135149359703064,0.6460883617401123,0.7968248128890991,0.9594017267227173,1.125463843345642,1.2854971885681152,1.4297038316726685,1.5489283800125122,1.6356991529464722,1.6853010654449463,1.6966087818145752,1.672318935394287,1.6183347702026367,1.5423314571380615,1.451857089996338,1.3525538444519043,1.247106671333313,1.1353298425674438,1.015412449836731,0.8859072327613831,0.7477025389671326,0.6051309108734131,0.46562138199806213,0.33784106373786926,0.22890901565551758,0.141728475689888,0.07354534417390823,0.01643756404519081,-0.04027947410941124,-0.10648009926080704,-0.18767552077770233,-0.2826506197452545,-0.3830373287200928,-0.4749510884284973,-0.5422276258468628,-0.5703952312469482,-0.5503585934638977,-0.480862557888031,-0.36913302540779114,-0.22958503663539886,-0.08100409805774689,0.05702925845980644,0.16761700809001923,0.239237442612648,0.26726093888282776,0.2541593909263611,0.208470419049263,0.14273874461650848,0.07084861397743225,0.005348728038370609,-0.04456860572099686,-0.07396060228347778,-0.08183664828538895,-0.07005850970745087,-0.042078033089637756,-0.002080020494759083,0.045230213552713394,0.094340480864048,0.13854430615901947,0.16989275813102722,0.17979279160499573,0.16032442450523376,0.10607317090034485,0.01601490192115307,-0.10516650229692459,-0.24690209329128265,-0.39398449659347534,-0.5290680527687073,-0.6358243227005005,-0.7019396424293518,-0.7212207913398743,-0.6943820118904114,-0.6284751892089844,-0.5352441072463989,-0.4288645386695862,-0.32357120513916016,-0.23160144686698914,-0.16174814105033875,-0.11863349378108978,-0.10263723880052567,-0.11028958857059479,-0.1349211186170578],"displacement":[0,-1.4764231504038605e-14,-4.318005154824167e-12,-1.0285987339653246e-10,-8.95151286428586e-10,-4.3830641338615806e-9,-1.44343674790548e-8,-3.4395586823166013e-8,-5.8678956804669724e-8,-5.650977996651818e-8,5.009157533208963e-8,4.0680441770746256e-7,0.0000012347745723673142,0.0000028146862405264983,0.0000054419597290689126,0.000009358004717796575,0.000014673300938738976,0.000021305329937604256,0.000028955106245120987,0.00003713912519742735,0.00004527949931798503,0.00005283648715703748,0.00005944923759670928,0.00006503953045466915,0.00006983646017033607,0.00007430060941260308,0.0000789604164310731,0.00008420835365541279,0.00009012509690364823,0.0000963951024459675,0.00010234734509140253,0.00010711255163187161,0.00010984943219227716,0.0001099715955206193,0.00010730816575232893,0.00010215298971161246,0.00009519089508103207,0.00008732554852031171,0.00007946131518110633,0.0000723025732440874,0.00006622320506721735,0.00006123045750427991,0.000057012992328964174,0.00005303749276208691,0.000048652433179086074,0.00004317121783969924,0.00003592966095311567,0.000026331097615184262,0.000013896578821004368,-0.000001672377834438521,-0.000020427280105650425,-0.000042123105231439695,-0.0000662081001792103,-0.00009186681563733146,-0.0001181163388537243,-0.00014394095342140645,-0.00016843822959344834,-0.00019094254821538925,-0.00021109427325427532,-0.00022883583733346313,-0.00024433957878500223,-0.0002578961430117488,-0.0002698059834074229,-0.0002803110983222723,-0.0002895814541261643,-0.00029774251743219793,-0.00030491198413074017,-0.00031121386564336717,-0.0003167532559018582,-0.0003215580072719604,-0.0003255112678743899,-0.00032830677810125053,-0.00032945603015832603,-0.0003283621626906097,-0.0003244548861403018,-0.00031735666561871767,-0.00030703190714120865,-0.0002938679826911539,-0.000278653169516474,-0.0002624476619530469,-0.0002463776618242264,-0.00023140633129514754,-0.00021813953935634345,-0.0002067128079943359,-0.00019678189710248262,-0.0001876146998256445,-0.00017826023395173252,-0.00016775612311903387,-0.00015532986435573548,-0.0001405538059771061,-0.0001234263036167249,-0.00010436950105940923,-0.00008415252523263916,-0.00006376202509272844,-0.000044247433834243566,-0.000026568104658508673,-0.000011464861927379388,6.271037591432105e-7,0.000009614734153728932,0.00001573277586430777,0.000019488481484586373,0.000021582729459623806,0.000022826641725259833,0.000024067714548436925,0.000026130530386581086,0.000029768823878839612,0.000035621658753370866,0.000044167452870169654,0.00005567447442444973,0.00007015382288955152,0.00008732856076676399,0.00010663809371180832,0.0001272952213184908,0.00014840233779978007,0.00016911329294089228,0.0001888065307866782,0.0002072214992949739,0.00022451345284935087,0.00024120243324432522,0.00025802376330830157,0.0002757183101493865,0.00029482098761945963,0.00031550507992506027,0.00033752204035408795,0.0003602458455134183,0.00038279854925349355,0.00040421218727715313,0.0004235752858221531,0.0004401261976454407,0.00045327970292419195,0.0004626039008144289,0.00046778167597949505,0.0004685919266194105,0.0004649283364415169,0.00045684780343435705,0.00044462125515565276,0.0004287557094357908,0.0004099663347005844,0.00038909591967239976,0.0003669965371955186,0.000344400032190606,0.0003218085039407015,0.00029943246045149863,0.0002771933504845947,0.00025478910538367927,0.00023180483549367636,0.00020784014486707747,0.00018262400408275425,0.0001560969976708293,0.00012845030869357288,0.00010011937411036342,0.00007173539052018896,0.00004404181527206674,0.00001778925070539117,-0.0000063717066041135695,-0.000027975996999884956,-0.00004678725963458419,-0.0000627885019639507,-0.00007612610352225602,-0.00008702753257239237,-0.00009572077397024259,-0.00010237976675853133,-0.00010710886999731883,-0.00010996519267791882,-0.00011100694973720238,-0.00011035056377295405,-0.00010821857722476125,-0.00010496263712411746,-0.00010105248657055199,-0.0000970323380897753,-0.00009345871512778103,-0.00009084040357265621,-0.00008959838305599988,-0.00009004988532979041,-0.00009240760118700564,-0.00009677981142885983,-0.00010316499538021162,-0.00011144673044327646,-0.00012140201579313725,-0.0001327317295363173,-0.0001451098796678707,-0.00015823679859749973,-0.000171877647517249,-0.0001858729519881308,-0.00020011620654258877,-0.00021450294298119843,-0.00022886338410899043,-0.00024289710563607514,-0.00025613297475501895,-0.000267935887677595,-0.0002775712637230754,-0.0002843193360604346,-0.00028761118301190436,-0.0002871470642276108,-0.00028295989613980055,-0.0002754041342996061,-0.0002650732349138707,-0.00025267043383792043,-0.00023886896087788045,-0.0002242000336991623,-0.00020899790979456156,-0.00019341536972206086,-0.00017749932885635644,-0.0001612941996427253,-0.0001449258124921471,-0.0001286246842937544,-0.00011267072113696486,-0.00009727710857987404,-0.00008246012293966487,-0.00006795208173571154,-0.00005320275522535667,-0.000037485438951989636,-0.000020088833480258472,-5.462161425384693e-7,0.000021163406927371398,0.00004450463893590495,0.00006840514106443152,0.0000914070988073945,0.00011191261728527024,0.0001284586760448292,0.00013995454355608672,0.0001458341721445322,0.0001461068750359118,0.00014131584612186998,0.00013242730346973985,0.00012067509669577703,0.00010738302808022127,0.00009378684626426548,0.00008087883907137439,0.00006929755909368396,0.00005927864185650833,0.000050672188081080094,0.000043021453166147694,0.000035688706702785566,0.000028006463253404945,0.000019425266145844944,0.000009625464372220449,-0.0000014334731304188608,-0.000013533950550481677,-0.00002627421054057777,-0.000039159309380920604,-0.000051673083362402394,-0.0000633139643468894,-0.00007360322342719883,-0.00008209100633393973,-0.00008838413486955687,-0.00009220444189850241,-0.00009346706792712212,-0.00009235490870196372,-0.00008936076483223587,-0.0000852719895192422,-0.00008108285692287609,-0.0000778384055593051,-0.00007643666322110221,-0.00007743675087112933,-0.00008092604548437521,-0.00008648498624097556,-0.00009325802966486663,-0.000100107463367749,-0.00010580784146441147,-0.00010923850641120225,-0.00010954476601909846,-0.0001062540031853132,-0.00009934312402037904,-0.00008925617294153199,-0.00007687099423492327,-0.00006341444532154128,-0.00005032973422203213,-0.00003910403756890446,-0.0000310704272123985,-0.000027205638616578653,-0.000027955507903243415,-0.00003312820990686305,-0.00004189333048998378,-0.00005290545232128352,-0.00006453729292843491,-0.00007517228368669748,-0.00008348581468453631,-0.00008864788105711341,-0.00009040412260219455,-0.00008902710396796465,-0.00008516266098013148,-0.00007962021481944248,-0.00007316564006032422,-0.00006636988837271929,-0.00005954413063591346,-0.000052759889513254166,-0.00004592126060742885,-0.000038841251807753,-0.000031281771953217685,-0.000022943702788325027,-0.000013424883945845068,-0.0000021849191398359835,0.000011442729373811744,0.000028167907657916658,0.00004859490945818834,0.00007304098107852042,0.00010137484059669077,0.00013293045049067587,0.00016653459169901907,0.00020065467106178403,0.00023363673244602978,0.00026397511828690767,0.00029054676997475326,0.00031275604851543903,0.0003305647987872362,0.0003444159228820354,0.00035508262226358056,0.00036348606226965785,0.00037051987601444125,0.0003769083705265075,0.00038311112439259887,0.0003892776439897716,0.00039524785825051367,0.00040059175807982683,0.0004046803223900497,0.0004067787085659802,0.0004061514337081462,0.0004021668282803148,0.00039438586100004613,0.00038262063753791153,0.0003669554425869137,0.0003477314312476665,0.0003255058254580945,0.00030099955620244145,0.0002750431012827903,0.00024852229398675263,0.0002223200281150639,0.0001972497411770746,0.00017398314957972616,0.00015298272774089128,0.00013445557851810008,0.00011834463657578453,0.00010436578304506838,0.00009208794654114172,0.00008104072912828997,0.00007082527008606121,0.00006120042962720618,0.00005212044561631046,0.00004371131581137888,0.00003619021663325839,0.000029750921385129914,0.000024451615900034085,0.000020142353605479002,0.000016455860532005318,0.00001286196584260324,0.000008763356163399294,0.0000035985317481390666,-0.0000030798000807408243,-0.000011569806702027563,-0.000022031897970009595,-0.00003453505632933229,-0.00004911697033094242,-0.00006583220965694636,-0.00008476528455503285,-0.00010599716915749013,-0.00012953273835591972,-0.00015521576278842986,-0.0001826674269977957,-0.00021127772924955934,-0.00024025911989156157,-0.0002687469241209328,-0.0002959152334369719,-0.00032107470906339586,-0.00034373090602457523,-0.0003635978209786117,-0.00038057556957937777,-0.00039470658521167934,-0.00040612652082927525,-0.0004150218446739018,-0.00042160190059803426,-0.0004260863352101296,-0.00042870049946941435,-0.00042966826003976166,-0.0004291928780730814,-0.00042742668301798403,-0.0004244399897288531,-0.00042020497494377196,-0.0004146048449911177,-0.0004074671887792647,-0.000398609641706571,-0.0003878818533848971,-0.00037519136094488204,-0.0003605102247092873,-0.0003438669955357909,-0.00032533580088056624,-0.000305034191114828,-0.0002831395249813795,-0.000259922060649842,-0.00023578156833536923,-0.00021126569481566548,-0.00018704967806115746,-0.0001638687972445041,-0.00014241371536627412,-0.0001232126960530877,-0.00010653064964571968,-0.00009231086005456746,-0.00008017495565582067,-0.00006948488589841872,-0.00005945773591520265,-0.000049312697228742763,-0.000038420890632551163,-0.000026426152544445358,-0.000013310514987097122,6.101023473092937e-7,0.00001476024954172317,0.0000284366851701634,0.000040974213334266096,0.00005191380114411004,0.00006113545532571152,0.00006891934026498348,0.00007591025496367365,0.0000829845666885376,0.00009104845958063379,0.00010082106746267527,0.00011266353249084204,0.00012650058488361537,0.00014184994506649673,0.00015794024511706084,0.00017387360276188701,0.00018878195260185748,0.00020193644741084427,0.0002127907209796831,0.00022096339671406895,0.00022618721413891762,0.00022826284111943096,0.0002270515833515674,0.00022252117923926562,0.00021483116142917424,0.0002044199500232935,0.00019204855198040605,0.0001787686487659812,0.0001658084656810388,0.00015439825074281543,0.00014557491522282362,0.00014001052477397025,0.00013790158845949918,0.00013894183211959898,0.0001423827779944986,0.00014716896112076938,0.00015212054131552577,0.000156128138769418,0.0001583251723786816,0.00015820961561985314,0.00015569839160889387,0.00015111005632206798,0.00014508236199617386,0.0001384405913995579,0.0001320385345024988,0.00012659782078117132,0.00012257123307790607,0.00012005330790998414,0.00011875533527927473,0.0001180517501779832,0.00011709186219377443,0.00011495649232529104,0.00011082786659244448,0.00010413706331746653,0.00009465939365327358,0.00008254157000919804,0.00006826156459283084,0.000052536215662257746,0.00003620002462412231,0.000020080653484910727,0.000004893670393357752,-0.000008827277270029299,-0.000020758303435286507,-0.000030775234336033463,-0.000038918511563679203,-0.00004534881009021774,-0.000050304810429224744,-0.00005406642594607547,-0.000056919921917142347,-0.000059120269725099206,-0.00006085015775170177,-0.00006218023190740496,-0.0000630380236543715,-0.00006319231033558026,-0.0000622577135800384,-0.000059722417063312605,-0.00005499987310031429,-0.00004750166044686921,-0.000036723467928823084,-0.00002233223494840786,-0.000004241626811563037,0.000017334221411147155,0.00004185579746263102,0.00006846839823992923,0.00009605431114323437,0.00012333168706391007,0.00014899636153131723,0.00017188845959026366,0.00019115123723167926,0.00020634317479562014,0.000217469860217534,0.00022492041171062738,0.0002293185389135033,0.00023132417118176818,0.00023143876751419157,0.00022987056581769139,0.00022650095343124121,0.00022096202883403748,0.00021279951033648103,0.00020166569447610527,0.00018747817375697196,0.00017049444431904703,0.00015128514496609569,0.0001306249905610457,0.0001093470273190178,0.00008821237133815885,0.00006783473509131,0.000048673799028620124,0.00003108370219706558,0.000015382318451884203,0.000001900721031233843,-0.000009018010132422205,-0.00001707767842162866,-0.000022124342649476603,-0.000024236907847807743,-0.000023770122425048612,-0.000021325546185835265,-0.00001765526940289419,-0.000013528869203582872,-0.000009605021659808699,-0.0000063437096287088934,-0.0000039788651520211715,-0.000002552581008785637,-0.000001995810634980444,-0.000002228741095677833,-0.0000032486207146575907,-0.000005176790637051454,-0.000008251417057181243,-0.000012773668458976317,-0.00001903293923533056,-0.000027241570933256298,-0.00003749923052964732,-0.00004978954893886112,-0.0000639982390566729,-0.0000799394038040191,-0.00009738282096805051,-0.00011608150816755369,-0.00013579985534306616,-0.00015633895236533135,-0.00017755257431417704,-0.0001993487385334447,-0.00022167676070239395,-0.00024450343335047364,-0.00026778317987918854,-0.00029142526909708977,-0.00031526150996796787,-0.0003390218480490148,-0.0003623260708991438,-0.0003846982726827264,-0.00040560096385888755,-0.00042447750456631184,-0.0004407872911542654,-0.0004540260706562549,-0.00046373458462767303,-0.00046950846444815397,-0.0004710229695774615,-0.00046807737089693546,-0.00046065208152867854,-0.0004489612765610218,-0.00043347899918444455,-0.0004149209999013692,-0.00039417375228367746,-0.00037217795033939183,-0.0003497891884762794,-0.0003276503412052989,-0.00030611007241532207,-0.0002852102625183761,-0.00026474587502889335,-0.00024437817046418786,-0.00022376878769136965,-0.0002026988222496584,-0.00018114427803084254,-0.00015929355868138373,-0.0001375100400764495,-0.00011625655315583572,-0.00009600683551980183,-0.00007716651452938095,-0.000060017002397216856,-0.000044682372390525416,-0.00003111093974439427,-0.000019063989384449087,-0.00000811248719401192,0.0000023477180093323113,0.000013048588698438834,0.000024763692636042833,0.000038190446502994746,0.00005382276140153408,0.00007184432615758851,0.00009207145922118798,0.00011396394984330982,0.00013670574116986245,0.00015933968825265765,0.0001809258828870952,0.0002006868162425235,0.00021810623002238572,0.00023296363360714167,0.0002453068154864013,0.000255384249612689,0.0002635688870213926,0.00027030069031752646,0.00027606001822277904,0.0002813644241541624,0.00028676778310909867,0.0002928389876615256,0.0003001068835146725,0.00030897516990080476,0.00031962653156369925,0.0003319442621432245,0.0003454805410001427,0.0003594903682824224,0.00037303546559996903,0.00038514327025040984,0.00039498874684795737,0.0004020558553747833,0.00040623670793138444,0.00040783980512060225,0.0004075040342286229,0.00040604008245281875,0.00040424015605822206,0.00040269980672746897,0.0004016887105535716,0.00040109301335178316,0.0004004354414064437,0.0003989677643403411,0.0003958167799282819,0.00039015436777845025,0.0003813551156781614,0.00036910755443386734,0.0003534567076712847,0.0003347743477206677,0.0003136710438411683,0.0002908750029746443,0.0002671057009138167,0.000242967827944085,0.00021888536866754293,0.00019508511468302459,0.00017162668518722057,0.00014846204430796206,0.0001254991366295144,0.00010264562297379598,0.00007982083479873836,0.00005694086939911358,0.00003389572520973161,0.00001054109543474624,-0.00001327960671915207,-0.000037681180401705205,-0.00006266272976063192,-0.00008803538366919383,-0.00011337552859913558,-0.00013802270404994488,-0.0001611307088751346,-0.00018176581943407655,-0.0001990321761695668,-0.00021219614427536726,-0.0002207825455116108,-0.0002246264775749296,-0.00022387814533431083,-0.00021896969701629132,-0.00021055722027085721,-0.00019944881205447018,-0.0001865265949163586,-0.00017266854410991073,-0.00015867712500039488,-0.0001452225842513144,-0.00013280805433169007,-0.00012176106974948198,-0.00011225308116991073,-0.00010434499563416466,-0.0000980511395027861,-0.00009340645920019597,-0.00009051517554325983,-0.00008956025703810155,-0.0000907644716789946,-0.00009431291982764378,-0.00010026370728155598,-0.00010847948578884825,-0.00011860477388836443,-0.00013009796384721994,-0.00014230974193196744,-0.00015458787675015628,-0.00016638152010273188,-0.00017731777916196734,-0.0001872281718533486,-0.00019611563766375184,-0.0002040712279267609,-0.00021116645075380802,-0.00021735625341534615,-0.00022242248815018684,-0.00022597321367356926,-0.00022749578056391329,-0.00022644862474408,-0.0002223699848400429,-0.00021498074056580663,-0.00020425839466042817,-0.0001904638047562912,-0.00017411101725883782,-0.00015588500536978245,-0.00013652830966748297,-0.00011672710388666019,-0.0000970265464275144,-0.00007779346196912229,-0.000059228612371953204,-0.00004141702447668649,-0.000024397044398938306,-0.000008226936188293621,0.00000696974029779085,0.000020992250938434154,0.000033586242352612317,0.000044491847802419215,0.00005349506682250649,0.00006045868940418586,0.00006531707185786217,0.00006803456926718354,0.00006854347884654999,0.00006668704008916393,0.0000621932849753648,0.00005469768075272441,0.00004381875623948872,0.000029275364795466885,0.000011019087651220616,-0.000010654694960976485,-0.00003505463610053994,-0.00006112591654527932,-0.00008757036994211376,-0.00011303018982289359,-0.0001362898328807205,-0.00015644458471797407,-0.0001729948417050764,-0.00018584949430078268,-0.00019524872186593711,-0.0002016380021814257,-0.0002055339136859402,-0.00020741614571306854,-0.00020766477973666042,-0.00020654129912145436,-0.00020419717475306243,-0.00020068853336852044,-0.00019598256039898843,-0.00018995555001311004,-0.0001823961065383628,-0.0001730319781927392,-0.0001615924556972459,-0.00014790322165936232,-0.00013199348177295178,-0.00011418425856390968,-0.00009512635006103665,-0.00007576695497846231,-0.00005724319635191932,-0.000040721683035371825,-0.000027219281037105247,-0.000017444877812522464,-0.000011693960914271884,-0.00000981123412202578,-0.00001121877085097367,-0.000014995468518463895,-0.000019989884094684385,-0.00002495075750630349,-0.00002866288195946254,-0.00003007760642503854,-0.00002842649701051414,-0.00002330567986064125,-0.000014718547390657477,-0.0000030673436413053423,0.000010910098353633657,0.00002625362503749784,0.00004192903361399658,0.000056987308198586106,0.00007070651918184012,0.00008269082172773778,0.00009291077731177211,0.00010168270819121972,0.00010959726932924241,0.00011741536582121626,0.00012595148291438818,0.0001359611051157117,0.0001480431528761983,0.0001625630393391475,0.00017959934484679252,0.00019891765259671956,0.00021997764997649938,0.0002419796510366723,0.00026395294116809964,0.0002848789154086262,0.0003038317081518471,0.0003201105573680252,0.00033333824831061065,0.0003435053222347051,0.0003509512171149254,0.00035628650221042335,0.000360271631507203,0.00036367616849020123,0.000367145286872983,0.0003710986638907343,0.00037567614344879985,0.0003807341563515365,0.00038588340976275504,0.00039055425440892577,0.0003940770693589002,0.0003957711160182953,0.00039503988227806985,0.0003914696571882814,0.0003849211789201945,0.000375594972865656,0.00036404887214303017,0.00035114941420033574,0.0003379537374712527,0.0003255351912230253,0.0003147837705910206,0.0003062233445234597,0.0002998901472892612,0.0002953061193693429,0.0002915587683673948,0.00028747081523761153,0.0002818155917339027,0.00027352175675332546,0.00026181701105087996,0.00024628377286717296,0.0002268323878524825,0.00020362314535304904,0.00017697947623673826,0.00014732698036823422,0.00011517324310261756,0.00008111992065096274,0.00004588226875057444,0.000010286048564012162,-0.000024779201339697465,-0.000058453326346352696,-0.00009002628212329,-0.00011905176506843418,-0.00014541602286044508,-0.0001693355879979208,-0.0001912796578835696,-0.0002118358970619738,-0.0002315545716555789,-0.0002508093020878732,-0.0002697060408536345,-0.00028805737383663654,-0.0003054234548471868,-0.00032120669493451715,-0.0003347773163113743,-0.0003456018166616559,-0.00035334902349859476,-0.0003579549374990165,-0.0003596385649871081,-0.0003588703693822026,-0.00035630352795124054,-0.00035268213832750916,-0.000348742789356038,-0.0003451254451647401,-0.0003423077578190714,-0.00034057191805914044,-0.00034000727464444935,-0.00034054371644742787,-0.00034200531081296504,-0.0003441708395257592,-0.0003468276117928326,-0.0003498086298350245,-0.0003530067333485931,-0.0003563649661373347,-0.00035984767600893974,-0.0003634024760685861,-0.0003669277939479798,-0.0003702595131471753,-0.000373184127965942,-0.0003754751232918352,-0.00037693846388719976,-0.0003774486540351063,-0.000376959826098755,-0.000375486008124426,-0.0003730560711119324,-0.0003696569474413991,-0.00036518310662359,-0.0003594076551962644,-0.00035198431578464806,-0.00034248133306391537,-0.0003304386336822063,-0.00031543575460091233,-0.00029715572600252926,-0.0002754360903054476,-0.0002503020514268428,-0.00022198157967068255,-0.00019090181740466505,-0.00015766509750392288,-0.0001230024645337835,-0.00008770688145887107,-0.000052554656576830894,-0.000018230563000543043,0.000014725199434906244,0.00004593451740220189,0.00007515937613788992,0.00010224942525383085,0.00012707911082543433,0.00014949891192372888,0.00016932158905547112,0.0001863510551629588,0.00020044483244419098,0.00021158502204343677,0.00021992585971020162,0.00022579130018129945,0.00022961365175433457,0.00023182776931207627,0.0002327545080333948,0.00023251523089129478,0.00023101031547412276,0.00022797427664045244,0.00022309426276478916,0.0002161583979614079,0.00020719124586321414,0.00019653714844025671,0.00018486678891349584,0.00017310203111264855,0.0001622755080461502,0.0001533569593448192,0.00014708677190355957,0.00014385349641088396,0.00014363945228978992,0.00014604128955397755,0.00015035575779620558,0.00015570985851809382,0.00016120892541948706,0.00016607582801952958,0.00016975749167613685,0.00017198114073835313,0.00017275370191782713,0.0001723113382468,0.00017103782738558948,0.00016937738109845668,0.000167762758792378,0.00016656931256875396,0.00016609190788585693,0.00016653299098834395,0.00016798931756056845,0.00017043085244949907,0.00017367451800964773,0.00017736315203364938,0.00018096464918926358,0.00018380448454990983,0.00018513800750952214,0.00018425720918457955,0.00018061390437651426,0.00017393194139003754,0.00016427956870757043,0.0001520815712865442,0.00013806586503051221,0.0001231557980645448,0.00010833190754055977,0.00009449169738218188,0.0000823332229629159,0.00007228021422633901,0.00006445639883168042,0.00005870654422324151,0.00005465441427077167,0.000051783375965896994,0.00004952506787958555,0.00004734430694952607,0.00004481283758650534]}},"plate":{"n":103,"pos0":[-0.03,-0.05196152422706632,0,-0.018000000000000002,-0.05196152422706632,0,-0.006,-0.05196152422706632,0,0.006,-0.05196152422706632,0,0.018000000000000002,-0.05196152422706632,0,0.03,-0.05196152422706632,0,-0.036000000000000004,-0.041569219381653054,0,-0.024,-0.041569219381653054,0,-0.012,-0.041569219381653054,0,0,-0.041569219381653054,0,0.012,-0.041569219381653054,0,0.024,-0.041569219381653054,0,0.036000000000000004,-0.041569219381653054,0,-0.042,-0.03117691453623979,0,-0.03,-0.03117691453623979,0,-0.018000000000000002,-0.03117691453623979,0,-0.006,-0.03117691453623979,0,0.006,-0.03117691453623979,0,0.018000000000000002,-0.03117691453623979,0,0.03,-0.03117691453623979,0,0.042,-0.03117691453623979,0,-0.048,-0.020784609690826527,0,-0.036000000000000004,-0.020784609690826527,0,-0.024,-0.020784609690826527,0,-0.012,-0.020784609690826527,0,0,-0.020784609690826527,0,0.012,-0.020784609690826527,0,0.024,-0.020784609690826527,0,0.036000000000000004,-0.020784609690826527,0,0.048,-0.020784609690826527,0,-0.054,-0.010392304845413263,0,-0.042,-0.010392304845413263,0,-0.03,-0.010392304845413263,0,-0.018000000000000002,-0.010392304845413263,0,-0.006,-0.010392304845413263,0,0.006,-0.010392304845413263,0,0.018000000000000002,-0.010392304845413263,0,0.03,-0.010392304845413263,0,0.042,-0.010392304845413263,0,0.054,-0.010392304845413263,0,-0.06,0,0,-0.048,0,0,-0.036000000000000004,0,0,-0.024,0,0,-0.012,0,0,0,0,0,0.012,0,0,0.024,0,0,0.036000000000000004,0,0,0.048,0,0,0.06,0,0,-0.054,0.010392304845413263,0,-0.042,0.010392304845413263,0,-0.03,0.010392304845413263,0,-0.018000000000000002,0.010392304845413263,0,-0.006,0.010392304845413263,0,0.006,0.010392304845413263,0,0.018000000000000002,0.010392304845413263,0,0.03,0.010392304845413263,0,0.042,0.010392304845413263,0,0.054,0.010392304845413263,0,-0.048,0.020784609690826527,0,-0.036000000000000004,0.020784609690826527,0,-0.024,0.020784609690826527,0,-0.012,0.020784609690826527,0,0,0.020784609690826527,0,0.012,0.020784609690826527,0,0.024,0.020784609690826527,0,0.036000000000000004,0.020784609690826527,0,0.048,0.020784609690826527,0,-0.042,0.03117691453623979,0,-0.03,0.03117691453623979,0,-0.018000000000000002,0.03117691453623979,0,-0.006,0.03117691453623979,0,0.006,0.03117691453623979,0,0.018000000000000002,0.03117691453623979,0,0.03,0.03117691453623979,0,0.042,0.03117691453623979,0,-0.036000000000000004,0.041569219381653054,0,-0.024,0.041569219381653054,0,-0.012,0.041569219381653054,0,0,0.041569219381653054,0,0.012,0.041569219381653054,0,0.024,0.041569219381653054,0,0.036000000000000004,0.041569219381653054,0,-0.03,0.05196152422706632,0,-0.018000000000000002,0.05196152422706632,0,-0.006,0.05196152422706632,0,0.006,0.05196152422706632,0,0.018000000000000002,0.05196152422706632,0,0.03,0.05196152422706632,0,-0.019999999999999997,-0.05196152422706632,0,-0.04,-0.05196152422706632,0,-0.03,-0.04196152422706632,0,-0.03,-0.06196152422706632,0,0.028000000000000004,-0.05196152422706632,0,0.008000000000000002,-0.05196152422706632,0,0.018000000000000002,-0.04196152422706632,0,0.018000000000000002,-0.06196152422706632,0,0.04,-0.03117691453623979,0,0.019999999999999997,-0.03117691453623979,0,0.03,-0.021176914536239787,0,0.03,-0.04117691453623979,0],"mass":[0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001],"pinned":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1],"springs":[[0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,22,23,23,23,24,24,24,25,25,25,26,26,26,27,27,27,28,28,28,29,29,30,30,30,31,31,31,32,32,32,33,33,33,34,34,34,35,35,35,36,36,36,37,37,37,38,38,38,39,39,40,40,41,41,41,42,42,42,43,43,43,44,44,44,45,45,45,46,46,46,47,47,47,48,48,48,49,49,49,50,51,51,52,52,52,53,53,53,54,54,54,55,55,55,56,56,56,57,57,57,58,58,58,59,59,59,60,61,61,62,62,62,63,63,63,64,64,64,65,65,65,66,66,66,67,67,67,68,68,68,69,70,70,71,71,71,72,72,72,73,73,73,74,74,74,75,75,75,76,76,76,77,78,78,79,79,79,80,80,80,81,81,81,82,82,82,83,83,83,84,85,86,87,88,89,0,0,0,0,4,4,4,4,19,19,19,19],[1,6,7,2,7,8,3,8,9,4,9,10,5,10,11,11,12,7,13,14,8,14,15,9,15,16,10,16,17,11,17,18,12,18,19,19,20,14,21,22,15,22,23,16,23,24,17,24,25,18,25,26,19,26,27,20,27,28,28,29,22,30,31,23,31,32,24,32,33,25,33,34,26,34,35,27,35,36,28,36,37,29,37,38,38,39,31,40,41,32,41,42,33,42,43,34,43,44,35,44,45,36,45,46,37,46,47,38,47,48,39,48,49,49,50,41,51,42,51,52,43,52,53,44,53,54,45,54,55,46,55,56,47,56,57,48,57,58,49,58,59,50,59,60,60,52,61,53,61,62,54,62,63,55,63,64,56,64,65,57,65,66,58,66,67,59,67,68,60,68,69,69,62,70,63,70,71,64,71,72,65,72,73,66,73,74,67,74,75,68,75,76,69,76,77,77,71,78,72,78,79,73,79,80,74,80,81,75,81,82,76,82,83,77,83,84,84,79,85,80,85,86,81,86,87,82,87,88,83,88,89,84,89,90,90,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102],[7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,7000000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,2000],[0.011999999999999997,0.012000000000000004,0.012,0.012000000000000002,0.012,0.012000000000000004,0.012,0.012,0.012,0.012000000000000002,0.012,0.012,0.011999999999999997,0.012000000000000004,0.012,0.012,0.012000000000000004,0.012000000000000004,0.012,0.012000000000000004,0.012,0.012,0.012,0.012,0.012000000000000004,0.012,0.012,0.012,0.012,0.012,0.012,0.012000000000000004,0.012000000000000004,0.012,0.012,0.012000000000000004,0.012,0.012000000000000004,0.011999999999999997,0.011999999999999997,0.011999999999999997,0.011999999999999999,0.011999999999999997,0.012000000000000002,0.011999999999999997,0.011999999999999999,0.012,0.011999999999999999,0.011999999999999999,0.012000000000000002,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.011999999999999997,0.012000000000000004,0.011999999999999997,0.011999999999999999,0.011999999999999997,0.011999999999999997,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.012000000000000002,0.012,0.011999999999999999,0.011999999999999999,0.012,0.012000000000000002,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012000000000000004,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.012000000000000002,0.011999999999999999,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.012000000000000002,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.012000000000000002,0.012,0.011999999999999999,0.011999999999999999,0.012,0.012000000000000002,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012000000000000004,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.012000000000000002,0.011999999999999999,0.012000000000000002,0.012,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.012000000000000002,0.011999999999999997,0.012000000000000002,0.011999999999999999,0.012000000000000004,0.011999999999999999,0.012000000000000002,0.011999999999999997,0.011999999999999999,0.011999999999999999,0.011999999999999999,0.011999999999999997,0.011999999999999997,0.012000000000000004,0.011999999999999997,0.011999999999999999,0.012,0.011999999999999997,0.011999999999999997,0.012,0.011999999999999999,0.011999999999999999,0.012,0.011999999999999999,0.011999999999999999,0.012,0.011999999999999999,0.011999999999999999,0.012000000000000004,0.011999999999999997,0.011999999999999997,0.011999999999999997,0.011999999999999999,0.011999999999999997,0.011999999999999997,0.012000000000000004,0.012,0.011999999999999997,0.012000000000000004,0.012,0.012000000000000002,0.012,0.012000000000000004,0.012,0.012,0.012,0.012000000000000002,0.012,0.012,0.011999999999999997,0.012000000000000004,0.012,0.012000000000000004,0.012,0.012000000000000004,0.012,0.012000000000000004,0.012000000000000004,0.012,0.012,0.012,0.012,0.012000000000000004,0.012,0.012,0.012,0.012,0.012,0.012,0.012000000000000004,0.012000000000000004,0.012,0.012,0.012000000000000004,0.011999999999999997,0.012000000000000002,0.012,0.012000000000000002,0.011999999999999997,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075,0.0075],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],"bends":[[0,1,2,3,6,7,8,9,10,13,14,15,16,17,18,21,22,23,24,25,26,27,30,31,32,33,34,35,36,37,40,41,42,43,44,45,46,47,48,51,52,53,54,55,56,57,58,61,62,63,64,65,66,67,70,71,72,73,74,75,78,79,80,81,82,85,86,87,88,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,40,41,42,43,44,45,46,47,48,51,52,53,54,55,56,57,58,61,62,63,64,65,66,67,70,71,72,73,74,75,13,14,15,16,17,18,21,22,23,24,25,26,27,30,31,32,33,34,35,36,37,40,41,42,43,44,45,46,47,48,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],[1,2,3,4,7,8,9,10,11,14,15,16,17,18,19,22,23,24,25,26,27,28,31,32,33,34,35,36,37,38,41,42,43,44,45,46,47,48,49,52,53,54,55,56,57,58,59,62,63,64,65,66,67,68,71,72,73,74,75,76,79,80,81,82,83,86,87,88,89,7,8,9,10,11,12,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,78,79,80,81,82,83,6,7,8,9,10,11,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,30,31,32,33,34,35,36,37,38,41,42,43,44,45,46,47,48,49,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,71,72,73,74,75,76,77,79,80,81,82,83,84],[2,3,4,5,8,9,10,11,12,15,16,17,18,19,20,23,24,25,26,27,28,29,32,33,34,35,36,37,38,39,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,72,73,74,75,76,77,80,81,82,83,84,87,88,89,90,15,16,17,18,19,20,23,24,25,26,27,28,29,32,33,34,35,36,37,38,39,42,43,44,45,46,47,48,49,50,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,72,73,74,75,76,77],[700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000,700000],[0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523,0.013070064261028523]],"hinges":[[],[],[],[],[],[]],"dashpots":[[0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,13,13,13,14,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,21,21,21,22,22,22,23,23,23,24,24,24,25,25,25,26,26,26,27,27,27,28,28,28,29,29,30,30,30,31,31,31,32,32,32,33,33,33,34,34,34,35,35,35,36,36,36,37,37,37,38,38,38,39,39,40,40,41,41,41,42,42,42,43,43,43,44,44,44,45,45,45,46,46,46,47,47,47,48,48,48,49,49,49,50,51,51,52,52,52,53,53,53,54,54,54,55,55,55,56,56,56,57,57,57,58,58,58,59,59,59,60,61,61,62,62,62,63,63,63,64,64,64,65,65,65,66,66,66,67,67,67,68,68,68,69,70,70,71,71,71,72,72,72,73,73,73,74,74,74,75,75,75,76,76,76,77,78,78,79,79,79,80,80,80,81,81,81,82,82,82,83,83,83,84,85,86,87,88,89,0,0,0,0,4,4,4,4,19,19,19,19],[1,6,7,2,7,8,3,8,9,4,9,10,5,10,11,11,12,7,13,14,8,14,15,9,15,16,10,16,17,11,17,18,12,18,19,19,20,14,21,22,15,22,23,16,23,24,17,24,25,18,25,26,19,26,27,20,27,28,28,29,22,30,31,23,31,32,24,32,33,25,33,34,26,34,35,27,35,36,28,36,37,29,37,38,38,39,31,40,41,32,41,42,33,42,43,34,43,44,35,44,45,36,45,46,37,46,47,38,47,48,39,48,49,49,50,41,51,42,51,52,43,52,53,44,53,54,45,54,55,46,55,56,47,56,57,48,57,58,49,58,59,50,59,60,60,52,61,53,61,62,54,62,63,55,63,64,56,64,65,57,65,66,58,66,67,59,67,68,60,68,69,69,62,70,63,70,71,64,71,72,65,72,73,66,73,74,67,74,75,68,75,76,69,76,77,77,71,78,72,78,79,73,79,80,74,80,81,75,81,82,76,82,83,77,83,84,84,79,85,80,85,86,81,86,87,82,87,88,83,88,89,84,89,90,90,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448947,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952,0.000009335760186448952],[0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.13070064261028522,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346834,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827,0.000028007280559346827]],"friction":[0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286,0.009202969151190286],"hits":[{"t":0,"beads":[37,38,48,49,58,59],"velocity":[0,0,0],"force":[0,0,-60],"duration":0.0003}],"duration":0.02,"sampleRate":48000,"dtGiven":0.0000020833333333333334,"method":"verlet","listen":6,"dt":0.0000020833333333333334,"energyDrift":0.00003424419447322453,"audio":{"acceleration":[0,0.00030675448942929506,0.21123920381069183,2.6506595611572266,-31.332536697387695,-305.56829833984375,-753.8512573242188,-420.266357421875,1204.1864013671875,3270.083251953125,4789.55908203125,5518.16162109375,5911.748046875,5558.48193359375,3433.958251953125,157.27804565429688,-1896.177734375,-1600.3521728515625,-375.9989929199219,718.3861694335938,2012.1256103515625,3233.002197265625,3182.155517578125,1543.409912109375,-956.645751953125,-3028.461669921875,-4189.04052734375,-4713.41162109375,-4720.3095703125,-3724.900390625,-2031.566162109375,-1718.6021728515625,-3517.12353515625,-6120.90380859375,-7818.7998046875,-7693.43896484375,-5946.15478515625,-3294.42822265625,-142.61959838867188,2659.952880859375,4308.341796875,4933.48046875,5297.05078125,5349.69091796875,4746.626953125,3563.0166015625,1899.2772216796875,914.1422119140625,1556.18017578125,2915.38818359375,3886.763916015625,4716.21142578125,5884.83203125,7462.70751953125,8413.1650390625,7169.75048828125,3372.347412109375,-403.1316223144531,-2784.375732421875,-4807.7841796875,-6276.1298828125,-5723.00439453125,-3273.84814453125,-1410.7459716796875,-1630.9180908203125,-3122.618408203125,-4280.74951171875,-5098.27001953125,-5553.4375,-4921.8271484375,-2608.7119140625,131.2469482421875,2065.1689453125,2858.894287109375,2246.72216796875,797.5177612304688,-803.2603759765625,-1627.0281982421875,-1712.460205078125,-1121.8275146484375,447.52130126953125,3061.3447265625,5620.1640625,6634.8798828125,6092.830078125,5442.70263671875,4754.6630859375,2699.225341796875,-111.26927185058594,-2265.045654296875,-4145.9912109375,-6814.21337890625,-8271.1630859375,-6482.4052734375,-2867.475341796875,-144.58802795410156,445.5503845214844,-133.14659118652344,-804.5384521484375,-1862.020751953125,-3453.67236328125,-4412.04248046875,-3960.2275390625,-2220.275390625,251.33119201660156,2673.353515625,3938.044189453125,3900.582763671875,3181.06689453125,2070.67236328125,1470.0294189453125,2142.997314453125,4500.5439453125,7884.1923828125,10246.2314453125,10102.693359375,8234.4375,6356.8369140625,4290.11572265625,999.7191772460938,-2376.2392578125,-3903.829345703125,-3903.07080078125,-3841.1015625,-4015.7392578125,-3337.160888671875,-1795.635009765625,-823.3397216796875,-1018.6251220703125,-1660.58203125,-2546.65673828125,-4562.14990234375,-7229.18798828125,-8669.376953125,-8462.6376953125,-7109.76708984375,-4863.46875,-1941.7740478515625,1137.0101318359375,3365.821044921875,4114.94970703125,3354.416015625,2011.725830078125,1129.9849853515625,1809.2276611328125,4397.09716796875,6924.33203125,7132.609375,5953.87353515625,4876.09619140625,3039.86181640625,-36.95954132080078,-2536.80419921875,-2635.418701171875,-1527.3924560546875,-836.8887939453125,-334.257568359375,1206.881103515625,2630.86669921875,1693.7056884765625,-1040.7757568359375,-3461.686279296875,-4788.90478515625,-5440.66845703125,-5673.162109375,-5766.33056640625,-5527.71240234375,-4486.73583984375,-1968.100341796875,1495.4837646484375,4666.28759765625,6519.58056640625,7077.50048828125,6814.9287109375,5318.6005859375,3086.576171875,1806.1580810546875,2405.094482421875,3444.369384765625,4106.2548828125,5142.48974609375,6107.43701171875,5182.4052734375,2438.1630859375,-131.81484985351562,-1395.20458984375,-1776.0107421875,-2059.818603515625,-1861.3203125,-1064.8184814453125,-713.6529541015625,-2189.669921875,-5145.455078125,-7955.78125,-9674.0888671875,-10116.244140625,-9519.4091796875,-7956.50439453125,-5521.88427734375,-2907.194580078125,-893.7525634765625,645.8154907226562,2109.294189453125,3423.728515625,4245.39892578125,4136.73046875,2649.0654296875,699.8158569335938,380.4287109375,1767.764892578125,3139.260009765625,4030.04296875,5516.71142578125,7814.1572265625,9255.5966796875,8372.4970703125,5581.36865234375,2487.814208984375,-143.1737060546875,-2300.7314453125,-3017.30615234375,-1924.095458984375,-702.4159545898438,-972.9446411132812,-2597.32177734375,-4524.32373046875,-5930.53466796875,-6533.87158203125,-6257.482421875,-4923.736328125,-2668.61572265625,-272.57537841796875,1593.72705078125,2798.349853515625,2853.94189453125,1917.664794921875,1010.9640502929688,438.66204833984375,-40.442596435546875,7.093413352966309,1256.144775390625,2916.650146484375,3950.863037109375,4735.125,6171.34326171875,7761.72705078125,7739.43798828125,5593.80029296875,2759.403564453125,8.228445053100586,-3151.03857421875,-6407.49462890625,-8328.2763671875,-7818.30126953125,-5544.38818359375,-3264.635009765625,-2543.029296875,-3399.148681640625,-4681.61376953125,-5723.70751953125,-6499.67919921875,-6720.58544921875,-5790.61767578125,-3771.87255859375,-1379.6458740234375,571.0279541015625,1453.4765625,1274.0198974609375,737.7389526367188,6.549869060516357,-288.5821228027344,1065.847900390625,4030.34765625,7218.794921875,9294.294921875,9884.73046875,9404.837890625,8610.810546875,7473.37744140625,5449.7607421875,2748.28466796875,81.60414123535156,-2244.31787109375,-3956.842041015625,-4651.27197265625,-3754.177001953125,-1756.15087890625,-365.4777526855469,-229.1099395751953,-425.7112121582031,-807.3867797851562,-2595.41943359375,-5678.05126953125,-8125.8720703125,-8597.9775390625,-7172.89599609375,-4576.1337890625,-2007.9085693359375,-38.30962371826172,1230.288330078125,1641.065185546875,1079.627685546875,179.05384826660156,239.12457275390625,1886.591064453125,4589.2109375,6745.34228515625,7250.79833984375,6470.703125,5025.16748046875,2709.7265625,-312.77392578125,-2849.654296875,-3814.137451171875,-3635.98583984375,-3353.52734375,-3030.302001953125,-2118.70947265625,-754.694091796875,-329.319091796875,-1309.54150390625,-2693.105712890625,-3932.414306640625,-5282.02734375,-6779.76416015625,-8032.47216796875,-8496.0419921875,-7597.77490234375,-5149.79833984375,-1554.0152587890625,2404.714599609375,5480.00341796875,6373.64306640625,5398.22314453125,3935.7705078125,3153.969970703125,3522.265625,4529.2109375,5491.40185546875,6167.83203125,6673.70361328125,6657.078125,5440.83251953125,2910.21484375,148.60081481933594,-1203.53173828125,-853.069091796875,-149.34535217285156,295.8008117675781,1030.323486328125,1442.5396728515625,-38.74532699584961,-3295.1611328125,-6127.98779296875,-7521.4501953125,-8343.017578125,-9133.8076171875,-9312.8291015625,-8260.65625,-6308.97509765625,-4173.7666015625,-1945.8924560546875,406.0179443359375,2339.73583984375,3297.38134765625,3216.157958984375,2009.9049072265625,-67.56483459472656,-1514.859130859375,-1252.253173828125,171.06976318359375,1714.7218017578125,3257.816162109375,4893.3330078125,5744.07275390625,4723.2705078125,2540.583740234375,720.6276245117188,-587.8956909179688,-1768.7652587890625,-1907.975341796875,-459.07904052734375,521.505126953125,-725.76611328125,-3428.059814453125,-5726.43603515625,-6923.041015625,-7242.84375,-6901.63525390625,-5700.92041015625,-3588.982421875,-1295.311767578125,513.128662109375,1888.6363525390625,2896.90234375,3144.261962890625,2752.2255859375,1966.5364990234375,1095.375244140625,582.5906982421875,806.7036743164062,1522.35693359375,2095.80224609375,2829.7177734375,4643.86083984375,7374.0771484375,8950.845703125,7758.26171875,4734.00439453125,1708.38720703125,-1049.2105712890625,-3688.595458984375,-5282.32275390625,-5078.7099609375,-3837.87939453125,-3048.470947265625,-3348.305908203125,-4399.298828125,-5590.14501953125,-6845.39794921875,-7762.83935546875,-7335.89208984375,-5592.10888671875,-3659.80712890625,-2241.4814453125,-1252.870849609375,-841.6441040039062,-1289.1121826171875,-2229.626220703125,-2875.649658203125,-2849.513916015625,-2016.863525390625,-258.58770751953125,2088.90576171875,4010.224365234375,4987.4453125,5852.56640625,7040.31005859375,7482.64501953125,6205.9501953125,4069.98095703125,1951.8681640625,-752.2294921875,-3801.406005859375,-5172.3779296875,-3863.85400390625,-1432.725830078125,145.57180786132812,646.2432861328125,860.9812622070312,683.5557250976562,-726.8799438476562,-3174.549560546875,-5258.48583984375,-6001.43505859375,-5142.310546875,-2913.572998046875,-584.6835327148438,476.76409912109375,252.20362854003906,-470.7044982910156,-1090.430908203125,-1321.5548095703125,-655.0960083007812,1289.3409423828125,3877.595458984375,5634.9306640625,6042.3154296875,6046.5625,5717.0830078125,4142.41259765625,1622.337646484375,-511.97381591796875,-1900.188720703125,-3005.1923828125,-3862.181640625,-3936.010498046875,-3047.7080078125,-1692.51708984375,-633.9857788085938,-168.96588134765625,-172.37777709960938,-1058.7886962890625,-3248.887451171875,-6222.35791015625,-8657.7919921875,-9631.943359375,-9097.833984375,-7315.9853515625,-4537.04638671875,-1385.0516357421875,1117.8209228515625,2051.496826171875,1343.165771484375,17.225114822387695,-438.7132568359375,855.6558227539062,3045.171142578125,4641.455078125,5338.00390625,5809.9453125,5940.57763671875,4826.55810546875,2650.98974609375,667.2510986328125,-135.05575561523438,272.6020812988281,1201.939453125,2295.180419921875,3592.14794921875,4272.828125,3360.47216796875,1392.060302734375,-328.7796630859375,-1651.9906005859375,-3291.022705078125,-5313.1923828125,-7145.89892578125,-8073.1396484375,-7573.474609375,-5585.3515625,-2642.59765625,159.23020935058594,2002.3519287109375,2725.86962890625,2279.72509765625,808.3366088867188,-923.7714233398438,-1904.0738525390625,-1915.072265625,-1213.1722412109375,389.4098815917969,2605.81298828125,4063.328369140625,3768.303955078125,2272.31884765625,855.4503173828125,142.71070861816406,-87.5407485961914,9.023597717285156,734.3953247070312,1999.3795166015625,2565.476318359375,1340.964599609375,-1281.06298828125,-4024.6142578125,-5848.74560546875,-6711.33935546875,-7078.4033203125,-6959.4033203125,-5957.6943359375,-4263.85205078125,-2575.171875,-1072.0023193359375,442.9226989746094,1739.2904052734375,2266.282958984375,1675.3311767578125,297.52197265625,-851.8153076171875,-1253.966796875,-1081.30224609375,-362.02532958984375,1272.4952392578125,3880.340576171875,6859.0859375,9009.3828125,9071.958984375,7148.40576171875,4652.90625,2688.0537109375,1512.6502685546875,1266.2509765625,1813.918701171875,2229.8447265625,1456.12353515625,-303.1620178222656,-1987.95361328125,-3278.70849609375,-4640.90771484375,-5874.49560546875,-5880.107421875,-4461.6982421875,-2744.05517578125,-1693.6190185546875,-1400.1192626953125,-1638.273681640625,-2245.917236328125,-3086.269775390625,-3928.566650390625,-4389.86279296875,-4134.63623046875,-3332.281005859375,-2314.95556640625,-1059.0479736328125,628.775146484375,2965.458740234375,5599.70556640625,7297.01220703125,7145.76806640625,5705.10302734375,3818.07568359375,1413.467529296875,-1299.3050537109375,-2868.05517578125,-2275.0556640625,-353.0199890136719,1175.9617919921875,1536.1304931640625,1122.9373779296875,254.27682495117188,-1109.8553466796875,-2786.610107421875,-4042.620849609375,-4267.63720703125,-3484.7255859375,-2210.479736328125,-1104.520751953125,-708.7053833007812,-1235.965087890625,-2449.62890625,-3476.32666015625,-3252.45703125,-1704.261962890625,373.001220703125,2350.57568359375,4066.149658203125,5399.1376953125,6562.72998046875,7646.01025390625,7907.87158203125,6866.46826171875,5083.63427734375,3291.260009765625,1553.3614501953125,-126.13053894042969,-1102.2772216796875,-642.1282958984375,793.050048828125,1948.7283935546875,2527.034912109375,2992.41162109375,2666.7470703125,256.0291748046875,-3721.816162109375,-7189.39794921875,-8727.4453125,-8552.2939453125,-7452.6806640625,-5869.470703125,-4192.12451171875,-3105.161865234375,-2997.1904296875,-3440.459228515625,-3814.270263671875,-3590.361572265625,-2152.692138671875,401.457763671875,2806.387451171875,4160.19921875,4795.20556640625,5132.400390625,4724.7900390625,3384.898681640625,2100.119873046875,1680.367919921875,1740.447265625,1797.74658203125,2365.554931640625,3738.083251953125,4935.28759765625,5037.98193359375,4504.06982421875,4005.37646484375,2994.904052734375,662.759033203125,-2575.865478515625,-5600.13525390625,-7581.5703125,-8018.89306640625,-6759.34765625,-4087.966796875,-971.7869262695312,1193.8038330078125,1752.1981201171875,1164.54931640625,170.99827575683594,-643.1256713867188,-764.4992065429688,-157.7301025390625,803.159912109375,2266.213134765625,4300.41357421875,5837.4462890625,5593.80126953125,3810.801025390625,2181.84814453125,1875.2706298828125,2499.3349609375,3256.261962890625,4091.625732421875,4982.72900390625,5147.685546875,3892.32080078125,1695.2022705078125,-534.1407470703125,-2501.262451171875,-4544.2431640625,-6680.62109375,-8161.630859375,-8510.9345703125,-8010.42041015625,-6877.78759765625,-4923.31982421875,-2533.44482421875,-677.6224365234375,195.2847900390625,102.03150177001953,-1031.2572021484375,-2676.63916015625,-3671.3818359375,-3413.096923828125,-2125.168701171875,7.179814338684082,2961.85986328125,5959.6689453125,7730.95703125,7814.7998046875,6983.45458984375,6062.2119140625,5151.693359375,4615.49609375,5210.27197265625,6507.04833984375,6776.78369140625,5141.4111328125,2584.17626953125,405.4053649902344,-1280.255615234375,-2930.582763671875,-4337.2783203125,-4754.3505859375,-4046.180908203125,-2850.56396484375,-1682.802490234375,-899.556396484375,-764.8618774414062,-1057.727294921875,-1393.9854736328125,-1859.9632568359375,-2624.155517578125,-3308.886962890625,-3529.688232421875,-3358.158935546875,-2662.30859375,-765.0697631835938,2569.24853515625,6183.208984375,8337.51953125,8475.984375,7328.38037109375,5575.7646484375,3447.514404296875,1468.605712890625,464.2132568359375,567.7164916992188,1115.96826171875,1396.7451171875,1033.3106689453125,29.401168823242188,-1481.1046142578125,-3284.000732421875,-4750.490234375,-5150.8837890625,-4525.01318359375,-3613.800048828125,-2916.29248046875,-2545.320068359375,-2573.7626953125,-3066.75048828125,-3944.2978515625,-4766.142578125,-4782.3974609375,-3647.19677734375,-1815.250244140625,-29.011829376220703,1503.0936279296875,3274.947998046875,5644.27587890625,8126.82568359375,9674.0380859375,9817.5419921875,8881.763671875,7193.3310546875,4903.8388671875,2564.509765625,1188.6007080078125,1358.292236328125,2500.76416015625,3546.45751953125,4192.44091796875,4589.6337890625,4128.35888671875,1982.0570068359375,-1279.28662109375,-4155.380859375,-5662.8076171875,-5677.09228515625,-4764.1865234375,-3902.461669921875,-3745.334228515625,-4163.0693359375,-4717.248046875,-5064.6396484375,-4882.12646484375,-3951.849853515625,-2379.16845703125,-516.6238403320312,1317.993408203125,3065.12548828125,4540.890625,5233.7880859375,4945.7197265625,4142.201171875,3357.4658203125,2614.05322265625,1712.4609375,781.4006958007812,414.7586364746094,1018.873779296875,2157.233642578125,3162.53369140625,3928.533447265625,4366.91845703125,3809.0361328125,1636.59619140625,-1809.8787841796875,-5273.75390625,-7519.42529296875,-8107.73095703125,-7298.630859375,-5424.369140625,-2930.968994140625,-815.217529296875,-65.43497467041016,-566.2062377929688,-1210.230712890625,-1119.6287841796875,-245.65005493164062,1057.4351806640625,2494.67724609375,3968.25732421875,5384.654296875,6293.84130859375,6172.400390625,5038.78759765625,3700.1240234375,3147.27099609375,3556.397216796875,4295.7197265625,4949.0087890625,5543.4755859375,5743.9287109375,5169.8857421875,4203.57421875,3269.20068359375,1871.652587890625,-659.4541625976562,-3994.154296875,-6880.22119140625,-8417.6806640625,-8693.703125,-7931.7373046875,-6076.90478515625,-3534.479248046875,-1374.8900146484375,-328.1722412109375,-427.70806884765625,-1432.161865234375,-2906.320068359375,-4163.53515625,-4494.6650390625,-3486.656982421875,-1283.1124267578125,1407.671142578125,3571.19677734375,4390.38720703125,3961.947998046875,3275.778564453125,3112.298583984375,3267.583740234375,3538.1845703125,4360.271484375,5626.05419921875,6166.64013671875,5133.90625,3054.697265625,998.1669311523438,-656.8272705078125,-2188.653076171875,-3671.454833984375,-4650.1923828125,-4719.84423828125,-4050.7060546875,-2967.23193359375,-1567.4508056640625,-86.45594024658203,930.4305419921875,1109.4598388671875,585.0835571289062,-386.97552490234375,-1689.744873046875,-3029.054443359375,-3752.98583984375,-3196.8046875,-1181.048828125,1944.8782958984375,5297.9990234375,7512.73828125,7811.0859375,6769.93017578125,5367.4384765625,3997.8525390625,2914.31201171875,2563.918701171875,2873.790771484375,3024.4033203125,2393.79833984375,1211.0098876953125,-42.284263610839844,-1499.6988525390625,-3455.8876953125,-5174.5107421875,-5448.01708984375,-4310.12744140625,-3074.078369140625,-2585.118896484375,-2590.503662109375,-2793.58447265625,-3259.34716796875,-3931.29638671875,-4558.646484375,-5026.98046875,-5306.4619140625,-5204.7646484375,-4518.72802734375,-3289.689453125,-1429.176025390625,1334.6611328125,4549.38818359375,6897.01513671875,7604.97705078125,7092.1845703125,5789.73828125,3753.639892578125,1589.447021484375,475.75341796875,892.0338134765625,2054.5634765625,3005.24658203125],"velocity":[0,6.350734382820633e-10,9.304036439061747e-7,0.000027126883651362732,-0.00009043111640494317,-0.0029893170576542616,-0.014328069984912872,-0.02881913259625435,-0.02242545783519745,0.024414164945483208,0.10983996838331223,0.2182123214006424,0.3377031981945038,0.4595353305339813,0.5564900636672974,0.5940729975700378,0.5719302892684937,0.5322316288948059,0.5115329623222351,0.5152311325073242,0.5430575609207153,0.5988702178001404,0.668572187423706,0.7201723456382751,0.7266784906387329,0.6835737824440002,0.6070402264595032,0.5134273171424866,0.41406404972076416,0.3238910436630249,0.26435115933418274,0.2291330248117447,0.17749528586864471,0.07690240442752838,-0.07099328935146332,-0.23588460683822632,-0.38007986545562744,-0.47751227021217346,-0.5136752128601074,-0.48592063784599304,-0.4111407995223999,-0.31375932693481445,-0.20711950957775116,-0.09514781087636948,0.011028733104467392,0.09869205206632614,0.15577131509780884,0.18261374533176422,0.20577265322208405,0.25249776244163513,0.32408928871154785,0.4134849011898041,0.5230023264884949,0.6618767976760864,0.8296618461608887,0.9969323873519897,1.1095987558364868,1.1380540132522583,1.1032867431640625,1.0240671634674072,0.9064855575561523,0.7770798206329346,0.6819924116134644,0.6361939311027527,0.6081085205078125,0.5590862035751343,0.48094117641448975,0.38297149538993835,0.27090179920196533,0.15909039974212646,0.07818304747343063,0.053281038999557495,0.07772430032491684,0.13148964941501617,0.18669573962688446,0.2193717360496521,0.21866874396800995,0.19171708822250366,0.15595152974128723,0.12500432133674622,0.11605151742696762,0.15127909183502197,0.24333156645298004,0.3742808997631073,0.5084659457206726,0.6278133988380432,0.7354748845100403,0.8156984448432922,0.8424951434135437,0.8161542415618896,0.7503536939620972,0.6368805170059204,0.4749092161655426,0.3159232437610626,0.21780423820018768,0.18982206284999847,0.19627340137958527,0.20024165511131287,0.19050443172454834,0.1639898121356964,0.10875051468610764,0.02469654753804207,-0.06502760201692581,-0.13122275471687317,-0.15242899954319,-0.12094525992870331,-0.049409929662942886,0.03381751477718353,0.10857545584440231,0.16336189210414886,0.19852980971336365,0.23353596031665802,0.2998305857181549,0.4286155700683594,0.6210529208183289,0.8374348878860474,1.0296823978424072,1.181068778038025,1.2935070991516113,1.3506098985671997,1.3343267440795898,1.265215516090393,1.1825940608978271,1.1026934385299683,1.0204576253890991,0.9416728019714355,0.8878545761108398,0.8626039624214172,0.8450182676315308,0.8172021508216858,0.7745080590248108,0.7028010487556458,0.5794206261634827,0.41067367792129517,0.229890376329422,0.06594421714544296,-0.06010546162724495,-0.13194893300533295,-0.13973762094974518,-0.09067169576883316,-0.009905518032610416,0.06994007527828217,0.12585408985614777,0.156932532787323,0.18396097421646118,0.2462884932756424,0.3668958842754364,0.5176078081130981,0.6542870998382568,0.7671841979026794,0.8519946336746216,0.8845537900924683,0.8544103503227234,0.7965948581695557,0.7530177235603333,0.729559600353241,0.7164624333381653,0.723630428314209,0.7662752866744995,0.8158889412879944,0.82393479347229,0.7751372456550598,0.687665581703186,0.5801645517349243,0.46399226784706116,0.34456223249435425,0.22605453431606293,0.11967823654413223,0.0498226024210453,0.04439094662666321,0.11004751920700073,0.22933819890022278,0.3724783658981323,0.5188974142074585,0.6474997997283936,0.7350771427154541,0.7828817963600159,0.8242308497428894,0.8858956694602966,0.9646161198616028,1.0599745512008667,1.1788458824157715,1.3006768226623535,1.381547451019287,1.403806447982788,1.385557770729065,1.35197114944458,1.3118013143539429,1.269646406173706,1.2387022972106934,1.2223187685012817,1.1957038640975952,1.1204166412353516,0.9825910925865173,0.7967079877853394,0.5885366797447205,0.3823716640472412,0.19862818717956543,0.05710155516862869,-0.030147619545459747,-0.06852180510759354,-0.0707453265786171,-0.042003385722637177,0.01615815795958042,0.09720884263515472,0.1866227388381958,0.25959816575050354,0.2933703064918518,0.3007577657699585,0.3216390609741211,0.3738897144794464,0.4486476480960846,0.5462132096290588,0.684715986251831,0.8657371401786804,1.0536351203918457,1.2009586095809937,1.2843602895736694,1.3081142902374268,1.281324863433838,1.2224626541137695,1.1688473224639893,1.143129825592041,1.128661036491394,1.0929460525512695,1.0184142589569092,0.9082155823707581,0.7769636511802673,0.6420573592185974,0.5236887335777283,0.4435136318206787,0.41345012187957764,0.42824214696884155,0.47542959451675415,0.5366284847259521,0.5871442556381226,0.6169958710670471,0.6317545175552368,0.6357219815254211,0.633614182472229,0.6448811292648315,0.6888723373413086,0.7616180777549744,0.8515953421592712,0.963854193687439,1.110184669494629,1.2756452560424805,1.417262077331543,1.5041662454605103,1.533220648765564,1.5013859272003174,1.400965690612793,1.243799090385437,1.0714231729507446,0.9305739402770996,0.8404150605201721,0.7832469344139099,0.7231293320655823,0.638826310634613,0.5299201011657715,0.4021095931529999,0.26285818219184875,0.13032245635986328,0.02933366969227791,-0.024226712062954903,-0.031284548342227936,-0.008020899258553982,0.02160784788429737,0.04283875599503517,0.050826624035835266,0.0459449328482151,0.05068907514214516,0.1019316241145134,0.2201443612575531,0.3946678340435028,0.5968810319900513,0.7989339828491211,0.9868054986000061,1.1554722785949707,1.2917819023132324,1.3776710033416748,1.4067134857177734,1.3834196329116821,1.3174853324890137,1.2255514860153198,1.135070562362671,1.077186942100525,1.0573322772979736,1.0527377128601074,1.0457030534744263,1.0341640710830688,1.0018341541290283,0.9164766669273376,0.7698990106582642,0.5920877456665039,0.42496395111083984,0.30157962441444397,0.23385529220104218,0.21363691985607147,0.2273886799812317,0.25892725586891174,0.288790762424469,0.30133530497550964,0.30317848920822144,0.3226243555545807,0.3894612193107605,0.5098721981048584,0.6585807204246521,0.8029575347900391,0.9238471984863281,1.0061460733413696,1.031537413597107,0.9965159296989441,0.9242212772369385,0.8457277417182922,0.7731360197067261,0.7061370015144348,0.6511269211769104,0.62143474817276,0.6128294467926025,0.5974730849266052,0.5556392669677734,0.4864977300167084,0.39092907309532166,0.2652703523635864,0.11013486981391907,-0.06392980366945267,-0.23426119983196259,-0.3695405125617981,-0.4407576620578766,-0.4316668212413788,-0.3466435372829437,-0.21904781460762024,-0.09436629712581635,0.0025787344202399254,0.07452062517404556,0.14230561256408691,0.22574619948863983,0.33059921860694885,0.452432781457901,0.5865576863288879,0.7269430756568909,0.8554289937019348,0.9441649317741394,0.9749087691307068,0.9605603814125061,0.937131404876709,0.9272274971008301,0.9287164211273193,0.9419543147087097,0.9696874618530273,0.9883890748023987,0.9550525546073914,0.8544596433639526,0.7102976441383362,0.5449110865592957,0.36257222294807434,0.16860684752464294,-0.01659589819610119,-0.16920633614063263,-0.27840375900268555,-0.3425002992153168,-0.358438104391098,-0.3285084366798401,-0.26792579889297485,-0.19833162426948547,-0.14179649949073792,-0.12107598036527634,-0.14006593823432922,-0.1718110591173172,-0.18401910364627838,-0.16415123641490936,-0.1126328855752945,-0.027488190680742264,0.08588900417089462,0.19824421405792236,0.27436140179634094,0.30708158016204834,0.3081170320510864,0.28305181860923767,0.2417212575674057,0.215474933385849,0.21916893124580383,0.22096043825149536,0.17849962413311005,0.08133763074874878,-0.05220213904976845,-0.2010151743888855,-0.3495025038719177,-0.482563853263855,-0.5804373621940613,-0.6308761835098267,-0.6380085349082947,-0.6125299334526062,-0.5616831183433533,-0.4973558485507965,-0.4351117014884949,-0.3854522705078125,-0.35379576683044434,-0.3373125493526459,-0.3242136240005493,-0.30012407898902893,-0.26206883788108826,-0.21184886991977692,-0.13636881113052368,-0.011402565985918045,0.16270028054714203,0.34149932861328125,0.47294777631759644,0.5392653346061707,0.546100914478302,0.496019184589386,0.399766206741333,0.2888855040073395,0.19558367133140564,0.12554970383644104,0.06073437258601189,-0.01929205097258091,-0.12333660572767258,-0.25275883078575134,-0.40642744302749634,-0.5665110945701599,-0.702599823474884,-0.7983497977256775,-0.8589236736297607,-0.8946342468261719,-0.915108859539032,-0.9358799457550049,-0.9723842144012451,-1.0265758037567139,-1.0874605178833008,-1.1396976709365845,-1.164932370185852,-1.146159052848816,-1.0809855461120605,-0.9860839247703552,-0.8738245368003845,-0.7395464181900024,-0.5856863260269165,-0.44034042954444885,-0.3330860435962677,-0.27012330293655396,-0.25610384345054626,-0.3044185936450958,-0.40247949957847595,-0.5005146861076355,-0.5555667877197266,-0.5666778683662415,-0.5572947859764099,-0.541458249092102,-0.5239355564117432,-0.5218797922134399,-0.5618059635162354,-0.6514343023300171,-0.7713661193847656,-0.8902517557144165,-0.9757732152938843,-1.0109148025512695,-1.0093863010406494,-1.0002044439315796,-1.0022850036621094,-1.0189874172210693,-1.045097827911377,-1.0677721500396729,-1.06321382522583,-1.0093106031417847,-0.9077061414718628,-0.7844156622886658,-0.658444344997406,-0.5344971418380737,-0.42929840087890625,-0.3687984347343445,-0.358674019575119,-0.3847098648548126,-0.4360077381134033,-0.5083662867546082,-0.5913478136062622,-0.6654829978942871,-0.7150083184242249,-0.7382058501243591,-0.7457193732261658,-0.7483144998550415,-0.7590657472610474,-0.8017719388008118,-0.9001228213310242,-1.0571452379226685,-1.2504254579544067,-1.447890043258667,-1.62083101272583,-1.7456634044647217,-1.8071764707565308,-1.8079283237457275,-1.7717645168304443,-1.7341928482055664,-1.7202026844024658,-1.7272858619689941,-1.7257733345031738,-1.6852341890335083,-1.603379249572754,-1.4984065294265747,-1.382280707359314,-1.2584491968154907,-1.1437852382659912,-1.0650241374969482,-1.031888723373413,-1.0287296772003174,-1.0288763046264648,-1.0138393640518188,-0.9778149127960205,-0.9165027737617493,-0.8323766589164734,-0.7500300407409668,-0.6999385952949524,-0.6899393796920776,-0.7106195688247681,-0.7612003087997437,-0.8505616188049316,-0.9812815189361572,-1.1419380903244019,-1.3075881004333496,-1.4469846487045288,-1.5334892272949219,-1.5581685304641724,-1.533744215965271,-1.4825432300567627,-1.4283652305603027,-1.3948718309402466,-1.3965883255004883,-1.427871584892273,-1.469018816947937,-1.5028806924819946,-1.5131590366363525,-1.4820476770401,-1.4099931716918945,-1.3254019021987915,-1.2615348100662231,-1.2299705743789673,-1.2207406759262085,-1.2206952571868896,-1.2222518920898438,-1.2158491611480713,-1.1875427961349487,-1.1374627351760864,-1.0935673713684082,-1.0915330648422241,-1.1477292776107788,-1.25252366065979,-1.3845876455307007,-1.5288422107696533,-1.6762616634368896,-1.8124775886535645,-1.919517993927002,-1.990349292755127,-2.0282232761383057,-2.034796953201294,-2.011216878890991,-1.9677526950836182,-1.924744963645935,-1.9036537408828735,-1.9105812311172485,-1.9337407350540161,-1.9588714838027954,-1.9751110076904297,-1.9674739837646484,-1.9151397943496704,-1.803075909614563,-1.6350725889205933,-1.4426323175430298,-1.2712875604629517,-1.1486459970474243,-1.073460340499878,-1.0311518907546997,-1.0038951635360718,-0.9726342558860779,-0.929172694683075,-0.8883911371231079,-0.8756124973297119,-0.9002652764320374,-0.9554604887962341,-1.0375672578811646,-1.1482232809066772,-1.273491382598877,-1.3829236030578613,-1.4573885202407837,-1.5021690130233765,-1.5332930088043213,-1.5641913414001465,-1.604123830795288,-1.659417748451233,-1.7327674627304077,-1.8204541206359863,-1.9105255603790283,-1.9888699054718018,-2.0479910373687744,-2.083681106567383,-2.08913516998291,-2.052821397781372,-1.9632478952407837,-1.8261147737503052,-1.6725437641143799,-1.5374302864074707,-1.437636137008667,-1.3820233345031738,-1.3812791109085083,-1.4280455112457275,-1.4851864576339722,-1.5133439302444458,-1.5029220581054688,-1.4728327989578247,-1.4442410469055176,-1.429120421409607,-1.4371545314788818,-1.4777132272720337,-1.550276517868042,-1.638792872428894,-1.720943808555603,-1.7805395126342773,-1.814252257347107,-1.831602692604065,-1.8503190279006958,-1.8880480527877808,-1.9511598348617554,-2.023876667022705,-2.077216148376465,-2.091264486312866,-2.0625205039978027,-1.9951144456863403,-1.89588463306427,-1.7713261842727661,-1.6227267980575562,-1.4585613012313843,-1.3026258945465088,-1.1776645183563232,-1.0906563997268677,-1.040136456489563,-1.0257065296173096,-1.0405328273773193,-1.0612722635269165,-1.0602532625198364,-1.0304793119430542,-0.9833336472511292,-0.9256179928779602,-0.8639545440673828,-0.8295889496803284,-0.8646246790885925,-0.9808915853500366,-1.1502593755722046,-1.332465648651123,-1.5002821683883667,-1.6396344900131226,-1.7440879344940186,-1.8184980154037476,-1.8805429935455322,-1.9472460746765137,-2.0233614444732666,-2.1020638942718506,-2.164322853088379,-2.18361759185791,-2.1487648487091064,-2.0743792057037354,-1.9804540872573853,-1.8763750791549683,-1.7718702554702759,-1.6863763332366943,-1.6303786039352417,-1.5924817323684692,-1.5569895505905151,-1.5203083753585815,-1.4784578084945679,-1.4157463312149048,-1.3239505290985107,-1.2181634902954102,-1.1185302734375,-1.0298744440078735,-0.9551369547843933,-0.9146745204925537,-0.934009850025177,-1.0203831195831299,-1.160002589225769,-1.3254164457321167,-1.4821923971176147,-1.5970405340194702,-1.649292230606079,-1.644376516342163,-1.6110724210739136,-1.5794026851654053,-1.5653201341629028,-1.571031928062439,-1.5871585607528687,-1.5976606607437134,-1.5914528369903564,-1.560691237449646,-1.4927089214324951,-1.3849109411239624,-1.2623251676559448,-1.1629738807678223,-1.1022965908050537,-1.0623961687088013,-1.0175772905349731,-0.9575806856155396,-0.8813570737838745,-0.7864779233932495,-0.6788210868835449,-0.5822528600692749,-0.523301899433136,-0.5116655826568604,-0.5435465574264526,-0.6164986491203308,-0.7337771654129028,-0.8901860117912292,-1.0657243728637695,-1.238908290863037,-1.3952369689941406,-1.5195722579956055,-1.5971653461456299,-1.6290380954742432,-1.6323935985565186,-1.6275582313537598,-1.635568380355835,-1.6742902994155884,-1.7423768043518066,-1.8182886838912964,-1.8774409294128418,-1.9010342359542847,-1.871180772781372,-1.7771881818771362,-1.6316437721252441,-1.4671841859817505,-1.312408685684204,-1.176586389541626,-1.0598366260528564,-0.9594777822494507,-0.8593025803565979,-0.737106442451477,-0.5955953001976013,-0.46855250000953674,-0.3878600001335144,-0.3578776717185974,-0.3673785626888275,-0.4111761450767517,-0.48794054985046387,-0.5848084688186646,-0.6779635548591614,-0.7500796318054199,-0.796968936920166,-0.8228791952133179,-0.8391203880310059,-0.8577819466590881,-0.8833445310592651,-0.9167395234107971,-0.9630998373031616,-1.0255173444747925,-1.0975795984268188,-1.169908881187439,-1.2340161800384521,-1.2723511457443237,-1.2554914951324463,-1.1631895303726196,-1.0083924531936646,-0.830207109451294,-0.6641453504562378,-0.5289291739463806,-0.434536337852478,-0.3843447268009186,-0.3663395047187805,-0.3570600152015686,-0.33959653973579407,-0.31251296401023865,-0.2859956920146942,-0.27395060658454895,-0.2883013188838959,-0.33781978487968445,-0.422826886177063,-0.5281025767326355,-0.6300898790359497,-0.7147538661956787,-0.7822600603103638,-0.838540256023407,-0.8911029100418091,-0.9490523338317871,-1.0216515064239502,-1.1131047010421753,-1.2145085334777832,-1.3041218519210815,-1.3615447282791138,-1.3802216053009033,-1.3647291660308838,-1.3158760070800781,-1.2238885164260864,-1.0797470808029175,-0.8919793367385864,-0.6866779327392578,-0.49041810631752014,-0.32178622484207153,-0.19499698281288147,-0.11793945729732513,-0.08130727708339691,-0.057315729558467865,-0.017787111923098564,0.045963358134031296,0.1270514577627182,0.21915076673030853,0.3123892843723297,0.37899506092071533,0.38696369528770447,0.32856041193008423,0.22358626127243042,0.1031854972243309,-0.006378886289894581,-0.09576742351055145,-0.17411881685256958,-0.25589489936828613,-0.3484879732131958,-0.45100605487823486,-0.5557968616485596,-0.6491219997406006,-0.7159180641174316,-0.746238648891449,-0.7377292513847351,-0.6919018030166626,-0.6118031144142151,-0.5082504153251648,-0.4007604420185089,-0.30578723549842834,-0.2278827726840973,-0.1655503362417221,-0.12015243619680405,-0.09453391283750534,-0.083613321185112,-0.07023407518863678,-0.03737558051943779,0.018533196300268173,0.09272189438343048,0.18011298775672913,0.2677140533924103,0.32730361819267273,0.32678335905075073,0.2517964541912079,0.11576423794031143,-0.04976196959614754,-0.2123190015554428,-0.3464340567588806,-0.43385547399520874,-0.4711829125881195,-0.4776582717895508,-0.4828997850418091,-0.502163290977478,-0.5279700756072998,-0.5432621836662292,-0.5352382659912109,-0.49832093715667725,-0.43105626106262207,-0.3332693874835968,-0.21021625399589539,-0.07835495471954346,0.039698731154203415,0.13011159002780914,0.19958218932151794,0.2681833803653717,0.3499870300292969,0.4464193284511566,0.5559198260307312,0.674676239490509,0.789606511592865,0.8873340487480164,0.9652600288391113,1.0203638076782227,1.0350651741027832,0.9870339632034302,0.8718863129615784,0.710062563419342,0.5299610495567322,0.35496076941490173,0.20722049474716187,0.1067533865571022,0.0571570061147213,0.041508764028549194,0.035440366715192795,0.017334090545773506,-0.027576062828302383,-0.10224732756614685,-0.1945207118988037,-0.28004300594329834,-0.33132171630859375,-0.3300410211086273,-0.2763885259628296,-0.19086231291294098,-0.10240046679973602,-0.027522122487425804,0.03804028034210205,0.1043655276298523,0.1747714728116989,0.2557935118675232,0.3598552644252777,0.48505499958992004,0.6054326295852661,0.6915388107299805,0.733082115650177,0.736111044883728,0.7065064907073975,0.6451112627983093,0.5570627450942993,0.4578709006309509,0.36558738350868225,0.2918975055217743,0.24419915676116943,0.22724485397338867,0.23730933666229248,0.2600173354148865,0.27860888838768005,0.28132855892181396,0.26013121008872986,0.21057359874248505,0.13821090757846832,0.06326789408922195,0.015315335243940353,0.021910525858402252,0.0980822741985321,0.23456241190433502,0.39735841751098633,0.5505912899971008,0.6771163940429688,0.7744914293289185,0.8456044793128967,0.9011794924736023,0.9572551846504211,1.01974618434906,1.0775797367095947,1.115569829940796,1.127736210823059,1.1124560832977295,1.0614652633666992,0.969977617263794,0.8562971949577332,0.7531823515892029,0.6772311329841614,0.6195622086524963,0.5660957098007202,0.5103593468666077,0.4478152394294739,0.37305590510368347,0.284373939037323,0.18424899876117706,0.07618339359760284,-0.03420276939868927,-0.13651730120182037,-0.21873454749584198,-0.2692657709121704,-0.2717900574207306,-0.21025800704956055,-0.08844652771949768,0.06532109528779984,0.21994802355766296,0.3554573059082031,0.45590758323669434,0.5107941031455994,0.5296598672866821,0.5416448712348938,0.5720627307891846,0.6255256533622742],"displacement":[0,7.915048553640974e-16,3.3728506099173217e-12,1.9826870700789812e-10,6.624711335057043e-10,-2.1325464061305865e-8,-1.8453042116561846e-7,-6.459996484409203e-7,-0.0000012404005929056439,-0.0000012964621873834403,4.5897493805568956e-8,0.0000034367544685665052,0.000009212867553287651,0.000017529855540487915,0.0000281923475995427,0.000040299892134498805,0.0000525221366842743,0.00006401167047442868,0.00007483836088795215,0.00008549381891498342,0.00009646981197874993,0.0001083190509234555,0.0001215234660776332,0.00013605054118670523,0.00015121503383852541,0.00016598176443949342,0.00017946814477909356,0.00019115883333142847,0.0002008207084145397,0.00020847086852882057,0.0002145343751180917,0.00021966297936160117,0.00022396598069462925,0.00022671300393994898,0.00022683753923047334,0.0002236358996015042,0.00021715446200687438,0.00020812315051443875,0.00019768142374232411,0.0001871651184046641,0.00017776012828107923,0.00017018670041579753,0.0001647474564379081,0.00016159673396032304,0.00016074298764578998,0.00016192957991734147,0.00016464244981762022,0.00016820426390040666,0.00017222552560269833,0.00017694827693048865,0.00018291892774868757,0.00019057170720770955,0.00020028384460601956,0.00021256753825582564,0.0002280685876030475,0.00024714128812775016,0.0002692264970391989,0.0002927796449512243,0.00031621375819668174,0.00033844844438135624,0.0003586134116631001,0.0003761299594771117,0.0003912363899871707,0.00040489796083420515,0.00041786819929257035,0.00043008269858546555,0.00044095871271565557,0.0004499879141803831,0.00045681619667448103,0.0004612723714672029,0.00046365754678845406,0.00046492513502016664,0.00046621845103800297,0.000468368292786181,0.00047170589095912874,0.00047598956734873354,0.0004806122451554984,0.000484917254652828,0.0004885418456979096,0.000491446815431118,0.0004938999773003161,0.0004965875414200127,0.0005006027640774846,0.0005069989711046219,0.0005162154557183385,0.0005280758487060666,0.000542301160749048,0.0005585356848314404,0.0005759132327511907,0.0005932699423283339,0.0006096560973674059,0.0006242063245736063,0.0006358423852361739,0.0006440128781832755,0.0006494373665191233,0.0006535823340527713,0.0006575832376256585,0.0006617357139475644,0.0006658304482698441,0.0006695619667880237,0.0006724625127390027,0.0006738882511854172,0.0006734512280672789,0.000671342306304723,0.0006682960083708167,0.000665358267724514,0.0006635371828451753,0.0006633767625316978,0.0006648866110481322,0.0006677609635517001,0.0006715531926602125,0.0006760292453691363,0.0006814977969042957,0.0006889597279950976,0.0006998059106990695,0.0007150045712478459,0.0007345240446738899,0.0007576218922622502,0.0007834742427803576,0.0008111393544822931,0.0008392333402298391,0.0008663677726872265,0.0008918646490201354,0.0009156672167591751,0.0009377905516885221,0.0009582043276168406,0.0009772039484232664,0.0009954016422852874,0.0010131972376257181,0.0010305359028279781,0.001047148136422038,0.001062611467204988,0.001076067565008998,0.0010864341165870428,0.0010930984281003475,0.001096129883080721,0.0010961075313389301,0.0010939989006146789,0.001091054524295032,0.0010885720839723945,0.001087496755644679,0.0010881510097533464,0.00109024066478014,0.0010932195000350475,0.0010967456037178636,0.0011011306196451187,0.00110742321703583,0.0011166301555931568,0.0011288821697235107,0.0011437282664701343,0.001160662155598402,0.001178865903057158,0.001197073608636856,0.0012142740888521075,0.0012303738621994853,0.0012457921402528882,0.0012608373071998358,0.0012757806107401848,0.001291246386244893,0.001307762460783124,0.0013249462936073542,0.0013416929868981242,0.0013569790171459317,0.0013702093856409192,0.0013810943346470594,0.0013895202428102493,0.001395455445162952,0.0013990189181640744,0.0014006909914314747,0.0014015438500791788,0.0014030351303517818,0.0014065022114664316,0.0014127511531114578,0.0014220456359907985,0.0014342513168230653,0.0014487366424873471,0.0014645966002717614,0.001481314073316753,0.0014990890631452203,0.001518341596238315,0.0015393926296383142,0.0015626768581569195,0.0015885396860539913,0.0016165822744369507,0.001645691692829132,0.0016747938934713602,0.0017033230978995562,0.0017310816328972578,0.0017579643754288554,0.0017840629443526268,0.001809684676118195,0.001834927243180573,0.0018591636326164007,0.0018811740446835756,0.001899771741591394,0.001914217253215611,0.001924308598972857,0.0019303028238937259,0.001932876300998032,0.0019330601207911968,0.001931958133354783,0.0019304509041830897,0.001929222489707172,0.0019289045594632626,0.0019300549756735563,0.0019330154173076153,0.0019377190619707108,0.0019435525173321366,0.0019497530302032828,0.0019561839289963245,0.0019633781630545855,0.0019719142001122236,0.0019822227768599987,0.0019949590787291527,0.002011055825278163,0.0020310822874307632,0.0020546719897538424,0.0020806752145290375,0.002107777167111635,0.002134830690920353,0.0021609384566545486,0.002185806166380644,0.0022098433692008257,0.0022335180547088385,0.0022567203268408775,0.0022787852212786674,0.002298906212672591,0.002316482365131378,0.002331253606826067,0.0023433472961187363,0.002353338524699211,0.0023621765431016684,0.0023708753287792206,0.0023802437353879213,0.0023907842114567757,0.0024025256279855967,0.002415102208033204,0.0024281309451907873,0.002441351767629385,0.0024545728228986263,0.0024678437039256096,0.0024816750083118677,0.00249674660153687,0.0025135225150734186,0.00253238040022552,0.0025539251510053873,0.0025787781924009323,0.0026069097220897675,0.002637446392327547,0.002669186796993017,0.0027009141631424427,0.0027312678284943104,0.0027588889934122562,0.002782986266538501,0.0028037552256137133,0.002822117879986763,0.002839004620909691,0.0028547283727675676,0.002868963172659278,0.0028811758384108543,0.002890913048759103,0.0028978483751416206,0.0029019094072282314,0.0029034975450485945,0.0029034619219601154,0.0029028113931417465,0.0029023694805800915,0.0029025182593613863,0.002903209300711751,0.002904212335124612,0.002905232133343816,0.002906188601627946,0.0029076680075377226,0.002910904586315155,0.00291723245754838,0.002927539637312293,0.0029420978389680386,0.0029607287142425776,0.002983085811138153,0.0030086529441177845,0.0030365600250661373,0.003065662458539009,0.0030948123894631863,0.003123010043054819,0.00314952596090734,0.0031740821432322264,0.0031970515847206116,0.003219234524294734,0.0032412102445960045,0.003263076301664114,0.003284754930064082,0.0033060291316360235,0.0033261266071349382,0.0033437840174883604,0.003357988316565752,0.0033685294911265373,0.00337600102648139,0.003381483256816864,0.003386072115972638,0.003390619298443198,0.003395669860765338,0.003401396330446005,0.003407577518373728,0.0034138725604861975,0.003420330351218581,0.003427647054195404,0.0034369351342320442,0.003449088428169489,0.0034643420949578285,0.003482382744550705,0.0035025724209845066,0.003523910650983453,0.003545130603015423,0.003565173363313079,0.0035836028400808573,0.0036004555877298117,0.0036158531438559294,0.0036299575585871935,0.0036431620828807354,0.0036560031585395336,0.0036686472594738007,0.0036807102151215076,0.003691611345857382,0.0037008009385317564,0.0037076917942613363,0.00371164851821959,0.0037121472414582968,0.003709007753059268,0.003702627494931221,0.0036940535064786673,0.003684819210320711,0.0036765974946320057,0.003670672420412302,0.0036674446891993284,0.0036665431689471006,0.0036673755384981632,0.00366962025873363,0.0036734165623784065,0.0036791760940104723,0.003687308169901371,0.0036981122102588415,0.003711794735863805,0.003728322684764862,0.0037471626419574022,0.003767255926504731,0.003787467023357749,0.003807220607995987,0.0038266147021204233,0.0038459314964711666,0.0038653903175145388,0.00388528686016798,0.0039057384710758924,0.00392610440030694,0.003945058211684227,0.003961408510804176,0.003974513150751591,0.0039839958772063255,0.003989535849541426,0.003991079982370138,0.003989072050899267,0.0039843302220106125,0.003977780696004629,0.003970392048358917,0.003963164519518614,0.003956916742026806,0.00395206268876791,0.003948564175516367,0.003945903852581978,0.003943237476050854,0.003939978778362274,0.0039362190291285515,0.00393253518268466,0.003929594997316599,0.003928074613213539,0.003928651101887226,0.003931649029254913,0.003936653956770897,0.003942777402698994,0.0039492337964475155,0.003955435939133167,0.0039609079249203205,0.0039656152948737144,0.003970105666667223,0.003974737133830786,0.0039789993315935135,0.003981790971010923,0.003982137888669968,0.003979512024670839,0.003973764833062887,0.003965053241699934,0.003953901585191488,0.0039411988109350204,0.003927914425730705,0.003914837259799242,0.003902568481862545,0.003891528118401766,0.003881829557940364,0.0038733112160116434,0.003865643171593547,0.003858463140204549,0.0038515639025717974,0.0038450334686785936,0.0038391563575714827,0.0038341933395713568,0.003830499015748501,0.0038288577925413847,0.0038303746841847897,0.003835671814158559,0.0038442686200141907,0.00385492411442101,0.0038663316518068314,0.003877284936606884,0.0038866752292960882,0.0038938403595238924,0.0038988401647657156,0.0039021559059619904,0.0039041077252477407,0.003904578508809209,0.0039031365886330605,0.0038992653135210276,0.003892433363944292,0.0038822824135422707,0.0038689973298460245,0.003853290807455778,0.00383597519248724,0.003817672375589609,0.0037988056428730488,0.0037795412354171276,0.003759698709473014,0.0037389001809060574,0.003716877894476056,0.0036936476826667786,0.003669576020911336,0.0036454149521887302,0.003622144227847457,0.0036005768924951553,0.00358117138966918,0.003564320970326662,0.003550499677658081,0.0035398597829043865,0.0035318827722221613,0.0035256771370768547,0.0035202952567487955,0.003514570416882634,0.003507257904857397,0.003497802186757326,0.0034867103677242994,0.003474961966276169,0.0034632361494004726,0.003451782977208495,0.003440690925344825,0.003429849399253726,0.003418652107939124,0.003406091593205929,0.0033912979997694492,0.0033739577047526836,0.003354436717927456,0.003333655185997486,0.0033125714398920536,0.003291647182777524,0.0032708148937672377,0.0032497828360646963,0.003228290705010295,0.0032062572427093983,0.003183987457305193,0.003162302076816559,0.0031422681640833616,0.003124627750366926,0.0031095980666577816,0.00309718307107687,0.0030872018542140722,0.0030789824668318033,0.0030714834574609995,0.0030637907329946756,0.0030552821699529886,0.003045476973056793,0.003034024266526103,0.003020899137482047,0.003006468527019024,0.00299129169434309,0.002975817071273923,0.002960254205390811,0.0029445847030729055,0.0029284071642905474,0.00291078956797719,0.0028904916252940893,0.0028664900455623865,0.0028383624739944935,0.0028063305653631687,0.00277116009965539,0.0027340343222022057,0.002696284092962742,0.0026589613407850266,0.0026224676985293627,0.00258653424680233,0.0025506403762847185,0.0025146224070340395,0.0024790093302726746,0.0024446940515190363,0.0024123587645590305,0.0023823343217372894,0.002354821190237999,0.0023298393934965134,0.0023069120943546295,0.00228514289483428,0.002263707807287574,0.0022422587499022484,0.0022209458984434605,0.002200159477069974,0.0021803786512464285,0.002162135438993573,0.002145686186850071,0.002130656037479639,0.002116241492331028,0.0021017007529735565,0.002086429623886943,0.0020697154104709625,0.002050701528787613,0.002028619172051549,0.002003084635362029,0.001974317245185375,0.0019431613618507981,0.0019108527339994907,0.0018785774009302258,0.0018471310613676906,0.001816825708374381,0.001787471817806363,0.0017584586748853326,0.0017290733521804214,0.0016988975694403052,0.0016679144464433193,0.0016364380717277527,0.001605155412107706,0.0015749756712466478,0.0015464933821931481,0.001519602257758379,0.0014937017112970352,0.0014681995380669832,0.001442776178009808,0.0014173254603520036,0.0013919018674641848,0.0013668190222233534,0.0013425786746665835,0.0013193844351917505,0.001296720583923161,0.001273496774956584,0.0012485611950978637,0.0012211226858198643,0.0011907878797501326,0.0011573971714824438,0.0011210188968107104,0.0010820808820426464,0.0010412906995043159,0.0009993752464652061,0.0009569960529915988,0.0009148019598796964,0.0008733347640372813,0.0008328100084327161,0.0007929824059829116,0.0007532934541814029,0.0007132630562409759,0.0006727085565216839,0.0006317032384686172,0.0005905743455514312,0.0005500338738784194,0.0005111919017508626,0.00047529791481792927,0.00044323652400635183,0.0004150386084802449,0.00038992377812974155,0.0003668494173325598,0.0003449697978794575,0.000323780404869467,0.00030317078926600516,0.0002833442995324731,0.00026444013928994536,0.0002461307740304619,0.00022769435599911958,0.000208411060157232,0.00018770065798889846,0.0001649781916057691,0.0001397521555190906,0.00011202793393749744,0.00008237735164584592,0.000051509901823010296,0.000019879847968695685,-0.000012376734048302751,-0.00004535753760137595,-0.00007932166045065969,-0.00011462568363640457,-0.00015162125055212528,-0.00019049526599701494,-0.00023114388750400394,-0.00027323205722495914,-0.0003163165820296854,-0.0003598455514293164,-0.00040307731251232326,-0.00044500926742330194,-0.00048454487114213407,-0.000520983012393117,-0.0005543663282878697,-0.0005852870526723564,-0.0006145696970634162,-0.000643253093585372,-0.0006724584382027388,-0.0007028272375464439,-0.0007341339951381087,-0.0007656102534383535,-0.000796620559412986,-0.0008269912214018404,-0.0008568900520913303,-0.0008866966818459332,-0.0009169975528493524,-0.0009484924958087504,-0.0009817038662731647,-0.0010167304426431656,-0.0010532516753301024,-0.001090738456696272,-0.0011287308298051357,-0.0011670645326375961,-0.0012059606378898025,-0.0012459139106795192,-0.0012873288942500949,-0.0013301062863320112,-0.0013736049877479672,-0.0014169466448947787,-0.0014592770021408796,-0.0014998571714386344,-0.001538099953904748,-0.0015734951011836529,-0.0016056016320362687,-0.001634325017221272,-0.001660094945691526,-0.0016836571739986539,-0.0017057888908311725,-0.0017272457480430603,-0.0017487325239926577,-0.001770643750205636,-0.001792796771042049,-0.001814618008211255,-0.001835616072639823,-0.0018555185524746776,-0.0018741487292572856,-0.001891700318083167,-0.0019092003349214792,-0.0019282957073301077,-0.0019504389492794871,-0.001976307947188616,-0.002005856717005372,-0.0020386227406561375,-0.0020739322062581778,-0.002111082896590233,-0.0021496182307600975,-0.0021894744131714106,-0.002230820944532752,-0.0022738019470125437,-0.002318296581506729,-0.002363682957366109,-0.002408900996670127,-0.0024529416114091873,-0.0024952024687081575,-0.002535390667617321,-0.002573378151282668,-0.0026093514170497656,-0.002643852960318327,-0.0026774092111736536,-0.0027102187741547823,-0.002742275595664978,-0.0027735335752367973,-0.0028037328738719225,-0.002832316095009446,-0.002858799649402499,-0.002883119974285364,-0.002905481029301882,-0.0029261214658617973,-0.0029455123003572226,-0.0029646491166204214,-0.0029848956037312746,-0.003007534658536315,-0.0030334084294736385,-0.0030627010855823755,-0.00309487571939826,-0.0031288075260818005,-0.0031631968449801207,-0.00319712795317173,-0.0032303398475050926,-0.0032630604691803455,-0.0032957002986222506,-0.0033285936806350946,-0.003361791605129838,-0.003395047038793564,-0.003427935764193535,-0.003459817497059703,-0.0034898503217846155,-0.0035174163058400154,-0.00354261277243495,-0.0035661484580487013,-0.003588686464354396,-0.003610376501455903,-0.0036309787537902594,-0.0036501651629805565,-0.0036675718147307634,-0.003682841779664159,-0.003695931052789092,-0.0037073655985295773,-0.0037180641666054726,-0.0037289836909621954,-0.0037409921642392874,-0.0037549783010035753,-0.003771839663386345,-0.0037922014016658068,-0.0038162267301231623,-0.003843707498162985,-0.0038741426542401314,-0.003906697500497103,-0.003940372262150049,-0.003974377643316984,-0.004008332267403603,-0.004042280837893486,-0.004076696932315826,-0.00411225063726306,-0.004149350803345442,-0.004187895450741053,-0.00422733323648572,-0.004266736563295126,-0.004304851870983839,-0.004340426065027714,-0.0043727075681090355,-0.004401630721986294,-0.004427523352205753,-0.004450785927474499,-0.004471799824386835,-0.004490767605602741,-0.004507445730268955,-0.004521338734775782,-0.004532362334430218,-0.004541188012808561,-0.004548875615000725,-0.004556368570774794,-0.004564417526125908,-0.00457373121753335,-0.004584890324622393,-0.004598070867359638,-0.004612990655004978,-0.004629149101674557,-0.004646051675081253,-0.004663368687033653,-0.004681033547967672,-0.004699158016592264,-0.004717892035841942,-0.004737445153295994,-0.004758134484291077,-0.004780242219567299,-0.004803868010640144,-0.00482893455773592,-0.004855112172663212,-0.004881567787379026,-0.004906896501779556,-0.004929597023874521,-0.004948753397911787,-0.004964276682585478,-0.004976639524102211,-0.004986596759408712,-0.004995053168386221,-0.005002835765480995,-0.005010375753045082,-0.0050176531076431274,-0.0050244564190506935,-0.005030677188187838,-0.00503647280856967,-0.0050422740168869495,-0.005048729013651609,-0.005056598223745823,-0.005066488869488239,-0.005078577436506748,-0.0050926199182868,-0.005108239594846964,-0.0051251365803182125,-0.005143153015524149,-0.005162302870303392,-0.005182798486202955,-0.005205004941672087,-0.0052292500622570515,-0.005255528260022402,-0.005283363629132509,-0.005311989691108465,-0.0053406390361487865,-0.005368627142161131,-0.005395170766860247,-0.005419258959591389,-0.00543985515832901,-0.005456304177641869,-0.005468530580401421,-0.005476928781718016,-0.005482227075845003,-0.005485399626195431,-0.005487424321472645,-0.005488874856382608,-0.005489700008183718,-0.00548944529145956,-0.005487666465342045,-0.0054840752854943275,-0.0054785218089818954,-0.005471240263432264,-0.005463140085339546,-0.005455580074340105,-0.0054497732780873775,-0.005446369294077158,-0.00544539513066411,-0.005446491297334433,-0.005449308548122644,-0.005453772377222776,-0.005460047163069248,-0.0054683624766767025,-0.00547885661944747,-0.005491442512720823,-0.005505719687789679,-0.005521019455045462,-0.005536545068025589,-0.005551501642912626,-0.005565136671066284,-0.0055768294259905815,-0.005586287472397089,-0.005593616981059313,-0.0055991471745073795,-0.005603217985481024,-0.005606160964816809,-0.0056083626113832,-0.005610204301774502,-0.005611829459667206,-0.005612993147224188,-0.005613226443529129,-0.0056120953522622585,-0.0056092701852321625,-0.005604584701359272,-0.005598306190222502,-0.005591365043073893,-0.005585209466516972,-0.005581297911703587,-0.005580589175224304,-0.005583349149674177,-0.005589239299297333,-0.005597459618002176,-0.005606966093182564,-0.005616877228021622,-0.0056268637999892235,-0.0056371004320681095,-0.00564783439040184,-0.005659025628119707,-0.005670308601111174,-0.005681127775460482,-0.005690862890332937,-0.005698877386748791,-0.005704572424292564,-0.005707573611289263,-0.005707934033125639,-0.005706115160137415,-0.0057026599533855915,-0.005697803106158972,-0.0056913914158940315,-0.005683119408786297,-0.005672700237482786,-0.005659889429807663,-0.0056446148082613945,-0.005627110600471497,-0.005607778672128916,-0.005587043706327677,-0.005565539468079805,-0.005544351879507303,-0.005524881184101105,-0.0055083464831113815,-0.005495419725775719,-0.0054862299002707005,-0.00548044266179204,-0.005477266851812601,-0.0054756393656134605,-0.005474650301039219,-0.0054738447070121765,-0.0054732575081288815,-0.00547330966219306,-0.0054746149107813835,-0.00547769432887435,-0.005482675042003393,-0.005489124916493893,-0.0054961140267550945,-0.005502511281520128,-0.005507408641278744,-0.005510447081178427,-0.005511774215847254,-0.0055116587318480015,-0.005510181654244661,-0.005507283378392458,-0.005502828396856785,-0.005496462807059288,-0.005487682297825813,-0.005476284306496382,-0.005462696775794029,-0.005447780713438988,-0.005432415753602982,-0.005417332053184509,-0.0054031978361308575,-0.005390638951212168,-0.005380064249038696,-0.005371511913836002,-0.005364703014492989,-0.005359170492738485,-0.00535431457683444,-0.00534951314330101,-0.005344339180737734,-0.005338708870112896,-0.0053328401409089565,-0.0053271520882844925,-0.0053221988491714,-0.005318538751453161,-0.005316460505127907,-0.005315716844052076,-0.005315444897860289,-0.005314319394528866,-0.005310936365276575,-0.005304364021867514,-0.005294450558722019,-0.005281609948724508,-0.005266438238322735,-0.005249522160738707,-0.005231313407421112,-0.005211966577917337,-0.005191378761082888,-0.005169508047401905,-0.0051466189324855804,-0.00512320501729846,-0.005099815782159567,-0.005077098496258259,-0.005055873189121485,-0.005036839749664068,-0.00502011738717556,-0.00500526325777173,-0.004991773050278425,-0.004979421850293875,-0.0049682012759149075,-0.00495820352807641,-0.004949627444148064,-0.004942756146192551,-0.004937857389450073,-0.004935134202241898,-0.004934700671583414,-0.004936504643410444,-0.004940250422805548,-0.0049454024992883205,-0.004951140843331814,-0.004956281278282404,-0.004959479905664921,-0.004959746263921261,-0.004956755321472883,-0.004950713366270065,-0.004942186176776886,-0.004932035692036152,-0.004921156447380781,-0.00491001270711422,-0.004898455459624529,-0.004886015318334103]}},"string_friction":{"n":12,"pos0":[0,0,0,0.009090909090909092,0,0,0.018181818181818184,0,0,0.02727272727272728,0,0,0.03636363636363637,0,0,0.045454545454545456,0,0,0.05454545454545456,0,0,0.06363636363636364,0,0,0.07272727272727274,0,0,0.08181818181818182,0,0,0.09090909090909091,0,0,0.1,0,0],"mass":[0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001,0.0001],"pinned":[1,0,0,0,0,0,0,0,0,0,0,1],"springs":[[0,1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10,11],[10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000],[0.008590909090909092,0.008590909090909092,0.008590909090909093,0.00859090909090909,0.008590909090909087,0.0085909090909091,0.008590909090909087,0.008590909090909093,0.00859090909090908,0.008590909090909093,0.008590909090909093],[0,0,0,0,0,0,0,0,0,0,0]],"bends":[[],[],[],[],[]],"hinges":[[],[],[],[],[],[]],"dashpots":[[],[],[],[]],"friction":[0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571,0.000552620422318571],"hits":[{"t":0,"beads":[3],"velocity":[0.5,0,2],"force":[0,0,0],"duration":0}],"duration":0.03,"sampleRate":48000,"dtGiven":0.000005208333333333333,"method":"verlet","listen":5,"dt":0.000005208333333333333,"energyDrift":0.00009488744177770532,"audio":{"acceleration":[0,0.08458159118890762,0.7017078399658203,2.3552865982055664,5.51114559173584,10.594446182250977,17.99677085876465,28.094764709472656,41.27783203125,57.97736740112305,78.68559265136719,103.95027160644531,134.3339080810547,170.33383178710938,212.27182006835938,260.1749267578125,313.67962646484375,371.9922180175781,433.9312744140625,498.0591735839844,562.88818359375,627.1250610351562,689.903076171875,750.9461669921875,810.618896484375,869.833984375,929.820068359375,991.7819213867188,1056.51611328125,1124.0609130859375,1193.46240234375,1262.719482421875,1328.9376220703125,1388.67529296875,1438.426513671875,1475.1480712890625,1496.7252197265625,1502.2802734375,1492.2523193359375,1468.22509765625,1432.5301513671875,1387.703369140625,1335.90673828125,1278.4407958984375,1215.4561767578125,1145.9305419921875,1067.921875,979.0439453125,877.0639038085938,760.49072265625,629.0283203125,483.7909851074219,327.233642578125,162.8065948486328,-5.592887878417969,-174.256103515625,-340.2475891113281,-501.81109619140625,-658.5077514648438,-811.0576782226562,-960.9241333007812,-1109.736083984375,-1258.6827392578125,-1408.0172119140625,-1556.7794189453125,-1702.8028564453125,-1842.9998779296875,-1973.86572265625,-2092.083984375,-2195.100341796875,-2281.530029296875,-2351.306396484375,-2405.533935546875,-2446.080322265625,-2475.002197265625,-2493.936767578125,-2503.599609375,-2503.503662109375,-2491.961181640625,-2466.3720703125,-2423.73486328125,-2361.271240234375,-2277.033203125,-2170.3623046875,-2042.1021728515625,-1894.519775390625,-1730.957275390625,-1555.29150390625,-1371.3232421875,-1182.2288818359375,-990.1909790039062,-796.2764282226562,-600.576904296875,-402.567138671875,-201.59104919433594,2.637493848800659,209.6322021484375,417.9189758300781,625.0523071289062,827.8540649414062,1022.8134765625,1206.5498046875,1376.2281494140625,1529.8360595703125,1666.2679443359375,1785.216552734375,1886.9178466796875,1971.82421875,2040.29296875,2092.363037109375,2127.6669921875,2145.492431640625,2144.97314453125,2125.35693359375,2086.285400390625,2028.0047607421875,1951.4561767578125,1858.205810546875,1750.2335205078125,1629.6265869140625,1498.2587890625,1357.5360107421875,1208.27490234375,1050.7415771484375,884.8388671875,710.391845703125,527.4617309570312,336.61260986328125,139.07118225097656,-63.258384704589844,-267.9256591796875,-472.1818542480469,-673.2864990234375,-868.8021850585938,-1056.8072509765625,-1235.9786376953125,-1405.527587890625,-1565.0086669921875,-1714.0562744140625,-1852.119140625,-1978.265869140625,-2091.115478515625,-2188.917724609375,-2269.767822265625,-2331.9091796875,-2374.054443359375,-2395.641845703125,-2396.966796875,-2379.142578125,-2343.89794921875,-2293.244873046875,-2229.092529296875,-2152.89013671875,-2065.384765625,-1966.5498046875,-1855.7086181640625,-1731.8319091796875,-1593.952392578125,-1441.6114501953125,-1275.2425537109375,-1096.40966796875,-907.8416748046875,-713.249267578125,-516.9528198242188,-323.3876647949219,-136.57994079589844,40.311954498291016,205.3061981201172,357.7062683105469,497.99652099609375,627.55224609375,748.2252197265625,861.8842163085938,969.9949951171875,1073.3109130859375,1171.720703125,1264.2666015625,1349.3138427734375,1424.826904296875,1488.691162109375,1539.01904296875,1574.3887939453125,1593.984375,1597.6280517578125,1585.7183837890625,1559.1015625,1518.91455078125,1466.4342041015625,1402.962158203125,1329.757568359375,1248.021484375,1158.9193115234375,1063.62353515625,963.3565673828125,859.4159545898438,753.1744384765625,646.0516357421875,539.4664916992188,434.78125,333.2510070800781,235.9890594482422,143.95469665527344,57.96293640136719,-21.289775848388672,-93.19282531738281,-157.19195556640625,-212.7709503173828,-259.44891357421875,-296.79302978515625,-324.4425354003906,-342.13763427734375,-349.7453308105469,-347.2760009765625,-334.88690185546875,-312.8723449707031,-281.64447021484375,-241.71038818359375,-193.65231323242188,-138.1160888671875,-75.8094711303711,-7.509188652038574,65.92729949951172,143.55026245117188,224.31097412109375,307.063232421875,390.57525634765625,473.5527648925781,554.6724853515625,632.6239624023438,706.1558837890625,774.1210327148438,835.5145874023438,889.4995727539062,935.4158325195312,972.7706909179688,1001.2103271484375,1020.4763793945312,1030.350830078125,1030.59765625,1020.9107055664062,1000.8782348632812,969.97412109375,927.5827026367188,873.058349609375,805.8155517578125,725.4390869140625,631.798583984375,525.1499633789062,406.2054443359375,276.1559143066406,136.63694763183594,-10.363954544067383,-162.64967346191406,-317.98651123046875,-474.2819519042969,-629.73779296875,-782.9527587890625,-932.95556640625,-1079.162109375,-1221.2628173828125,-1359.0582275390625,-1492.2716064453125,-1620.3721923828125,-1742.442138671875,-1857.11328125,-1962.5902099609375,-2056.759521484375,-2137.36767578125,-2202.244873046875,-2249.5341796875,-2277.89453125,-2286.642822265625,-2275.81201171875,-2246.118896484375,-2198.839111328125,-2135.61767578125,-2058.236572265625,-1968.3861083984375,-1867.470703125,-1756.48095703125,-1635.9483642578125,-1505.9827880859375,-1366.384765625,-1216.812744140625,-1056.981689453125,-886.8650512695312,-706.8718872070312,-517.9713134765625,-321.7412414550781,-120.33059692382812,83.66239166259766,287.37738037109375,487.9149169921875,682.5607299804688,868.9778442382812,1045.3424072265625,1210.405517578125,1363.4749755859375,1504.319580078125,1633.0089111328125,1749.7103271484375,1854.4786376953125,1947.0740966796875,2026.845703125,2092.70458984375,2143.1953125,2176.654541015625,2191.42919921875,2186.117919921875,2159.794921875,2112.178955078125,2043.7237548828125,1955.6075439453125,1849.6300048828125,1728.0296630859375,1593.2552490234375,1447.733154296875,1293.672607421875,1132.9425048828125,967.0382690429688,797.1365356445312,624.2183837890625,449.2301330566406,273.24188232421875,97.5676498413086,-76.18049621582031,-246.11891174316406,-410.19476318359375,-566.343017578125,-712.6627807617188,-847.57275390625,-969.9102172851562,-1078.9500732421875,-1174.3408203125,-1255.971923828125,-1323.802490234375,-1377.6905517578125,-1417.26025390625,-1441.840576171875,-1450.4898681640625,-1442.1099853515625,-1415.6260986328125,-1370.2010498046875,-1305.4365234375,-1221.51904296875,-1119.27880859375,-1000.1446533203125,-866.0051879882812,-719.0010375976562,-561.2904052734375,-394.8338623046875,-221.24139404296875,-41.71429443359375,142.90553283691406,331.9857482910156,524.8828735351562,720.6961669921875,918.048828125,1114.9468994140625,1308.7501220703125,1496.2689208984375,1673.97607421875,1838.302001953125,1985.964111328125,2114.276123046875,2221.3857421875,2306.399658203125,2369.375732421875,2411.18115234375,2433.245849609375,2437.249267578125,2424.80126953125,2397.165771484375,2355.075439453125,2298.66259765625,2227.51416015625,2140.833740234375,2037.6810302734375,1917.2403564453125,1779.074951171875,1623.3201904296875,1450.786376953125,1262.959716796875,1061.9044189453125,850.0928955078125,630.19482421875,404.8653564453125,176.5664825439453,-52.55208206176758,-280.69805908203125,-506.4078063964844,-728.4574584960938,-945.7379150390625,-1157.1241455078125,-1361.3685302734375,-1557.0389404296875,-1742.5126953125,-1916.0247802734375,-2075.75439453125,-2219.93408203125,-2346.95361328125,-2455.441650390625,-2544.30419921875,-2612.71435546875,-2660.05419921875,-2685.822509765625,-2689.537353515625,-2670.661376953125,-2628.572021484375,-2562.5986328125,-2472.118408203125,-2356.698486328125,-2216.26318359375,-2051.25390625,-1862.7613525390625,-1652.60302734375,-1423.3299560546875,-1178.1488037109375,-920.7621459960938,-655.1387329101562,-385.2454528808594,-114.78094482421875,153.04824829101562,415.6757507324219,671.2318115234375,918.5078125,1156.8411865234375,1385.9404296875,1605.6737060546875,1815.847900390625,2016.0081787109375,2205.28759765625,2382.334228515625,2545.330322265625,2692.097900390625,2820.27392578125,2927.52197265625,3011.745361328125,3071.269775390625,3104.97607421875,3112.364501953125,3093.5458984375,3049.1591796875,2980.230712890625,2887.993408203125,2773.703125,2638.489990234375,2483.2744140625,2308.764404296875,2115.53857421875,1904.190185546875,1675.5072021484375,1430.6497802734375,1171.287353515625,899.664794921875,618.574951171875,331.2320251464844,41.06227493286133,-248.5530242919922,-534.5311889648438,-814.2869873046875,-1085.8365478515625,-1347.7855224609375,-1599.2083740234375,-1839.443115234375,-2067.84375,-2283.539794921875,-2485.251953125,-2671.213134765625,-2839.218994140625,-2986.81298828125,-3111.576904296875,-3211.4619140625,-3285.082275390625,-3331.894775390625,-3352.216064453125,-3347.06884765625,-3317.89599609375,-3266.20458984375,-3193.22607421875,-3099.6669921875,-2985.6083984375,-2850.585693359375,-2693.848876953125,-2514.761962890625,-2313.269775390625,-2090.33056640625,-1848.205810546875,-1590.515380859375,-1322.0186767578125,-1048.13623046875,-774.294921875,-505.22442626953125,-244.34666442871094,6.610654830932617,247.68959045410156,480.4364318847656,707.3314208984375,931.0112915039062,1153.428955078125,1375.119384765625,1594.7265625,1808.90576171875,2012.6370849609375,2199.90576171875,2364.623291015625,2501.613037109375,2607.47412109375,2681.14990234375,2724.09619140625,2740.0078125,2734.145263671875,2712.383544921875,2680.153076171875,2641.472900390625,2598.262451171875,2550.065185546875,2494.237548828125,2426.557373046875,2342.130126953125,2236.404541015625,2106.10888671875,1949.9337158203125,1768.8477783203125,1566.01318359375,1346.3321533203125,1115.7303466796875,880.3218994140625,645.617919921875,415.9218444824219,194.01275634765625,-18.848957061767578,-222.62791442871094,-418.02490234375,-605.9190063476562,-786.8694458007812,-960.7784423828125,-1126.7723388671875,-1283.3017578125,-1428.416748046875,-1560.1346435546875,-1676.807861328125,-1777.4034423828125,-1861.6312255859375,-1929.9013671875,-1983.1300048828125,-2022.45068359375,-2048.911376953125,-2063.231201171875,-2065.679931640625,-2056.0986328125,-2034.0577392578125,-1999.1016845703125,-1951.0228271484375,-1890.0953369140625,-1817.214111328125,-1733.9046630859375,-1642.2008056640625,-1544.41650390625,-1442.8624267578125,-1339.571044921875,-1236.0875244140625,-1133.3719482421875,-1031.8250732421875,-931.4278564453125,-831.953369140625,-733.203125,-635.2142944335938,-538.3961181640625,-443.5735168457031,-351.9348449707031,-264.9035949707031,-183.96603393554688,-110.4942855834961,-45.60029602050781,9.954440116882324,55.78428268432617,91.84662628173828,118.36930084228516,135.76194763183594,144.53355407714844,145.23158264160156,138.40887451171875,124.61595153808594,104.41022491455078,78.3716049194336,47.11528396606445,11.296841621398926,-28.38973617553711,-71.21605682373047,-116.41815948486328,-163.18478393554688,-210.634521484375,-257.7885437011719,-303.5513916015625,-346.7154541015625,-386.0019836425781,-420.1440124511719,-448.0044250488281,-468.70989990234375,-481.7721862792969,-487.16375732421875,-485.32025146484375,-477.0546569824219,-463.3871154785156,-445.3149108886719,-423.5649108886719,-398.3807373046875,-369.3951416015625,-335.6257019042969,-295.60845947265625,-247.65646362304688,-190.202880859375,-122.16574096679688,-43.263336181640625,45.78705978393555,143.23477172851562,246.44216918945312,352.1927795410156,457.1080017089844,558.0958251953125,652.7473754882812,739.6063232421875,818.2607421875,889.2431030273438,953.7598266601562,1013.3067626953125,1069.246826171875,1122.4326171875,1172.9482421875,1220.015869140625,1262.0799560546875,1297.047119140625,1322.6246337890625,1336.6864013671875,1337.5938720703125,1324.4134521484375,1296.995361328125,1255.9168701171875,1202.3099365234375,1137.6253662109375,1063.383544921875,980.9661254882812,891.483642578125,795.7362670898438,694.2598266601562,587.4310913085938,475.5947570800781,359.17401123046875,238.73733520507812,115.00910186767578,-11.168974876403809,-138.90509033203125,-267.32525634765625,-395.6156921386719,-523.0221557617188,-648.8031616210938,-772.1494140625,-892.0933837890625,-1007.4401245117188,-1116.747802734375,-1218.3753662109375,-1310.597412109375,-1391.7667236328125,-1460.491455078125,-1515.78515625,-1557.155517578125,-1584.6068115234375,-1598.55615234375,-1599.677978515625,-1588.710205078125,-1566.2642822265625,-1532.67822265625,-1487.947509765625,-1431.7506103515625,-1363.567138671875,-1282.86279296875,-1189.302490234375,-1082.94140625,-964.3509521484375,-834.649169921875,-695.4315795898438,-548.6187744140625,-396.2578430175781,-240.32144165039062,-82.54618835449219,75.65912628173828,233.2230987548828,389.3452453613281,543.3764038085938,694.680908203125,842.5177001953125,985.9737548828125,1123.966552734375,1255.314697265625,1378.85400390625,1493.5654296875,1598.674560546875,1693.6923828125,1778.3834228515625,1852.6673583984375,1916.478759765625,1969.6217041015625,2011.65771484375,2041.8590087890625,2059.244873046875,2062.69873046875,2051.14697265625,2023.763427734375,1980.15478515625,1920.482666015625,1845.49462890625,1756.4498291015625,1654.9534912109375,1542.7364501953125,1421.42578125,1292.35986328125,1156.4901123046875,1014.3900756835938,866.3699951171875,712.66845703125,553.6740112304688,390.12200927734375,223.21514892578125,54.63466262817383,-113.56818389892578,-279.18231201171875,-440.1067199707031,-594.6236572265625,-741.614990234375,-880.6730346679688,-1012.076171875,-1136.629638671875,-1255.39794921875,-1369.3795166015625,-1479.1893310546875,-1584.8125,-1685.4801025390625,-1779.6942138671875,-1865.399658203125,-1940.267822265625,-2002.04150390625,-2048.87255859375,-2079.593994140625,-2093.8779296875,-2092.25341796875,-2075.992919921875,-2046.887451171875,-2006.962890625,-1958.1890869140625,-1902.234130859375,-1840.3052978515625,-1773.0970458984375,-1700.84375,-1623.456787109375,-1540.708251953125,-1452.4210205078125,-1358.6231689453125,-1259.64208984375,-1156.1219482421875,-1048.9713134765625,-939.25634765625,-828.0699462890625,-716.4041748046875,-605.0537109375,-494.5662841796875,-385.2460021972656,-277.20294189453125,-170.433837890625,-64.91460418701172,39.31584548950195,142.09603881835938,243.1160888671875,341.9270324707031,437.979736328125,530.68212890625,619.4617919921875,703.8211669921875,783.3761596679688,857.8743896484375,927.1932983398438,991.3228149414062,1050.3387451171875,1104.3734130859375,1153.5888671875,1198.15673828125,1238.24560546875,1274.01806640625,1305.6328125,1333.2528076171875,1357.051513671875,1377.21826171875,1393.956787109375,1407.4788818359375,1417.9930419921875,1425.6915283203125,1430.736083984375,1433.24609375,1433.2872314453125,1430.8653564453125,1425.9234619140625,1418.3458251953125,1407.97265625,1394.623779296875,1378.13330078125,1358.38916015625,1335.3719482421875,1309.18359375,1280.0599365234375,1248.3607177734375,1214.535888671875,1179.0712890625,1142.4200439453125,1104.928955078125,1066.771240234375,1027.898681640625,988.0218505859375,946.62939453125,903.043701171875,856.5112915039062,806.3133544921875,751.87939453125,692.8843994140625,629.312255859375,561.4727783203125,489.9707946777344,415.63006591796875,339.386474609375,262.16705322265625,184.77627563476562,107.80909729003906,31.608137130737305,-43.725807189941406,-118.26968383789062,-192.1717529296875,-265.523681640625,-338.2384948730469,-409.9618835449219,-480.0384826660156,-547.5442504882812,-611.3822631835938,-670.4257202148438,-723.6820678710938,-770.4443969726562,-810.39892578125,-843.6598510742188,-870.7188720703125,-892.3110961914062,-909.2185668945312,-922.0477905273438,-931.028076171875,-935.8754272460938,-935.7591552734375,-929.3875122070312,-915.2075805664062,-891.6912231445312,-857.658447265625,-812.578857421875,-756.7894287109375,-691.5770874023438,-619.096435546875,-542.1227416992188,-463.67413330078125,-386.56451416015625,-312.9677429199219,-244.0736541748047,-179.9037628173828,-119.32501983642578,-60.26659393310547,-0.1081065908074379,63.82234191894531,133.72286987304688,210.85543823242188,295.22894287109375,385.4875793457031,479.0281677246094,572.3282470703125,661.4264526367188,742.467041015625,812.2118530273438,868.4306640625,910.1104125976562,937.4580078125,951.7125244140625,954.8118286132812,948.9834594726562,936.3349609375,918.51611328125,896.5068969726562,870.5595703125,840.2907104492188,804.8900756835938,763.3931884765625,714.9541625976562,659.0631713867188,595.6717529296875,525.212646484375,448.52642822265625,366.7254333496094,281.0352478027344,192.652587890625,102.64996337890625,11.941854476928711,-78.69000244140625,-168.530517578125,-256.8526916503906,-342.856689453125,-425.6501770019531,-504.279541015625,-577.805419921875,-645.401611328125,-706.4486694335938,-760.5943603515625,-807.7601928710938,-848.0888061523438,-881.8404541015625,-909.2613525390625,-930.4548950195312,-945.2865600585938,-953.34912109375,-954.0001831054688,-946.4683837890625,-930.007568359375,-904.067138671875,-868.44091796875,-823.3611450195312,-769.516845703125,-707.9906616210938,-640.1276245117188,-567.3626708984375,-491.04339599609375,-412.28350830078125,-331.87725830078125,-250.28981018066406,-167.72225952148438,-84.2336196899414,0.10993283241987228,85.09294891357422,170.2461395263672,254.79991149902344,337.70220947265625,417.692626953125,493.41424560546875,563.5387573242188,626.8800048828125,682.4778442382812,729.6406860351562,767.9469604492188,797.2127075195312,817.4402465820312,828.7610473632812,831.3870849609375,825.5751342773438,811.6046752929688,789.7627563476562,760.3304443359375,723.5648193359375,679.678466796875,628.8228149414062,571.0870361328125,506.5225830078125,435.2005920410156,357.2988586425781,273.20574951171875,183.61790466308594,89.60411834716797,-7.390749931335449,-105.61917877197266,-203.18312072753906,-298.24786376953125,-389.28216552734375,-475.2768859863281,-555.8902587890625,-631.4759521484375,-702.969970703125,-771.639404296875,-838.7294921875,-905.0701904296875,-970.7244873046875,-1034.7562255859375,-1095.181640625,-1149.1341552734375,-1193.2286376953125,-1224.072998046875,-1238.83837890625,-1235.781982421875,-1214.6202392578125,-1176.6697998046875,-1124.71435546875,-1062.6043701171875,-994.6520385742188,-924.9241943359375,-856.5654907226562,-791.2815551757812,-729.0859375,-668.3640747070312,-606.2466430664062,-539.2232666015625,-463.88287353515625,-377.6423034667969,-279.32867431640625,-169.5093536376953,-50.51005172729492,73.8790283203125,198.95155334472656,319.7819519042969,431.9379577636719,532.0751342773438,618.306884765625,690.2919921875,749.0394897460938,796.4874877929688,834.9527587890625,866.56787109375,892.8165283203125,914.252685546875,930.44775390625,940.1620483398438,941.6915283203125,933.3051147460938,913.6722412109375,882.1838989257812,839.0999755859375,785.4971313476562,723.0371704101562,653.61767578125,578.9891357421875,500.42724609375,418.5333251953125,333.2059326171875,243.7904815673828,149.37484741210938,49.168392181396484,-57.11809158325195,-168.97691345214844,-284.962646484375,-402.7447204589844,-519.3516845703125,-631.5638427734375,-736.3793334960938,-831.4627685546875,-915.4898681640625,-988.3181762695312,-1050.94970703125,-1105.2855224609375,-1153.710205078125,-1198.5794677734375,-1241.6995849609375,-1283.89501953125,-1324.75,-1362.573486328125,-1394.601806640625,-1417.406982421875,-1427.439697265625,-1421.6173095703125,-1397.8560791015625,-1355.46142578125,-1295.3118896484375,-1219.8055419921875,-1132.5751953125,-1038.016357421875,-940.7022705078125,-844.7811279296875,-753.45361328125,-668.61474609375,-590.7153930664062,-518.857421875,-451.0971374511719,-384.8988952636719,-317.6562805175781,-247.19500732421875,-172.17701721191406,-92.34640502929688,-8.585674285888672,77.2161865234375,162.45114135742188,244.1772918701172,319.531005859375,386.09521484375,442.1665344238281,486.8870544433594,520.2335205078125,542.8820190429688,555.9865112304688,560.9193115234375,559.0248413085938,551.4275512695312,538.9226684570312,521.9581298828125,500.6976623535156,475.13946533203125,445.25592041015625,411.1211242675781,372.99908447265625,331.37921142578125,286.9591369628906,240.587890625,193.1884307861328,145.68199157714844,98.9316635131836,53.71575927734375,10.732304573059082,-29.37313461303711,-65.96951293945312,-98.40748596191406,-126.00436401367188,-148.0534210205078,-163.8568115234375,-172.7743682861328,-174.2764434814453,-167.98765563964844,-153.711669921875,-131.43228149414062,-101.29267120361328,-63.56061935424805,-18.59113311767578,33.20237731933594,91.36064910888672,155.37326049804688,224.6604766845703,298.55218505859375,376.2754821777344,456.96026611328125,539.667724609375,623.4389038085938,707.354736328125,790.594970703125,872.4798583984375,952.4819946289062,1030.2010498046875,1105.3006591796875,1177.419921875,1246.0755615234375,1310.578125,1369.9854736328125,1423.1046142578125,1468.5489501953125,1504.839111328125,1530.532958984375,1544.3568115234375,1545.317138671875,1532.772216796875,1506.455078125,1466.4449462890625,1413.1011962890625,1346.9744873046875,1268.715576171875,1179.0028076171875,1078.4970703125,967.827880859375,847.605224609375,718.4412841796875,580.9707641601562,435.85919189453125,283.79559326171875,125.47689819335938,-38.403961181640625,-207.15106201171875,-380.0266418457031,-556.1761474609375,-734.5244140625,-913.6635131835938,-1091.763427734375,-1266.5386962890625,-1435.300537109375,-1595.1077880859375,-1743.0076904296875,-1876.3360595703125,-1993.025634765625,-2091.862060546875,-2172.628662109375,-2236.096923828125,-2283.84423828125,-2317.915283203125,-2340.374755859375,-2352.8330078125,-2356.03125,-2349.5791015625,-2331.90576171875,-2300.449462890625,-2252.06103515625,-2183.5576171875,-2092.325927734375,-1976.8677978515625,-1837.1861572265625,-1674.938232421875,-1493.322265625,-1296.713134765625,-1090.1053466796875,-878.4630126953125,-666.0944213867188,-456.1645812988281,-250.43365478515625,-49.26144027709961,148.13563537597656,343.23779296875,537.681884765625,732.7344360351562,928.8738403320312,1125.5484619140625,1321.1412353515625,1513.1295166015625,1698.3968505859375,1873.6243896484375,2035.681884765625,2181.9423828125,2310.46630859375,2420.035888671875,2510.052490234375,2580.345458984375,2630.947265625,2661.898193359375,2673.117919921875,2664.367431640625,2635.29443359375,2585.54150390625,2514.88134765625,2423.346435546875,2311.32080078125,2179.57763671875,2029.2613525390625,1861.8228759765625,1678.933837890625,1482.4039306640625,1274.120361328125,1056.0174560546875,830.0691528320312,598.2897338867188,362.7242126464844,125.41522979736328,-111.6565933227539,-346.6499328613281,-577.939697265625,-804.1702270507812,-1024.26171875,-1237.355224609375,-1442.6949462890625,-1639.4644775390625,-1826.611572265625,-2002.7069091796875,-2165.88330078125,-2313.884765625,-2444.234375,-2554.49755859375,-2642.5908203125,-2707.075927734375,-2747.375244140625,-2763.855712890625,-2757.75830078125,-2730.9736328125,-2685.700439453125,-2624.046875,-2547.651123046875,-2457.4052734375,-2353.34130859375,-2234.716064453125,-2100.279541015625,-1948.678955078125,-1778.9072265625,-1590.706787109375,-1384.83740234375,-1163.1556396484375,-928.487548828125,-684.3243408203125,-434.40118408203125,-182.24664306640625,69.20710754394531,317.873779296875,562.5725708007812,802.8875732421875,1038.8612060546875,1270.59130859375,1497.8233642578125,1719.630859375,1934.2532958984375,2139.127197265625,2331.1025390625,2506.796630859375,2663.0146484375,2797.14697265625,2907.472900390625,2993.31396484375,3055.01513671875,3093.772705078125,3111.349365234375,3109.74462890625,3090.889404296875,3056.420166015625,3007.568359375,2945.169921875,2869.76953125,2781.77978515625,2681.642822265625,2569.951904296875,2447.502197265625,2315.26513671875,2174.30322265625,2025.6549072265625,1870.229736328125,1708.7508544921875,1541.764404296875,1369.7218017578125,1193.11474609375,1012.6322021484375,829.2975463867188,644.5479736328125,460.23028564453125,278.5047912597656,101.67220306396484,-68.04639434814453,-228.7318572998047,-378.9475402832031,-517.8417358398438,-645.1527709960938,-761.1185913085938,-866.312255859375,-961.4390258789062,-1047.136962890625,-1123.8182373046875,-1191.578369140625,-1250.185302734375,-1299.14208984375,-1337.805908203125,-1365.534423828125,-1381.83056640625,-1386.4583740234375,-1379.5133056640625,-1361.4407958984375,-1333.0084228515625,-1295.24658203125,-1249.3707275390625,-1196.7044677734375,-1138.6114501953125,-1076.4398193359375,-1011.4803466796875,-944.9329223632812,-877.8799438476562,-811.264892578125,-745.8798217773438,-682.3651123046875,-621.2265625,-562.87158203125,-507.6598815917969,-455.9607849121094,-408.2019348144531,-364.89520263671875,-326.6261291503906,-294.001708984375,-267.5604248046875,-247.66000366210938,-234.36659240722656,-227.37332153320312,-225.9743194580078,-229.11082458496094,-235.4923095703125,-243.77752685546875,-252.7852020263672,-261.6925964355469,-270.17803955078125,-278.4709777832031,-287.29010009765625,-297.67242431640625,-310.7203674316406,-327.3138427734375,-347.8445129394531,-372.02880859375,-398.842529296875,-426.5963134765625,-453.1421813964844,-476.1730041503906,-493.55633544921875,-503.6348876953125,-505.4327697753906,-498.7267761230469,-483.9707336425781,-462.0936279296875,-434.21832275390625,-401.365234375,-364.2076110839844,-322.9325256347656,-277.23931884765625,-226.47425842285156,-169.86997985839844,-106.83255767822266,-37.20649719238281,38.548057556152344,119.3123550415039,203.4156036376953,288.8712158203125,373.69183349609375,456.2129821777344,535.3511962890625,610.7357177734375,682.6783447265625,751.982666015625,819.6272583007812,886.3894653320312,952.4910888671875,1017.346923828125,1079.4776611328125,1136.61474609375,1185.9853515625,1224.724365234375,1250.337890625,1261.126953125,1256.4908447265625,1237.04833984375,1204.5523681640625,1161.6053466796875,1111.2249755859375,1056.335205078125,999.2731323242188,941.4049682617188,882.9190673828125,822.8359375,759.22900390625,689.6134643554688,611.42919921875,522.532470703125,421.61328125,308.4735107421875,184.12612915039062,50.706336975097656,-88.78511047363281,-230.8603057861328,-371.9802551269531,-508.97674560546875,-639.3930053710938,-761.693115234375,-875.3143310546875,-980.5645141601562,-1078.391845703125,-1170.069580078125,-1256.8504638671875,-1339.6427001953125,-1418.756103515625,-1493.7564697265625,-1563.4462890625,-1625.9774169921875,-1679.07177734375],"velocity":[0,4.412555369981419e-7,0.000007344274308707099,0.00003710903547471389,0.00011624690523603931,0.00028054782887920737,0.000574288540519774,0.0010497089242562652,0.0017669794615358114,0.0027947768103331327,0.00421138433739543,0.006105952430516481,0.008579296991229057,0.01174343191087246,0.015719098970294,0.020630860701203346,0.02659989334642887,0.03373531997203827,0.042125552892684937,0.051831431686878204,0.06288294494152069,0.07528072595596313,0.08900253474712372,0.1040140762925148,0.12028197944164276,0.13778646290302277,0.15653054416179657,0.17654316127300262,0.1978747546672821,0.2205849587917328,0.2447241097688675,0.2703116834163666,0.29731571674346924,0.3256376385688782,0.35510554909706116,0.38547852635383606,0.4164612889289856,0.4477270245552063,0.47894445061683655,0.509803831577301,0.5400369167327881,0.5694273114204407,0.5978081822395325,0.6250497698783875,0.651037335395813,0.6756471991539001,0.6987238526344299,0.7200661301612854,0.7394234538078308,0.7565057277679443,0.7710037231445312,0.7826164364814758,0.7910804748535156,0.7961947917938232,0.7978358268737793,0.7959601879119873,0.7905946969985962,0.7818153500556946,0.7697210907936096,0.7544074654579163,0.7359464168548584,0.7143765687942505,0.6897063255310059,0.6619284749031067,0.6310428977012634,0.5970821976661682,0.5601345300674438,0.5203575491905212,0.47798094153404236,0.4332965612411499,0.3866375982761383,0.33835238218307495,0.28877806663513184,0.23821987211704254,0.1869412213563919,0.13516610860824585,0.08309333771467209,0.030919086188077927,-0.021137544885277748,-0.07281213253736496,-0.12378093600273132,-0.17365895211696625,-0.22201107442378998,-0.2683744430541992,-0.31228798627853394,-0.3533235192298889,-0.3911118805408478,-0.42536020278930664,-0.4558565020561218,-0.4824623167514801,-0.505095362663269,-0.5237072110176086,-0.5382610559463501,-0.5487148761749268,-0.5550134778022766,-0.5570911765098572,-0.5548837184906006,-0.5483471751213074,-0.5374786853790283,-0.5223344564437866,-0.5030410885810852,-0.4797978699207306,-0.4528692066669464,-0.42257043719291687,-0.389249324798584,-0.353268027305603,-0.3149889409542084,-0.2747667729854584,-0.23294728994369507,-0.18987195193767548,-0.14588552713394165,-0.10134430974721909,-0.05662141367793083,-0.012107270769774914,0.0317956879734993,0.07468360662460327,0.11616497486829758,0.15587463974952698,0.1934848427772522,0.22871069610118866,0.26130908727645874,0.2910713851451874,0.3178121745586395,0.34135711193084717,0.3615332543849945,0.37816429138183594,0.39107218384742737,0.4000851511955261,0.40504980087280273,0.4058455228805542,0.40239736437797546,0.3946850597858429,0.3827459216117859,0.36667174100875854,0.34659987688064575,0.3227016031742096,0.2951698899269104,0.26421019434928894,0.23003599047660828,0.1928698867559433,0.15294970571994781,0.11053737252950668,0.06592769175767899,0.01945396699011326,-0.028511827811598778,-0.0775655135512352,-0.12728331983089447,-0.17723862826824188,-0.22701966762542725,-0.27624475955963135,-0.32457178831100464,-0.37170010805130005,-0.41736456751823425,-0.4613231420516968,-0.5033413171768188,-0.5431768894195557,-0.5805692672729492,-0.6152362823486328,-0.6468802690505981,-0.6752028465270996,-0.6999260187149048,-0.7208167910575867,-0.7377095818519592,-0.7505233883857727,-0.759269118309021,-0.7640466094017029,-0.7650313377380371,-0.7624525427818298,-0.7565674781799316,-0.7476351857185364,-0.7358946800231934,-0.7215508818626404,-0.7047688961029053,-0.6856786608695984,-0.6643866300582886,-0.6409924030303955,-0.6156069040298462,-0.58836829662323,-0.5594537854194641,-0.5290840864181519,-0.4975220859050751,-0.4650655686855316,-0.4320356547832489,-0.3987639248371124,-0.3655793070793152,-0.33279767632484436,-0.3007139265537262,-0.269597589969635,-0.23969116806983948,-0.2112104594707489,-0.18434563279151917,-0.1592622548341751,-0.136101633310318,-0.11498015373945236,-0.09598802030086517,-0.07918756455183029,-0.06461197882890701,-0.052264805883169174,-0.04212050512433052,-0.034126218408346176,-0.02820437029004097,-0.024255799129605293,-0.022162891924381256,-0.0217923354357481,-0.022997263818979263,-0.02561870776116848,-0.029486576095223427,-0.03442037105560303,-0.040230054408311844,-0.04671727493405342,-0.053677164018154144,-0.06090072914958,-0.06817768514156342,-0.07529950141906738,-0.08206236362457275,-0.08826986700296402,-0.0937352105975151,-0.09828297048807144,-0.10175053030252457,-0.10398934781551361,-0.10486636310815811,-0.1042654886841774,-0.10208944976329803,-0.09826178848743439,-0.09272893518209457,-0.08546210080385208,-0.07645884901285172,-0.06574410200119019,-0.05337025970220566,-0.03941649943590164,-0.023987049236893654,-0.00720860343426466,0.010772922076284885,0.029796021059155464,0.049687206745147705,0.07026424258947372,0.09133858233690262,0.11271682381629944,0.13420093059539795,0.15558728575706482,0.1766648292541504,0.19721272587776184,0.2169981747865677,0.2357751429080963,0.2532845437526703,0.26925671100616455,0.28341615200042725,0.29548847675323486,0.30520933866500854,0.31233417987823486,0.31664803624153137,0.3179738521575928,0.31617847084999084,0.31117507815361023,0.3029223382472992,0.2914195656776428,0.2766995131969452,0.25881972908973694,0.2378537356853485,0.213884174823761,0.18699869513511658,0.15728960931301117,0.1248573437333107,0.08981728553771973,0.052308570593595505,0.012503420934081078,-0.029384996742010117,-0.07309769093990326,-0.11832920461893082,-0.16473178565502167,-0.21192406117916107,-0.25950342416763306,-0.30706048011779785,-0.3541937470436096,-0.40052276849746704,-0.4456979036331177,-0.4894055128097534,-0.5313685536384583,-0.5713425278663635,-0.6091079115867615,-0.6444610953330994,-0.6772050261497498,-0.7071415185928345,-0.734066367149353,-0.7577686309814453,-0.7780336737632751,-0.7946506142616272,-0.8074228763580322,-0.8161802887916565,-0.8207917213439941,-0.8211756348609924,-0.8173078894615173,-0.809224545955658,-0.7970205545425415,-0.7808436751365662,-0.7608853578567505,-0.7373689413070679,-0.7105379104614258,-0.680645227432251,-0.6479451060295105,-0.6126890778541565,-0.5751259922981262,-0.5355063080787659,-0.4940897226333618,-0.45115402340888977,-0.4070037305355072,-0.3619762063026428,-0.31644368171691895,-0.270810604095459,-0.2255060374736786,-0.18097178637981415,-0.13764794170856476,-0.09595750272274017,-0.056292224675416946,-0.01900143176317215,0.01561476569622755,0.04730738699436188,0.07587601989507675,0.101162850856781,0.12304509431123734,0.1414276510477066,0.1562376469373703,0.16742202639579773,0.17494848370552063,0.17880941927433014,0.17902767658233643,0.17566260695457458,0.16881482303142548,0.15862809121608734,0.14528776705265045,0.12901571393013,0.11006246507167816,0.08869818598031998,0.06520409137010574,0.03986593708395958,0.012970790266990662,-0.015192655846476555,-0.04433047026395798,-0.0741378590464592,-0.104293093085289,-0.13445298373699188,-0.16425132751464844,-0.19330167770385742,-0.22120444476604462,-0.2475576251745224,-0.2719697952270508,-0.294073224067688,-0.31353506445884705,-0.3300647437572479,-0.3434169292449951,-0.3533894121646881,-0.3598174452781677,-0.3625655174255371,-0.3615192472934723,-0.35657933354377747,-0.34765926003456116,-0.33468836545944214,-0.317619264125824,-0.29643958806991577,-0.2711853086948395,-0.24195340275764465,-0.20891118049621582,-0.17230042815208435,-0.13243484497070312,-0.08969078212976456,-0.044492147862911224,0.0027084394823759794,0.05144978314638138,0.10128065198659897,0.15177421271800995,0.20253655314445496,0.2532085180282593,0.30346131324768066,0.3529870808124542,0.4014870226383209,0.4486593008041382,0.49418899416923523,0.5377427935600281,0.5789685845375061,0.6175008416175842,0.6529706716537476,0.6850189566612244,0.7133105993270874,0.7375476360321045,0.757479727268219,0.7729104161262512,0.7836991548538208,0.7897588014602661,0.7910504341125488,0.7875763177871704,0.7793723940849304,0.7665023803710938,0.7490543127059937,0.7271389961242676,0.7008920311927795,0.6704767942428589,0.6360885500907898,0.5979579091072083,0.5563530325889587,0.5115796327590942,0.4639788269996643,0.4139227569103241,0.3618094325065613,0.30805668234825134,0.2530972957611084,0.1973755955696106,0.14134594798088074,0.08547329157590866,0.030234606936573982,-0.023879524320364,-0.07636484503746033,-0.1267058551311493,-0.17438146471977234,-0.21887414157390594,-0.25968217849731445,-0.29633402824401855,-0.3284037709236145,-0.35552558302879333,-0.3774060308933258,-0.39383187890052795,-0.40467315912246704,-0.40988001227378845,-0.4094749093055725,-0.40354058146476746,-0.3922060430049896,-0.3756321966648102,-0.35399919748306274,-0.32749682664871216,-0.296318918466568,-0.260662317276001,-0.22073036432266235,-0.17673994600772858,-0.12893101572990417,-0.07757668197154999,-0.022991886362433434,0.03446080535650253,0.09436950832605362,0.15627583861351013,0.21968184411525726,0.2840603291988373,0.3488672375679016,0.4135544002056122,0.47758179903030396,0.5404269695281982,0.6015912294387817,0.6606021523475647,0.7170124650001526,0.7703961730003357,0.8203442096710205,0.8664608001708984,0.9083619713783264,0.9456779956817627,0.9780590534210205,1.005184531211853,1.0267750024795532,1.0426028966903687,1.052504301071167,1.0563842058181763,1.0542194843292236,1.0460542440414429,1.0319921970367432,1.012184739112854,0.9868181347846985,0.9561026096343994,0.920264720916748,0.8795440196990967,0.834195613861084,0.7844967246055603,0.7307563424110413,0.6733248829841614,0.6126018166542053,0.5490379929542542,0.48313120007514954,0.4154154360294342,0.3464449942111969,0.27677637338638306,0.2069517970085144,0.1374872326850891,0.06886731088161469,0.0015476566040888429,-0.06403659284114838,-0.12745852768421173,-0.18828696012496948,-0.2460775077342987,-0.30037060379981995,-0.35069870948791504,-0.39660313725471497,-0.43765830993652344,-0.47350016236305237,-0.5038524270057678,-0.5285459160804749,-0.5475254654884338,-0.5608428716659546,-0.5686357021331787,-0.5710955858230591,-0.5684314966201782,-0.5608352422714233,-0.5484554171562195,-0.531386137008667,-0.509672224521637,-0.483331561088562,-0.45239022374153137,-0.41692328453063965,-0.3770939111709595,-0.3331814408302307,-0.2855929732322693,-0.2348545342683792,-0.18158264458179474,-0.1264408975839615,-0.07008866220712662,-0.013130859471857548,0.04392225295305252,0.10067810118198395,0.15686358511447906,0.2123054414987564,0.26689305901527405,0.3205311894416809,0.37309151887893677,0.424373060464859,0.47407811880111694,0.5218090415000916,0.567085325717926,0.6093778610229492,0.6481538414955139,0.6829238533973694,0.7132836580276489,0.7389429807662964,0.7597383260726929,0.7756285667419434,0.7866754531860352,0.7930148839950562,0.7948245406150818,0.7922948598861694,0.7856085896492004,0.7749309539794922,0.7604116797447205,0.7421951293945312,0.7204359173774719,0.6953141093254089,0.667046844959259,0.6358928680419922,0.6021491885185242,0.5661412477493286,0.5282081961631775,0.4886877238750458,0.44790342450141907,0.4061569273471832,0.3637267053127289,0.3208724856376648,0.2778436541557312,0.23488858342170715,0.19226209819316864,0.15022869408130646,0.10906024277210236,0.06902819126844406,0.030391963198781013,-0.006614330690354109,-0.041793953627347946,-0.07499589025974274,-0.10611777752637863,-0.13510289788246155,-0.1619320660829544,-0.18661224842071533,-0.20916444063186646,-0.2296133190393448,-0.24798060953617096,-0.2642832398414612,-0.2785361707210541,-0.29075887799263,-0.30098363757133484,-0.3092639148235321,-0.3156806528568268,-0.32034531235694885,-0.32339948415756226,-0.3250107765197754,-0.3253664970397949,-0.32466578483581543,-0.3231121897697449,-0.32090720534324646,-0.3182455599308014,-0.3153122365474701,-0.31228113174438477,-0.3093147575855255,-0.3065640330314636,-0.30416834354400635,-0.3022553622722626,-0.30094021558761597,-0.3003248870372772,-0.3004972040653229,-0.30153024196624756,-0.3034815192222595,-0.30639219284057617,-0.3102857768535614,-0.31516650319099426,-0.32101699709892273,-0.3277958333492279,-0.3354356586933136,-0.34384235739707947,-0.3528966009616852,-0.36245787143707275,-0.3723713159561157,-0.38247665762901306,-0.3926179111003876,-0.4026523232460022,-0.4124565124511719,-0.42192864418029785,-0.43098509311676025,-0.4395527243614197,-0.4475572109222412,-0.4549100697040558,-0.4614969491958618,-0.46717026829719543,-0.47174787521362305,-0.4750194549560547,-0.4767601191997528,-0.4767492711544037,-0.4747920632362366,-0.47073984146118164,-0.46450549364089966,-0.45607128739356995,-0.4454876780509949,-0.43286293745040894,-0.41834595799446106,-0.40210503339767456,-0.3843069076538086,-0.3650996685028076,-0.3446025252342224,-0.3229043185710907,-0.3000701665878296,-0.2761552631855011,-0.2512218952178955,-0.22535701096057892,-0.19868603348731995,-0.1713806837797165,-0.14365926384925842,-0.11577977985143661,-0.08802724629640579,-0.06069799140095711,-0.03408369421958923,-0.008457877673208714,0.01593325100839138,0.03887481987476349,0.060182470828294754,0.07969794422388077,0.09728288650512695,0.11281270533800125,0.12617212533950806,0.13725319504737854,0.14595580101013184,0.15219007432460785,0.1558796763420105,0.15696465969085693,0.1554032564163208,0.15117216110229492,0.14426574110984802,0.13469460606575012,0.12248487025499344,0.10767863690853119,0.0903363823890686,0.07054103165864944,0.048402998596429825,0.024064937606453896,-0.002295195125043392,-0.030464015901088715,-0.06019620969891548,-0.09122148156166077,-0.12325406819581985,-0.1560031622648239,-0.1891825944185257,-0.22251778841018677,-0.25574928522109985,-0.2886319160461426,-0.3209306299686432,-0.3524138033390045,-0.3828463852405548,-0.41198429465293884,-0.4395720362663269,-0.4653448164463043,-0.48903459310531616,-0.5103797316551208,-0.5291363000869751,-0.5450887084007263,-0.5580583214759827,-0.5679082274436951,-0.5745435953140259,-0.5779086351394653,-0.5779801607131958,-0.574760913848877,-0.5682730078697205,-0.5585532784461975,-0.545651912689209,-0.5296331644058228,-0.510578453540802,-0.48859015107154846,-0.4637942314147949,-0.43634140491485596,-0.40640532970428467,-0.3741784393787384,-0.3398662805557251,-0.30368196964263916,-0.2658415734767914,-0.2265625149011612,-0.1860646903514862,-0.14457446336746216,-0.10233034193515778,-0.05958876386284828,-0.016628259792923927,0.02624950185418129,0.06872273236513138,0.110456682741642,0.1511140614748001,0.19036705791950226,0.22790898382663727,0.2634633183479309,0.29678869247436523,0.3276790380477905,0.355959415435791,0.38147884607315063,0.40410205721855164,0.42370280623435974,0.44016018509864807,0.453359454870224,0.4631973206996918,0.46959054470062256,0.4724860191345215,0.4718697965145111,0.4677726924419403,0.4602709710597992,0.4494810402393341,0.43554916977882385,0.4186375141143799,0.39890947937965393,0.3765168786048889,0.35159143805503845,0.32424288988113403,0.29456377029418945,0.2626399099826813,0.22856532037258148,0.19245775043964386,0.15447233617305756,0.11481044441461563,0.0737217590212822,0.03149925172328949,-0.011532345786690712,-0.055032577365636826,-0.09866316616535187,-0.1421048790216446,-0.18507084250450134,-0.22731442749500275,-0.2686310410499573,-0.308854341506958,-0.34784814715385437,-0.3854960799217224,-0.4216912090778351,-0.456327885389328,-0.48929688334465027,-0.520484447479248,-0.5497749447822571,-0.5770565867424011,-0.6022275686264038,-0.6252024173736572,-0.6459164023399353,-0.6643276214599609,-0.6804160475730896,-0.6941801905632019,-0.7056329250335693,-0.7147956490516663,-0.7216940522193909,-0.7263549566268921,-0.7288045287132263,-0.7290689945220947,-0.7271767854690552,-0.723160982131958,-0.7170628309249878,-0.7089338302612305,-0.6988376975059509,-0.6868502497673035,-0.6730585694313049,-0.6575588583946228,-0.6404541730880737,-0.6218512654304504,-0.601858377456665,-0.580582857131958,-0.5581299662590027,-0.5346018671989441,-0.510097086429596,-0.4847107529640198,-0.45853444933891296,-0.43165647983551025,-0.4041617214679718,-0.37613165378570557,-0.3476439416408539,-0.3187721371650696,-0.2895854711532593,-0.2601487338542938,-0.23052258789539337,-0.20076392590999603,-0.17092671990394592,-0.14106300473213196,-0.11122404038906097,-0.08146164566278458,-0.05182942748069763,-0.022383911535143852,0.006814795080572367,0.035702913999557495,0.06421370804309845,0.09227900952100754,0.11983148008584976,0.14680729806423187,0.17314887046813965,0.19880712032318115,0.22374282777309418,0.24792665243148804,0.27133771777153015,0.29396066069602966,0.31578147411346436,0.33678266406059265,0.35693827271461487,0.37620988488197327,0.39454400539398193,0.41187161207199097,0.4281100332736969,0.44316723942756653,0.4569474160671234,0.46935799717903137,0.4803158938884735,0.4897531569004059,0.49762025475502014,0.5038873553276062,0.5085427761077881,0.511589527130127,0.5130404233932495,0.5129128098487854,0.5112242102622986,0.5079895257949829,0.5032210350036621,0.49693062901496887,0.48913484811782837,0.47986066341400146,0.46915164589881897,0.4570726156234741,0.4437118172645569,0.4291797876358032,0.4136050343513489,0.39712679386138916,0.3798864483833313,0.36201879382133484,0.3436456620693207,0.3248727023601532,0.3057906925678253,0.28648149967193604,0.267027348279953,0.24752213060855865,0.22808212041854858,0.2088535726070404,0.19001539051532745,0.1717752069234848,0.1543588936328888,0.13799461722373962,0.12289362400770187,0.10923103988170624,0.09713011980056763,0.08665305376052856,0.07780057191848755,0.07052077353000641,0.06472626328468323,0.06031690537929535,0.05720430612564087,0.055333975702524185,0.05470101907849312,0.05535653978586197,0.057403191924095154,0.060980334877967834,0.06624092906713486,0.07332389801740646,0.08232654631137848,0.09328170120716095,0.10614337027072906,0.1207832396030426,0.13699832558631897,0.15452821552753448,0.1730785220861435,0.19234660267829895,0.2120453417301178,0.23192133009433746,0.25176525115966797,0.27141356468200684,0.29074233770370483,0.30965524911880493,0.3280687630176544,0.34589773416519165,0.3630441725254059,0.3793911635875702,0.394802451133728,0.40912747383117676,0.42220965027809143,0.4338964819908142,0.4440489113330841,0.4525485038757324,0.4593013525009155,0.46423909068107605,0.46731704473495483,0.4685112237930298,0.46781525015830994,0.46523821353912354,0.4608040750026703,0.45455265045166016,0.446541428565979,0.43684712052345276,0.4255664050579071,0.4128144681453705,0.3987216651439667,0.3834286332130432,0.36708033084869385,0.34982097148895264,0.33179041743278503,0.31312295794487,0.29394909739494324,0.2743995189666748,0.2546105682849884,0.23472967743873596,0.21491917967796326,0.19535747170448303,0.1762368083000183,0.1577574461698532,0.1401195377111435,0.12351354956626892,0.10811135917901993,0.0940592959523201,0.0814744085073471,0.07044453173875809,0.06103162094950676,0.05327770859003067,0.04721174016594887,0.042855892330408096,0.04022984951734543,0.03935224935412407,0.04023900255560875,0.042899008840322495,0.047328297048807144,0.05350382998585701,0.06137832999229431,0.07087705284357071,0.08189708739519119,0.09430915862321854,0.10796152800321579,0.12268523126840591,0.13829971849918365,0.15461821854114532,0.171452134847641,0.18861441314220428,0.20592157542705536,0.22319510579109192,0.24026210606098175,0.2569555938243866,0.27311456203460693,0.28858354687690735,0.30321213603019714,0.3168536424636841,0.3293638825416565,0.34060007333755493,0.35042062401771545,0.35868632793426514,0.3652637302875519,0.3700305223464966,0.37288275361061096,0.3737426698207855,0.37256601452827454,0.3693467378616333,0.3641180992126465,0.3569487929344177,0.3479343056678772,0.337184339761734,0.32480838894844055,0.31090226769447327,0.2955382466316223,0.2787618935108185,0.26059645414352417,0.24105538427829742,0.22016103565692902,0.19796621799468994,0.17457474768161774,0.15015625953674316,0.12495192885398865,0.09926862269639969,0.07346161454916,0.04790771007537842,0.022972967475652695,-0.001019704039208591,-0.02381735108792782,-0.045253150165081024,-0.06524872779846191,-0.08380182832479477,-0.10096139460802078,-0.1167944148182869,-0.13135084509849548,-0.14463311433792114,-0.1565760225057602,-0.16704106330871582,-0.17582616209983826,-0.1826893836259842,-0.18738214671611786,-0.18968629837036133,-0.1894480288028717,-0.18660315871238708,-0.18118897080421448,-0.17334134876728058,-0.1632780283689499,-0.15127155184745789,-0.13761761784553528,-0.12260442972183228,-0.1064886823296547,-0.08948177844285965,-0.07174792140722275,-0.0534130297601223,-0.0345815010368824,-0.015356538817286491,0.0041408357210457325,0.023758266121149063,0.04330688342452049,0.06256528943777084,0.08129148930311203,0.0992397591471672,0.11617856472730637,0.13190537691116333,0.14625535905361176,0.15910229086875916,0.17035193741321564,0.17992977797985077,0.1877664178609848,0.1937842071056366,0.1978885978460312,0.1999666541814804,0.19989363849163055,0.19754670560359955,0.19282327592372894,0.18566034734249115,0.17605069279670715,0.16405229270458221,0.1497887223958969,0.1334398090839386,0.1152239516377449,0.09537491202354431,0.07411729544401169,0.05164489895105362,0.028106100857257843,0.0035990208853036165,-0.02182236686348915,-0.04813207685947418,-0.07530864328145981,-0.10330849140882492,-0.13204115629196167,-0.16135084629058838,-0.19100819528102875,-0.2207137495279312,-0.25011348724365234,-0.27882397174835205,-0.3064635992050171,-0.33268511295318604,-0.35720476508140564,-0.3798232972621918,-0.4004358947277069,-0.41902947425842285,-0.43566834926605225,-0.4504702389240265,-0.46357735991477966,-0.4751269221305847,-0.48522594571113586,-0.49393388628959656,-0.5012558698654175,-0.5071463584899902,-0.5115228295326233,-0.5142857432365417,-0.5153422951698303,-0.5146288275718689,-0.512129008769989,-0.507885217666626,-0.5020007491111755,-0.49463456869125366,-0.4859888255596161,-0.4762924611568451,-0.4657835066318512,-0.4546928107738495,-0.44323182106018066,-0.4315852224826813,-0.4199090301990509,-0.40833330154418945,-0.39696794748306274,-0.3859100341796875,-0.3752503991127014,-0.3650783896446228,-0.35548391938209534,-0.34655654430389404,-0.33838245272636414,-0.3310399651527405,-0.32459503412246704,-0.31909728050231934,-0.3145778477191925,-0.3110485076904297,-0.30850231647491455,-0.3069153130054474,-0.30624812841415405,-0.30644747614860535,-0.30744683742523193,-0.30916640162467957,-0.31151247024536133,-0.3143768310546875,-0.3176366090774536,-0.3211548626422882,-0.3247824013233185,-0.32836055755615234,-0.3317246437072754,-0.3347078561782837,-0.3371447026729584,-0.3388740122318268,-0.3397412598133087,-0.3395998179912567,-0.3383122682571411,-0.3357512354850769,-0.331800639629364,-0.3263574242591858,-0.319333553314209,-0.31065812706947327,-0.3002791106700897,-0.2881644070148468,-0.27430155873298645,-0.25869622826576233,-0.24136988818645477,-0.22235648334026337,-0.20169956982135773,-0.17945024371147156,-0.15566673874855042,-0.1304159015417099,-0.10377666354179382,-0.07584495842456818,-0.046738967299461365,-0.01660390943288803,0.014384973794221878,0.046021778136491776,0.07807210087776184,0.11027777194976807,0.1423635184764862,0.17404459416866302,0.20503437519073486,0.2350509762763977,0.263822078704834,0.2910880744457245,0.31660327315330505,0.34013596177101135,0.36146795749664307,0.3803938031196594,0.39672088623046875,0.41026946902275085,0.42087337374687195,0.4283805787563324,0.4326535165309906,0.433569073677063,0.4310186207294464,0.424908310174942,0.41516080498695374,0.4017186462879181,0.384550005197525,0.36365678906440735,0.339083731174469,0.31092748045921326,0.27934378385543823,0.24455012381076813,0.20682305097579956,0.1664888858795166,0.12390846759080887,0.07945765554904938,0.03350638598203659,-0.013600318692624569,-0.06155581399798393,-0.11009704321622849,-0.1589999794960022,-0.2080656737089157,-0.25709909200668335,-0.3058846592903137,-0.3541632890701294,-0.4016155004501343,-0.44785502552986145,-0.4924341142177582,-0.5348615050315857,-0.5746299028396606,-0.6112490892410278,-0.6442801356315613,-0.6733635067939758,-0.6982384324073792,-0.7187488079071045,-0.734836220741272,-0.7465206980705261,-0.7538736462593079,-0.7569884657859802,-0.7559535503387451,-0.750832736492157,-0.7416567206382751,-0.7284249663352966,-0.7111182808876038,-0.6897179484367371,-0.664228081703186,-0.6346962451934814,-0.6012292504310608,-0.5640017986297607,-0.5232561230659485,-0.47929510474205017,-0.4324691593647003,-0.38316163420677185,-0.3317745327949524,-0.2787174582481384,-0.22440119087696075,-0.16923539340496063,-0.11363004893064499,-0.057998474687337875,-0.0027602668851614,0.05165736377239227,0.10482089221477509,0.156294584274292,0.20564691722393036,0.2524584233760834,0.29632967710494995,0.3368884325027466,0.3737950921058655,0.40674644708633423,0.4354778826236725,0.45976459980010986,0.47942256927490234,0.4943092465400696,0.5043243765830994,0.5094104409217834,0.5095519423484802,0.5047731995582581,0.4951349198818207,0.4807288348674774,0.46167200803756714,0.43810155987739563,0.4101712107658386,0.3780507445335388,0.341929167509079,0.3020211160182953,0.2585756182670593,0.2118847370147705,0.1622902750968933,0.1101856529712677,0.0560118593275547,0.0002470159961376339,-0.056609515100717545,-0.11405616253614426,-0.1716083437204361,-0.22881455719470978,-0.28526654839515686,-0.3406015634536743,-0.39449647068977356,-0.4466547667980194,-0.4967896342277527,-0.5446065664291382,-0.5897896885871887,-0.6319953203201294,-0.6708545088768005,-0.7059844136238098,-0.7370073199272156,-0.7635726928710938,-0.78537917137146,-0.8021917939186096,-0.8138516545295715,-0.820276141166687,-0.8214506506919861,-0.8174129128456116,-0.808234691619873,-0.7940040230751038,-0.7748122811317444,-0.7507486343383789,-0.7219032645225525,-0.6883781552314758,-0.6503034234046936,-0.6078541278839111,-0.5612655878067017,-0.5108416080474854,-0.4569554328918457,-0.4000411629676819,-0.34057843685150146,-0.2790720760822296,-0.21603015065193176,-0.15194424986839294,-0.0872747078537941,-0.022442057728767395,0.04217451810836792,0.10623329132795334,0.1694224774837494,0.23145173490047455,0.29204484820365906,0.3509353697299957,0.40786540508270264,0.46258777379989624,0.514869749546051,0.5644969940185547,0.6112767457962036,0.655038058757782,0.6956306099891663,0.7329211235046387,0.7667893171310425,0.7971252202987671,0.8238284587860107,0.8468106389045715,0.8660010695457458,0.8813546299934387,0.8928604125976562,0.9005495309829712,0.9044999480247498,0.9048370122909546,0.9017295837402344,0.8953817486763,0.8860214352607727,0.8738881945610046,0.8592214584350586,0.8422521352767944,0.8231973052024841,0.8022597432136536,0.7796311378479004,0.7554978728294373,0.7300475835800171,0.7034758925437927,0.6759904026985168,0.6478123664855957,0.6191750764846802,0.5903197526931763,0.561488926410675,0.5329197645187378,0.5048364996910095,0.4774445593357086,0.4509259760379791,0.4254360496997833,0.40110209584236145,0.37802305817604065,0.35627034306526184,0.3358893394470215,0.31690168380737305,0.29930779337882996,0.28309008479118347,0.26821601390838623,0.2546411156654358,0.24231158196926117,0.2311655879020691,0.22113390266895294,0.21213899552822113,0.2040935903787613,0.1968989223241806,0.19044369459152222,0.18460451066493988,0.17924842238426208,0.1742379367351532,0.1694379299879074,0.16472390294075012,0.15998980402946472,0.15515436232089996,0.15016403794288635,0.1449918895959854,0.13963215053081512,0.13409116864204407,0.12837623059749603,0.12248452752828598,0.11639463156461716,0.110062375664711,0.10342246294021606,0.09639596939086914,0.08890262991189957,0.08087581396102905,0.07227738201618195,0.06310960650444031,0.053421687334775925,0.04330962523818016,0.03290931135416031,0.022384310141205788,0.011910660192370415,0.0016617727233096957,-0.008203761652112007,-0.017549214884638786,-0.02626064233481884,-0.03424207121133804,-0.04140660911798477,-0.04766606539487839,-0.05292198807001114,-0.05706067755818367,-0.059953782707452774,-0.061464764177799225,-0.06146007403731346,-0.05982265621423721,-0.05646480619907379,-0.051337383687496185,-0.04443318769335747,-0.0357835479080677,-0.02544875629246235,-0.013504338450729847,-0.000026247880668961443,0.014921607449650764,0.03129446879029274,0.04906649515032768,0.0682227611541748,0.08874484896659851,0.11059282720088959,0.13368739187717438,0.15789613127708435,0.18302719295024872,0.20883212983608246,0.23501819372177124,0.26126834750175476,0.28726568818092346,0.31271839141845703,0.33738046884536743,0.36106541752815247,0.38364937901496887,0.40506407618522644,0.42528030276298523,0.44428518414497375,0.4620574116706848,0.4785449206829071,0.4936489760875702,0.5072174072265625,0.5190483331680298,0.5289033651351929,0.5365278720855713,0.5416759848594666,0.5441347360610962,0.5437452793121338,0.540416955947876,0.5341331362724304,0.5249475836753845,0.5129731893539429,0.4983646273612976,0.48129838705062866,0.46195337176322937,0.4404948353767395,0.41706448793411255,0.39177700877189636,0.36472418904304504,0.3359847962856293,0.30563870072364807,0.2737829089164734,0.2405463308095932,0.2061014324426651],"displacement":[0,1.3818112236038682e-12,5.758679297307445e-11,4.535666842109265e-10,1.9228219017008996e-9,5.849487116904584e-9,1.4453100050104695e-8,3.095919254292312e-8,5.976372818849995e-8,1.0660311033916514e-7,1.7874209845558653e-7,2.8518729777715635e-7,4.369234716250503e-7,6.471550477726851e-7,9.315181159763597e-7,0.0000013082160421618028,0.0000017980279380935826,0.000002424149215585203,0.000003211848706996534,0.000004187961167190224,0.000005380268248700304,0.000006816863333369838,0.000008525597877451219,0.000010533709428273141,0.000012867705663666129,0.000015553516277577728,0.000018616885427036323,0.000022083888325141743,0.000025981449653045274,0.000030337665521074086,0.000035181819839635864,0.00004054396413266659,0.00004645406443160027,0.00005294074071571231,0.000060029800806660205,0.00006774273060727865,0.00007609540625708178,0.00008509715553373098,0.00009475040133111179,0.00010505085811018944,0.00011598815763136372,0.00012754691124428064,0.00013970774307381362,0.00015244819223880768,0.00016574333130847663,0.00017956580268219113,0.00019388535292819142,0.00020866803242824972,0.0002238752058474347,0.00023946254805196077,0.0002553794765844941,0.0002715689188335091,0.00028796796686947346,0.0003045087796635926,0.0003211201401427388,0.00033772902679629624,0.00035426238900981843,0.0003706482530105859,0.00038681644946336746,0.0004026989918202162,0.00041822961065918207,0.00043334317160770297,0.0004479750932659954,0.000462060677818954,0.00047553516924381256,0.0004883341025561094,0.0005003940896131098,0.0005116545362398028,0.0005220586899667978,0.0005315553862601519,0.0005400998634286225,0.0005476546357385814,0.0005541894352063537,0.0005596806295216084,0.0005641105235554278,0.0005674666026607156,0.0005697404849343002,0.0005709280958399177,0.0005710294935852289,0.0005700498004443944,0.0005680001922883093,0.0005648992955684662,0.0005607742932625115,0.0005556617397814989,0.0005496079684235156,0.0005426685092970729,0.0005349072744138539,0.0005263952189125121,0.0005172083619982004,0.0005074265063740313,0.0004971316084265709,0.00048640702152624726,0.00047533688484691083,0.0004640061524696648,0.0004525007971096784,0.00044090807205066085,0.0004293165693525225,0.0004178161034360528,0.00040649701259098947,0.0003954490239266306,0.00038476011832244694,0.00037451472599059343,0.0003647925623226911,0.00035566717269830406,0.0003472051757853478,0.0003394657978788018,0.00033250064007006586,0.0003263539110776037,0.0003210624563507736,0.0003166559909004718,0.0003131570992991328,0.00031058109016157687,0.0003089356468990445,0.0003082205366808921,0.00030842723208479583,0.0003095387655775994,0.00031152990413829684,0.00031436746940016747,0.00031801103614270687,0.0003224138345103711,0.00032752356491982937,0.0003332832711748779,0.0003396318934392184,0.00034650464658625424,0.0003538331657182425,0.00036154547706246376,0.0003695657942444086,0.000377814780222252,0.00038620963459834456,0.0003946647047996521,0.00040309224277734756,0.0004114034818485379,0.00041950991726480424,0.00042732429574243724,0.00043476183782331645,0.00044174102367833257,0.00044818405876867473,0.00045401742681860924,0.00045917186071164906,0.00046358274994418025,0.00046719014062546194,0.00046993937576189637,0.0004717815318144858,0.0004726742045022547,0.0004725823528133333,0.0004714790848083794,0.00046934609417803586,0.00046617400948889554,0.0004619622486643493,0.0004567184660118073,0.0004504578828345984,0.00044320241431705654,0.0004349798837210983,0.00042582329479046166,0.00041577068623155355,0.00040486492798663676,0.00039315418689511716,0.0003806922468356788,0.0003675389743875712,0.00035376049345359206,0.0003394289524294436,0.00032462188391946256,0.00030942095327191055,0.00029391053249128163,0.0002781756629701704,0.00026230019284412265,0.00024636508896946907,0.00023044708359520882,0.00021461775759235024,0.00019894327851943672,0.0001834845752455294,0.00016829794913064688,0.00015343583072535694,0.00013894760922994465,0.00012488022912293673,0.000111278539407067,0.00009818520629778504,0.00008564034214941785,0.00007368079968728125,0.0000623392770648934,0.00005164342655916698,0.0000416150433011353,0.00003226945409551263,0.00002361515726079233,0.000015653744412702508,0.000008380080544156954,0.0000017826490648076287,-0.0000041559483179298695,-0.000009458444765186869,-0.000014152346921036951,-0.000018269387510372326,-0.000021845000446774065,-0.000024917821065173484,-0.000027529167709872127,-0.00002972251604660414,-0.00003154293153784238,-0.00003303647827124223,-0.00003424960232223384,-0.0000352285205735825,-0.000036018620448885486,-0.000036663936043623835,-0.000037206649722065777,-0.00003768667738768272,-0.00003814131923718378,-0.00003860495417029597,-0.00003910876694135368,-0.000039680518966633826,-0.00004034431913169101,-0.000041120409150607884,-0.00004202498894301243,-0.00004307004564907402,-0.000044263259042054415,-0.000045607928768731654,-0.000047102992539294064,-0.00004874307705904357,-0.00005051864354754798,-0.000052416155085666105,-0.0000544183021702338,-0.00005650424645864405,-0.000058649908169172704,-0.0000608282680332195,-0.00006300971290329471,-0.00006516239955089986,-0.00006725268031004816,-0.00006924552872078493,-0.00007110508158802986,-0.00007279513374669477,-0.00007427971286233515,-0.00007552365423180163,-0.00007649316830793396,-0.000077156386396382,-0.00007748383359285071,-0.0000774488944443874,-0.00007702816219534725,-0.00007620172254974023,-0.00007495337922591716,-0.0000732707921997644,-0.00007114560867194086,-0.00006857355037936941,-0.00006555452273460105,-0.0000620927385170944,-0.000058196917962050065,-0.00005388048884924501,-0.000049161873903358355,-0.00004406476000440307,-0.00003861834557028487,-0.000032857518817763776,-0.000026822917789104395,-0.000020560804841807112,-0.000014122765605861787,-0.000007565187843283638,-9.485602845415997e-7,0.0000056633898566360585,0.000012204642189317383,0.000018607848687679507,0.000024805231078062207,0.00003072936669923365,0.00003631379149737768,0.000041493414755677804,0.00004620479012373835,0.0000503862502228003,0.00005397799759521149,0.00005692222839570604,0.000059163376135984436,0.000060648508224403486,0.00006132791168056428,0.00006115587893873453,0.0000600916137045715,0.00005810020593344234,0.000055153563152998686,0.000051231199904577807,0.00004632083437172696,0.00004041866850457154,0.000033529377105878666,0.000025665805878816172,0.00001684841663518455,0.00000710459016772802,-0.000003532145456119906,-0.000015022841580503155,-0.000027323731046635658,-0.00004038665792904794,-0.00005415931445895694,-0.00006858527922304347,-0.00008360396168427542,-0.00009915042028296739,-0.00011515528603922576,-0.00013154474436305463,-0.0001482407096773386,-0.0001651612255955115,-0.0001822212216211483,-0.0001993333426071331,-0.00021640917111653835,-0.00023336037702392787,-0.00025010001263581216,-0.0002665436768438667,-0.0002826105337589979,-0.0002982240403071046,-0.0003133126301690936,-0.0003278098301962018,-0.0003416545514483005,-0.00035479088546708226,-0.0003671682206913829,-0.000378741038730368,-0.0003894692345056683,-0.0003993182035628706,-0.0004082593659404665,-0.0004162709228694439,-0.0004233383806422353,-0.0004294553946238011,-0.0004346242640167475,-0.0004388564557302743,-0.00044217260438017547,-0.0004446023958735168,-0.00044618401443585753,-0.00044696335680782795,-0.0004469931300263852,-0.0004463317454792559,-0.0004450423293747008,-0.0004431916167959571,-0.00044084934052079916,-0.00043808750342577696,-0.00043497979640960693,-0.00043160119093954563,-0.0004280276771169156,-0.00042433556518517435,-0.0004206010198686272,-0.00041689942008815706,-0.00041330442763864994,-0.00040988720138557255,-0.0004067154659423977,-0.0004038526676595211,-0.0004013572761323303,-0.0003992824349552393,-0.00039767540874890983,-0.00039657761226408184,-0.0003960244939662516,-0.00039604544872418046,-0.0003966638760175556,-0.0003978969471063465,-0.0003997552557848394,-0.0004022425564471632,-0.00040535515290685,-0.0004090815200470388,-0.00041340192547068,-0.00041828828398138285,-0.0004237042157910764,-0.0004296053375583142,-0.0004359400481916964,-0.00044265022734180093,-0.0004496720794122666,-0.0004569372395053506,-0.0004643735592253506,-0.0004719056887552142,-0.00047945574624463916,-0.0004869436379522085,-0.0004942872910760343,-0.0005014030612073839,-0.0005082059651613235,-0.0005146103794686496,-0.0005205310299061239,-0.0005258838646113873,-0.0005305875674821436,-0.0005345651879906654,-0.0005377455381676555,-0.000540064531378448,-0.0005414666375145316,-0.0005419052904471755,-0.0005413437029346824,-0.000539754459168762,-0.0005371193401515484,-0.0005334287416189909,-0.0005286808591336012,-0.0005228811060078442,-0.0005160413566045463,-0.0005081799463368952,-0.0004993213224224746,-0.0004894964513368905,-0.00047874293522909284,-0.0004671056231018156,-0.00045463675633072853,-0.000441396317910403,-0.00042745188693515956,-0.0004128783184569329,-0.0003977570158895105,-0.00038217517430894077,-0.0003662246745079756,-0.0003500008024275303,-0.00033360131783410907,-0.0003171252319589257,-0.00030067193438299,-0.0002843403781298548,-0.00026822846848517656,-0.000252432597335428,-0.00023704698833171278,-0.0002221633621957153,-0.00020787031098734587,-0.00019425273058004677,-0.00018139103485736996,-0.00016936047177296132,-0.0001582303229952231,-0.00014806310355197638,-0.00013891390699427575,-0.00013082976511213928,-0.00012384922592900693,-0.00011800196080002934,-0.00011330850975355133,-0.00010978003410855308,-0.00010741812002379447,-0.0001062145602190867,-0.00010615107021294534,-0.0001071989827323705,-0.00010931901488220319,-0.00011246107169426978,-0.00011656421702355146,-0.0001215568627230823,-0.00012735727068502456,-0.00013387428771238774,-0.00014100855332799256,-0.00014865373668726534,-0.00015669828280806541,-0.0001650270278332755,-0.00017352295981254429,-0.00018206880486104637,-0.00019054840959142894,-0.00019884783250745386,-0.00020685620256699622,-0.00021446621394716203,-0.0002215744461864233,-0.00022808145149610937,-0.00023389188572764397,-0.00023891452292446047,-0.00024306251725647599,-0.00024625376681797206,-0.0002484115248080343,-0.0002494650543667376,-0.00024935079272836447,-0.00024801315157674253,-0.0002454056520946324,-0.00024149182718247175,-0.0002362458617426455,-0.00022965314565226436,-0.00022171046293806285,-0.00021242596267256886,-0.0002018188824877143,-0.00018991908291354775,-0.0001767665526131168,-0.0001624108845135197,-0.00014691070828121156,-0.00013033337017986923,-0.00011275460565229878,-0.00009425825555808842,-0.00007493601879104972,-0.00005488711758516729,-0.000034217762731714174,-0.000013040456906310283,0.000008527007594238967,0.000030362738471012563,0.00005234213676885702,0.00007433937571477145,0.00009622886136639863,0.00011788655683631077,0.0001391911064274609,0.0001600247051101178,0.00018027368059847504,0.00019982893718406558,0.0002185862249461934,0.0002364464453421533,0.0002533160150051117,0.0002691074332688004,0.00028374011162668467,0.0002971411740873009,0.0003092466213274747,0.0003200024366378784,0.0003293652553111315,0.0003373031795490533,0.00034379586577415466,0.0003488344664219767,0.00035242116427980363,0.0003545685613062233,0.0003552990674506873,0.00035464431857690215,0.00035264488542452455,0.00034935036092065275,0.00034481933107599616,0.0003391198697499931,0.000332329684169963,0.00032453620224259794,0.00031583610689267516,0.00030633434653282166,0.0002961426798719913,0.0002853773476090282,0.0002741571224760264,0.00026260066078975797,0.0002508246398065239,0.0002389422443229705,0.00022706235176883638,0.00021528969227802008,0.0002037253580056131,0.00019246790907345712,0.000181614508619532,0.0001712617086013779,0.00016150568262673914,0.00015244162932503968,0.00014416234625969082,0.00013675603258889169,0.00013030378613620996,0.00012487689673434943,0.00012053472164552659,0.00011732316488632932,0.00011527426249813288,0.00011440676462370902,0.00011472777259768918,0.00011623493628576398,0.00011891899339389056,0.00012276609777472913,0.0001277595292776823,0.00013388051593210548,0.0001411080447724089,0.00014941772678866982,0.00015878005069680512,0.00016915820015128702,0.00018050616199616343,0.00019276735838502645,0.00020587403560057282,0.00021974770061206073,0.00023430047440342605,0.00024943723110482097,0.00026505807181820273,0.0002810610458254814,0.00029734440613538027,0.0003138085303362459,0.00033035720116458833,0.000346897984854877,0.00036334243486635387,0.0003796056844294071,0.000395606184611097,0.0004112654132768512,0.0004265079041942954,0.0004412616544868797,0.00045545882312580943,0.00046903645852580667,0.0004819374589715153,0.0004941112129017711,0.0005055140936747193,0.0005161095759831369,0.000525867857504636,0.0005347658880054951,0.0005427866126410663,0.0005499183898791671,0.0005561551079154015,0.0005614956608042121,0.0005659442394971848,0.0005695103900507092,0.0005722093628719449,0.0005740619380958378,0.0005750946002081037,0.0005753388977609575,0.0005748308612965047,0.0005736103048548102,0.000571719603613019,0.0005692026461474597,0.0005661043105646968,0.0005624694749712944,0.0005583426682278514,0.0005537679535336792,0.0005487889284268022,0.0005434488411992788,0.0005377904744818807,0.0005318563780747354,0.0005256885197013617,0.0005193280521780252,0.0005128146731294692,0.0005061861011199653,0.0004994774353690445,0.0004927205154672265,0.0004859435139223933,0.00047917047049850225,0.00047242132131941617,0.0004657116951420903,0.00045905314618721604,0.0004524532414507121,0.0004459157935343683,0.0004394410934764892,0.0004330262599978596,0.0004266652977094054,0.0004203494463581592,0.00041406741365790367,0.00040780569543130696,0.00040154875023290515,0.0003952793776988983,0.00038897900958545506,0.000382628059014678,0.00037620626972056925,0.0003696930652949959,0.00036306801484897733,0.0003563112986739725,0.00034940423211082816,0.00034232978941872716,0.0003350732440594584,0.00032762245973572135,0.0003199685306753963,0.0003121057234238833,0.0003040317678824067,0.00029574736254289746,0.0002872560580726713,0.00027856382075697184,0.00026967842131853104,0.0002606092893984169,0.0002513673680368811,0.00024196530284825712,0.00023241776216309518,0.00022274219372775406,0.00021295945043675601,0.00020309451792854816,0.00019317693659104407,0.00018324093252886087,0.00017332506831735373,0.0001634715881664306,0.0001537251373520121,0.00014413153985515237,0.00013473618309944868,0.0001255828537978232,0.00011671256652334705,0.00010816301073646173,0.0000999683397822082,0.00009215940372087061,0.00008476425864500925,0.00007780879241181538,0.00007131732127163559,0.00006531292456202209,0.00005981750655337237,0.00005485143992700614,0.00005043291093898006,0.00004657701720134355,0.00004329478906583972,0.00004059226921526715,0.00003846982872346416,0.000036921734135830775,0.00003593610381358303,0.000035495155316311866,0.00003557566742529161,0.00003614961315179244,0.000037184821849223226,0.00003864555765176192,0.00004049301060149446,0.00004268564225640148,0.000045179418521001935,0.00004792798790731467,0.0000508828234160319,0.00005399341171141714,0.000057207507779821754,0.00006047144051990472,0.00006373046926455572,0.00006692918395856395,0.00007001188350841403,0.00007292289956239983,0.00007560696394648403,0.00007800951425451785,0.00008007705037016422,0.00008175754192052409,0.0000830009812489152,0.00008375998004339635,0.00008399049693252891,0.00008365254325326532,0.00008271095430245623,0.00008113592775771394,0.0000789034747867845,0.00007599565287819132,0.00007240052218548954,0.0000681120072840713,0.00006312959885690361,0.000057458037190372124,0.00005110704660182819,0.000044091211748309433,0.00003642995216068812,0.00002814768231473863,0.00001927400990098249,0.000009843975931289606,-1.0181343412796195e-7,-0.000010517213922867086,-0.000021350791939767078,-0.000032546307920711115,-0.000044043401430826634,-0.00005577842239290476,-0.00006768530874978751,-0.00007969644502736628,-0.00009174338629236445,-0.00010375752026448026,-0.00011567047477001324,-0.00012741451791953295,-0.00013892279821448028,-0.0001501296937931329,-0.00016097105981316417,-0.0001713846722850576,-0.00018131067918147892,-0.00019069210975430906,-0.00019947538385167718,-0.00020761073392350227,-0.00021505255426745862,-0.00022175960475578904,-0.00022769515635445714,-0.00023282694746740162,-0.00023712730035185814,-0.00024057315022218972,-0.0002431462926324457,-0.00024483364541083574,-0.0002456276852171868,-0.0002455269859638065,-0.0002445365535095334,-0.00024266832042485476,-0.00023994117509573698,-0.00023638101993128657,-0.00023202033480629325,-0.00022689772595185786,-0.00022105718380771577,-0.00021454736997839063,-0.00020742087508551776,-0.0001997336803469807,-0.00019154476467519999,-0.00018291575543116778,-0.00017391092842444777,-0.00016459696053061634,-0.00015504282782785594,-0.00014531950000673532,-0.00013549934374168515,-0.0001256554533028975,-0.0001158607701654546,-0.00010618710803100839,-0.0000967042360571213,-0.00008747919491725042,-0.00007857576565584168,-0.00007005430961726233,-0.00006197189941303805,-0.000054382609960157424,-0.00004733804235002026,-0.00004088768400833942,-0.00003507919245748781,-0.000029958386221551336,-0.000025568908313289285,-0.000021951580492896028,-0.00001914351923915092,-0.000017177142581203952,-0.000016079200577223673,-0.000015869976778049022,-0.000016562797100050375,-0.00001816387703001965,-0.000020672556274803355,-0.00002408183900115546,-0.000028379159630276263,-0.00003354725777171552,-0.000039565024053445086,-0.00004640821134671569,-0.00005404996045399457,-0.0000624611129751429,-0.00007161030953284353,-0.00008146394975483418,-0.00009198610496241599,-0.00010313846723875031,-0.00011488033487694338,-0.0001271687651751563,-0.00013995886547490954,-0.00015320416423492134,-0.00016685706214047968,-0.00018086936324834824,-0.00019519260968081653,-0.00020977850363124162,-0.0002245790819870308,-0.00023954692005645484,-0.0002546351170167327,-0.0002697973104659468,-0.0002849877346307039,-0.00030016113305464387,-0.00031527294777333736,-0.00033027929021045566,-0.00034513731952756643,-0.0003598053881432861,-0.000374243245460093,-0.0003884123871102929,-0.0004022762004751712,-0.0004158001975156367,-0.0004289520438760519,-0.00044170161709189415,-0.0004540210939012468,-0.00046588489203713834,-0.0004772694956045598,-0.00048815360059961677,-0.0004985177656635642,-0.0005083447322249413,-0.0005176187842153013,-0.0005263263592496514,-0.0005344553501345217,-0.0005419955123215914,-0.0005489379982464015,-0.000555275590158999,-0.0005610024090856314,-0.0005661139148287475,-0.0005706066731363535,-0.0005744785303249955,-0.0005777283804491162,-0.0005803562817163765,-0.000582363223657012,-0.0005837513599544764,-0.0005845239502377808,-0.0005846855929121375,-0.000584241992328316,-0.0005832004244439304,-0.0005815693293698132,-0.0005793587770313025,-0.0005765800597146153,-0.0005732459248974919,-0.000569369993172586,-0.0005649669328704476,-0.0005600522272288799,-0.0005546417087316513,-0.0005487516173161566,-0.0005423985421657562,-0.000535599363502115,-0.0005283714272081852,-0.0005207326612435281,-0.0005127020995132625,-0.0005042998818680644,-0.0004955478361807764,-0.00048646965296939015,-0.00047709085629321635,-0.0004674390656873584,-0.00045754373422823846,-0.0004474357992876321,-0.0004371475661173463,-0.00042671203846111894,-0.0004161627439316362,-0.00040553323924541473,-0.00039485690649598837,-0.0003841668367385864,-0.0003734957135748118,-0.00036287590046413243,-0.0003523394698277116,-0.00034191826125606894,-0.0003316438233014196,-0.00032154726795852184,-0.00031165897962637246,-0.00030200823675841093,-0.0002926226588897407,-0.00028352788649499416,-0.00027474696980789304,-0.00026630022330209613,-0.00025820499286055565,-0.00025047571398317814,-0.00024312417372129858,-0.00023615975806023926,-0.00022958983026910573,-0.0002234199782833457,-0.0002176540729124099,-0.000212294195080176,-0.00020734024292323738,-0.000202789407921955,-0.00019863549096044153,-0.000194868232938461,-0.0001914728491101414,-0.00018842976714950055,-0.0001857148454291746,-0.0001832998386817053,-0.00018115337297786027,-0.00017924216808751225,-0.000177532245288603,-0.00017599023703951389,-0.00017458421643823385,-0.00017328429385088384,-0.00017206257325597107,-0.0001708927156869322,-0.00016974896425381303,-0.00016860512550920248,-0.00016743339074309915,-0.000166203361004591,-0.00016488156688865274,-0.00016343143943231553,-0.00016181389219127595,-0.00015998842718545347,-0.00015791470650583506,-0.00015555418212898076,-0.00015287179849110544,-0.00014983733126427978,-0.00014642644964624196,-0.0001426210510544479,-0.0001384092029184103,-0.00013378467701841146,-0.00012874601816292852,-0.00012329571472946554,-0.0001174391945824027,-0.00011118415568489581,-0.00010454012954141945,-0.00009751840843819082,-0.00009013215458253399,-0.00008239675662480295,-0.00007433026621583849,-0.00006595371087314561,-0.000057291366829304025,-0.00004837072265218012,-0.00003922233372577466,-0.000029879445719416253,-0.000020377519831527025,-0.000010753708011179697,-0.0000010463347734912531,0.000008705568689038046,0.000018462656953488477,0.000028185619157738984,0.000037835485272808,0.000047373949200846255,0.000056763710745144635,0.00006596887396881357,0.00007495533645851538,0.0000836912149679847,0.00009214719466399401,0.00010029679106082767,0.00010811650281539187,0.0001155858626589179,0.0001226873428095132,0.00012940629676450044,0.00013573082105722278,0.00014165171887725592,0.0001471625582780689,0.00015225987590383738,0.00015694340982008725,0.00016121644875966012,0.00016508615226484835,0.00016856379806995392,0.00017166485486086458,0.00017440882220398635,0.0001768190850270912,0.00017892225878313184,0.0001807477674447,0.00018232714501209557,0.00018369348254054785,0.0001848809333750978,0.00018592436390463263,0.00018685920804273337,0.00018772129260469228,0.00018854683730751276,0.00018937245476990938,0.00019023501954507083,0.00019117143529001623,0.00019221840193495154,0.0001934118481585756,0.00019478642207104713,0.00019637496734503657,0.00019820788293145597,0.00020031261374242604,0.00020271327230148017,0.00020543030404951423,0.00020848035637754947,0.0002118761040037498,0.00021562633628491312,0.0002197359863203019,0.0002242061891593039,0.0002290344564244151,0.00023421469086315483,0.00023973746283445507,0.00024558999575674534,0.0002517563116271049,0.0002582174201961607,0.0002649512025527656,0.0002719326294027269,0.0002791336446534842,0.000286523369140923,0.00029406792600639164,0.0003017309063579887,0.0003094733983743936,0.0003172546857967973,0.00032503274269402027,0.0003327649610582739,0.0003404091112315655,0.0003479239239823073,0.0003552699345164001,0.00036240986082702875,0.0003693086910061538,0.0003759335959330201,0.0003822534636128694,0.00038823849172331393,0.00039385948912240565,0.0003990877012256533,0.0004038946353830397,0.0004082525847479701,0.00041213538497686386,0.0004155198112130165,0.000418386742239818,0.0004207229649182409,0.00042252210550941527,0.0004237855027895421,0.00042452229536138475,0.00042474883957765996,0.0004244876035954803,0.00042376533383503556,0.000422611425165087,0.00042105602915398777,0.0004191287443973124,0.00041685791802592576,0.00041427058749832213,0.00041139323730021715,0.00040825290489010513,0.0004048788396175951,0.0004013037832919508,0.0003975652507506311,0.00039370585000142455,0.00038977322401478887,0.000385818857466802,0.00038189656333997846,0.00037806047475896776,0.00037436289130710065,0.000370852358173579,0.0003675722982734442,0.00036456011002883315,0.0003618470800574869,0.0003594587615225464,0.00035741584724746644,0.0003557351010385901,0.00035443028900772333,0.0003535127907525748,0.0003529919486027211,0.00035287474747747183,0.0003531652910169214,0.0003538642486091703,0.0003549678949639201,0.0003564676735550165,0.00035834996378980577,0.0003605961101129651,0.0003631828585639596,0.0003660832007881254,0.00036926704342477024,0.00037270208122208714,0.0003763541753869504,0.0003801878192462027,0.00038416593451984227,0.00038824969669803977,0.00039239812758751214,0.00039656765875406563,0.00040071221883408725,0.00040478326263837516,0.00040873061516322196,0.0004125031700823456,0.00041605046135373414,0.00041932391468435526,0.00042227806989103556,0.00042487174505367875,0.00042706841486506164,0.00042883650166913867,0.0004301487351767719,0.0004309814248699695,0.0004313134995754808,0.0004311254306230694,0.00043039844604209065,0.00042911426862701774,0.00042725520324893296,0.0004248049226589501,0.00042174968984909356,0.000418079667724669,0.0004137906653340906,0.0004088852147106081,0.0004033737350255251,0.0003972745325881988,0.0003906136262230575,0.00038342372863553464,0.0003757425001822412,0.0003676108317449689,0.00035907080746255815,0.0003501639876049012,0.0003409299242775887,0.00033140540472231805,0.0003216243057977408,0.00031161788501776755,0.00030141559545882046,0.00029104630812071264,0.00028053924324922264,0.0002699250471778214,0.00025923628709279,0.000248507596552372,0.0002377752389293164,0.00022707637981511652,0.00021644790831487626,0.00020592518558260053,0.0001955408661160618,0.00018532376270741224,0.00017529817705508322,0.0001654835359659046,0.00015589433314744383,0.00014654042024631053,0.0001374275452690199,0.0001285578910028562,0.00011993068619631231,0.00011154264211654663,0.00010338836000300944,0.00009546046931063756,0.00008774975867709145,0.00008024511771509424,0.00007293358794413507,0.00006580036279046908,0.00005882890764041804,0.00005200118903303519,0.00004529794750851579,0.00003869909778586589,0.00003218408892280422,0.00002573233905422967,0.000019323581000207923,0.00001293821151193697,0.0000065575973167142365,1.6435386385182937e-7,-0.000006257381301111309,-0.000012721663551928941,-0.000019240447727497667,-0.000025823279429459944,-0.000032476993510499597,-0.00003920544986613095,-0.000046009277866687626,-0.00005288574902806431,-0.00005982866059639491,-0.0000668283537379466,-0.00007387174991890788,-0.00008094248914858326,-0.00008802106458460912,-0.00009508501534583047,-0.00010210911568719894,-0.0001090656005544588,-0.00011592442024266347,-0.0001226535241585225,-0.00012921921734232455,-0.00013558650971390307,-0.0001417195308022201,-0.00014758195902686566,-0.0001531374000478536,-0.0001583497505635023,-0.00016318348934873939,-0.00016760389553382993,-0.0001715772523311898,-0.00017507097800262272,-0.00017805378593038768,-0.00018049590289592743,-0.0001823693746700883,-0.00018364844436291605,-0.00018431010539643466,-0.00018433468358125538,-0.00018370647740084678,-0.00018241438374388963,-0.0001804524363251403,-0.0001778202276909724,-0.00017452322936151177,-0.00017057285003829747,-0.00016598645015619695,-0.00016078715270850807,-0.00015500363952014595,-0.00014866986020933837,-0.00014182472659740597,-0.00013451185077428818,-0.00012677922495640814,-0.00011867901775985956,-0.00011026726861018687,-0.00010160361853195354,-0.00009275103366235271,-0.00008377548510907218,-0.00007474566518794745,-0.00006573267455678433,-0.00005680973845301196,-0.00004805185380973853,-0.000039535440009785816,-0.00003133785867248662,-0.000023536795197287574,-0.00001620947841729503,-0.000009431671060156077,-0.0000032765196920081507,0.0000021867144823772833,0.000006893930276419269,0.000010787330211314838,0.000013816307728120591,0.000015937974239932373,0.000017117248717113398,0.000017326527085970156,0.000016545018297620118,0.000014757863027625717,0.000011955256923101842,0.000008131768481689505,0.0000032860216379049234,-0.0000025791289317567134,-0.000009455925464862958,-0.00001733060707920231,-0.000026182060537394136,-0.000035980468965135515,-0.000046686178393429145,-0.000058249079302186146,-0.00007060860662022606,-0.00008369443821720779,-0.00009742790280142799,-0.00011172384256497025,-0.00012649274140130728,-0.00014164291496854275,-0.0001570822496432811,-0.00017271973774768412,-0.00018846607417799532,-0.00020423391833901405,-0.00021993754489813,-0.00023549221805296838,-0.000250813493039459,-0.0002658167213667184,-0.00028041674522683024,-0.0002945283195003867,-0.000308066577417776,-0.00032094831112772226,-0.00033309325226582587,-0.0003444254398345947,-0.0003548746171873063,-0.0003643773961812258,-0.00037287798477336764,-0.0003803288855124265,-0.00038669101195409894,-0.0003919338632840663,-0.00039603549521416426,-0.0003989824326708913,-0.0004007698444183916,-0.000401401543058455,-0.0004008901596534997,-0.0003992572892457247,-0.0003965335781686008,-0.000392758782254532,-0.0003879814757965505,-0.0003822588187176734,-0.0003756559453904629,-0.0003682455571833998,-0.00036010690382681787,-0.00035132523044012487,-0.00034199090441688895,-0.0003321985132060945,-0.0003220460203010589,-0.0003116340085398406,-0.00030106460326351225,-0.00029044077382422984,-0.0002798653149511665,-0.00026944020646624267,-0.0002592657692730427,-0.00024944014148786664,-0.00024005882733035833,-0.000231214304221794,-0.00022299567353911698,-0.0002154882822651416,-0.00020877331553492695,-0.00020292714179959148,-0.0001980204979190603,-0.00019411755783949047,-0.00019127479754388332,-0.0001895400055218488,-0.00018895138055086136,-0.0001895368768600747,-0.00019131398585159332,-0.00019428992527537048,-0.00019846211944241077,-0.0002038189850281924,-0.00021034097881056368,-0.00021800138347316533,-0.00022676706430502236,-0.00023659886210225523,-0.00024745159316807985,-0.0002592736855149269,-0.0002720068150665611,-0.0002855850907508284,-0.0002999348216690123,-0.00031497437157668173,-0.0003306144499219954,-0.0003467589267529547,-0.00036330605507828295,-0.00038015004247426987,-0.0003971824480686337,-0.0004142940160818398,-0.00043137563625350595,-0.000448319420684129,-0.00046501916949637234,-0.0004813706036657095,-0.0004972713068127632,-0.0005126206087879837,-0.0005273200804367661,-0.0005412733880802989,-0.0005543875158764422,-0.0005665736389346421,-0.0005777485785074532,-0.0005878361407667398,-0.0005967686302028596,-0.0006044878391548991,-0.0006109460373409092,-0.0006161058554425836,-0.000619940459728241,-0.0006224330281838775,-0.0006235758191905916,-0.0006233694730326533,-0.0006218221387825906,-0.0006189487176015973,-0.000614770338870585,-0.0006093141855672002,-0.0006026128539815545,-0.0005947045865468681,-0.0005856328061781824,-0.0005754459416493773,-0.000564197136554867,-0.0005519437254406512,-0.0005387468845583498,-0.0005246711079962552,-0.0005097838002257049,-0.000494154985062778,-0.0004778571892529726,-0.00046096506412141025,-0.00044355521094985306,-0.00042570597724989057,-0.00040749681647866964,-0.0003890079096890986,-0.00037031914689578116,-0.0003515093703754246,-0.0003326551814097911,-0.0003138302417937666,-0.00029510422609746456,-0.00027654229779727757,-0.00025820473092608154,-0.0002401467936579138,-0.00022241883561946452,-0.00020506653527263552,-0.00018813122005667537,-0.00017165007011499256,-0.0001556563947815448,-0.0001401795889250934,-0.00012524507474154234,-0.00011087406892329454,-0.00009708334255265072,-0.00008388490095967427,-0.00007128581637516618,-0.00005928810787736438,-0.00004788876321981661,-0.00003707996802404523,-0.00002684942228370346,-0.000017180771465064026,-0.000008054154022829607,5.532450586542836e-7,0.000008666593203088269,0.000016312831576215103,0.000023520111426478252,0.000030317283744807355,0.00003673341416288167,0.00004279739368939772,0.000048537574912188575,0.000053981508244760334,0.000059155721828574315,0.00006408552144421265,0.00006879487045807764,0.00007330618245759979,0.00007764017209410667,0.0000818156186142005,0.000085849103925284,0.00008975477976491675,0.00009354410576634109,0.00009722571121528745,0.0001008053804980591,0.0001042861767928116,0.0001076687331078574,0.00011095174704678357,0.00011413248284952715,0.00011720738984877244,0.00012017258268315345,0.00012302420509513468,0.00012575858272612095,0.00012837206304538995,0.00013086081889923662,0.00013322026643436402,0.00013544474495574832,0.00013752702216152102,0.00013945819227956235,0.00014122780703473836,0.00014282428310252726,0.0001442356442566961,0.00014545043813996017,0.00014645875489804894,0.00014725311484653503,0.00014782916696276516,0.000148186125443317,0.00014832690067123622,0.00014825785183347762,0.00014798845222685486,0.00014753076538909227,0.00014689900854136795,0.00014610931975767016,0.00014517962699756026,0.0001441297645214945,0.00014298180758487433,0.00014176033437252045,0.00014049273158889264,0.00013920917990617454,0.0001379425375489518,0.00013672778732143342,0.00013560136721935123,0.00013460031186696142,0.00013376136485021561,0.00013312030932866037,0.00013271148782223463,0.00013256761303637177,0.00013271995703689754,0.00013319864228833467,0.00013403302000369877,0.00013525209215003997,0.0001368845405522734,0.000138958464958705,0.00014150072820484638,0.0001445360539946705,0.00014808577543590218,0.00015216661267913878,0.00015678962517995387,0.00016195946955122054,0.0001676741667324677,0.00017392533482052386,0.00018069896032102406,0.00018797648954205215,0.00019573618192225695,0.00020395427418407053,0.00021260605717543513,0.00022166641429066658,0.00023110993788577616,0.0002409104781690985,0.00025104032829403877,0.000261469220276922,0.00027216310263611376,0.00028308338369242847,0.00029418623307719827,0.0003054225817322731,0.0003167385293636471,0.00032807630486786366,0.00033937543048523366,0.00035057440982200205,0.00036161206662654877,0.00037242902908474207,0.000382968777557835,0.0003931782266590744,0.00040300804539583623,0.0004124125116504729,0.00042134913383051753,0.0004297780978959054,0.0004376616852823645,0.00044496392365545034,0.00045165055780671537,0.0004576890205498785,0.0004630491603165865,0.0004677038814406842]}}}
\ No newline at end of file
tests/test_solver.pyadded+190−0View file
@@ -0,0 +1,190 @@
1+import json
2+import os
3+
4+import numpy as np
5+import pytest
6+
7+import beadnet as bn
8+from beadnet.kernels import hinge_angle
9+
10+HERE = os.path.dirname(__file__)
11+
12+
13+def string_model(N=15, a=0.01, m=1e-3, f0=10.0, k=1e4, **kw):
14+ pos, E, _ = bn.chain(N + 2, (N + 1) * a)
15+ M = bn.Model(pos=pos, mass=m, pinned=[0, N + 1], springs=bn.springs(pos, E, k, f0))
16+ M.hits = [bn.Hit(beads=4, velocity=[0, 0, 1e-4])]
17+ M.duration = 0.2
18+ for key, val in kw.items():
19+ setattr(M, key, val)
20+ return M
21+
22+
23+def string_freq(kk, N=15, a=0.01, m=1e-3, f0=10.0):
24+ return 2 * np.sqrt(f0 / (m * a)) * np.sin(kk * np.pi / (2 * (N + 1))) / (2 * np.pi)
25+
26+
27+def peak_frequency(x, fs, f_lo, f_hi):
28+ """Direct DFT magnitude with a Hann window on a 0.5 Hz grid, refined by a parabola."""
29+ i = np.arange(len(x))
30+ w = 0.5 - 0.5 * np.cos(2 * np.pi * i / (len(x) - 1))
31+ xw = w * x
32+
33+ def mag(f):
34+ return abs(np.sum(xw * np.exp(-2j * np.pi * f * i / fs)))
35+
36+ grid = np.arange(f_lo, f_hi, 0.5)
37+ mags = np.array([mag(f) for f in grid])
38+ f = grid[np.argmax(mags)]
39+ a, b, c = mag(f - 0.5), mag(f), mag(f + 0.5)
40+ return f + 0.25 * (a - c) / (a - 2 * b + c)
41+
42+
43+def test_string_modes_analytic():
44+ md = bn.modes(string_model())
45+ assert md.kind == "transverse"
46+ for kk in range(1, 16):
47+ assert md.freqs[kk - 1] == pytest.approx(string_freq(kk), rel=1e-9)
48+
49+
50+def test_string_rings_at_fundamental(tmp_path):
51+ M = string_model()
52+ M.hits = [bn.Hit(beads=8, velocity=[0, 0, 1e-4])]
53+ r = bn.run(M, str(tmp_path / "s"), progress=False)
54+ assert r.meta["aborted"] is None
55+ f = peak_frequency(r.signal(8, "displacement"), r.sample_rate, 0.8 * string_freq(1), 1.2 * string_freq(1))
56+ assert abs(f - string_freq(1)) / string_freq(1) < 2e-3
57+
58+
59+def test_equilibrium_and_energy_conservation(tmp_path):
60+ M = string_model(friction=0.0, method="yoshida4")
61+ M.hits = [bn.Hit(beads=4, velocity=[0.5, 0.3, 2.0])]
62+ r = bn.run(M, str(tmp_path / "s"), progress=False)
63+ assert r.meta["residual_force"] < 1e-9
64+ assert r.meta["energy_drift"] < 1e-6
65+ assert np.all(r.dissipated == 0)
66+
67+
68+def test_hinge_gradient_finite_difference():
69+ rng = np.random.default_rng(1)
70+ x = rng.normal(size=12)
71+ g = np.zeros(12)
72+ th = hinge_angle(x, 0, 1, 2, 3, g, 0)
73+ eps = 1e-7
74+ for q in range(12):
75+ xp = x.copy()
76+ xp[q] += eps
77+ xm = x.copy()
78+ xm[q] -= eps
79+ d = (hinge_angle(xp, 0, 1, 2, 3, np.zeros(12), 0) - hinge_angle(xm, 0, 1, 2, 3, np.zeros(12), 0)) / (2 * eps)
80+ assert d == pytest.approx(g[q], rel=1e-5, abs=1e-7)
81+ assert np.isfinite(th)
82+
83+
84+@pytest.mark.parametrize("curved", [False, True])
85+def test_decay_law_exact_at_small_amplitude(curved):
86+ pos, tri, rim, trip = bn.hexdisk(0.06, 0.012)
87+ if curved:
88+ r = np.linalg.norm(pos[:, :2], axis=1)
89+ pos[:, 2] = 0.01 * (1 - (r / 0.06) ** 2)
90+ M = bn.Model(pos=pos, mass=1e-3, pinned=bn.near(pos, [0, 0, pos[:, 2].max()], 0.013),
91+ springs=bn.springs(pos, bn.edges(tri), 2e6, 0), hinges=bn.hinges(tri, 50.0))
92+ else:
93+ M = bn.Model(pos=pos, mass=1e-3, pinned=rim, springs=bn.springs(pos, bn.edges(tri), 2e5, 20.0),
94+ bends=bn.bends(trip, 1e3))
95+ bn.decay(M, [(200, 2.0), (3000, 0.5)])
96+ md = bn.modes(M)
97+ sigma = bn.modal_damping(M, md)
98+ s0, s1 = M.decay_law
99+ expected = s0 + s1 * (2 * np.pi * md.freqs) ** 2
100+ assert np.allclose(sigma, expected, rtol=1e-8, atol=1e-8 * expected.max())
101+
102+
103+def test_geometry_helpers():
104+ pos, tri, rim, trip = bn.hexdisk(0.15, 0.01)
105+ assert pos.shape == (823, 3)
106+ E = bn.edges(tri)
107+ S = bn.springs(pos, E, 1e4, 10.0)
108+ M = bn.Model(pos=pos, mass=1e-3, pinned=rim, springs=S)
109+ prep = bn.prepare(bn.check(M))
110+ assert prep["residual_force"] < 1e-9
111+ q = bn.hinge_quads(tri)
112+ assert q.shape[1] == 4 and len(q) == len(E) - len(rim) # interior edges
113+ p2, cords, anchors = bn.anchor(pos, [0, 5], 500.0, 0.02)
114+ assert p2.shape[0] == pos.shape[0] + 8 and cords.shape == (8, 4)
115+
116+
117+def test_store_roundtrip(tmp_path):
118+ from beadnet.store import Store
119+ st = Store(str(tmp_path / "z"), "w")
120+ a = np.arange(7 * 10, dtype=np.float32).reshape(7, 10)
121+ st.write("a", a, chunks=(3, 4))
122+ assert np.array_equal(st.read("a"), a)
123+ assert np.array_equal(st.read("a", (2, slice(3, 9))), a[2, 3:9])
124+ assert np.array_equal(st.read("a", (slice(1, 6), slice(None))), a[1:6])
125+ zarr = pytest.importorskip("zarr")
126+ z = zarr.open(str(tmp_path / "z"), mode="r")
127+ assert np.array_equal(z["a"][:], a)
128+
129+
130+def test_run_store_and_model_roundtrip(tmp_path):
131+ M = string_model(record=("acceleration", "velocity", "displacement"), modes=True, duration=0.05)
132+ bn.decay(M, [(30, 1.0), (300, 0.3)])
133+ r = bn.run(M, str(tmp_path / "s"), progress=False)
134+ acc = np.stack([r.signal(b) for b in range(M.n)])
135+ assert np.allclose(acc.sum(axis=0), r.signal("sum"), rtol=1e-5, atol=1e-6 * np.abs(acc).max())
136+ assert np.allclose(r.signal([3, 4]), acc[3] + acc[4], rtol=1e-6)
137+ assert r.frames().shape == (r.meta["n_frames"], M.n, 3)
138+ assert r.mode_energy.shape == (r.meta["n_frames"], 15)
139+ M2 = r.model
140+ r2 = bn.run(M2, str(tmp_path / "s2"), progress=False)
141+ assert np.array_equal(r2.signal(4), r.signal(4))
142+ r.write_wav(str(tmp_path / "x.wav"), 4)
143+
144+
145+def _from_fixture(f):
146+ n = f["n"]
147+ M = bn.Model(pos=np.array(f["pos0"]).reshape(n, 3), mass=np.array(f["mass"]),
148+ pinned=np.flatnonzero(np.array(f["pinned"])), friction=np.array(f["friction"]))
149+ M.springs = np.array(f["springs"]).T.reshape(-1, 5)
150+ M.bends = np.array(f["bends"]).T.reshape(-1, 5)
151+ M.hinges = np.array(f["hinges"]).T.reshape(-1, 6)
152+ M.dashpots = np.array(f["dashpots"]).T.reshape(-1, 4)
153+ M.hits = [bn.Hit(beads=h["beads"], t=h["t"], velocity=None if h["duration"] > 0 else h["velocity"],
154+ force=h["force"] if h["duration"] > 0 else None, duration=h["duration"]) for h in f["hits"]]
155+ M.duration = f["duration"]
156+ M.sample_rate = f["sampleRate"]
157+ M.dt = f["dtGiven"]
158+ M.method = f["method"]
159+ M.record = ("acceleration", "velocity", "displacement")
160+ return M
161+
162+
163+with open(os.path.join(HERE, "fixtures", "ts_reference.json")) as _f:
164+ TS_REF = json.load(_f)
165+
166+
167+@pytest.mark.parametrize("name", sorted(TS_REF))
168+def test_matches_typescript_solver(name, tmp_path):
169+ """Same model, same step: the per-bead signals agree with the TypeScript solver's listener."""
170+ f = TS_REF[name]
171+ M = _from_fixture(f)
172+ r = bn.run(M, str(tmp_path / name), progress=False)
173+ assert r.meta["dt"] == pytest.approx(f["dt"], rel=1e-12)
174+ for q in ("acceleration", "velocity", "displacement"):
175+ ref = np.array(f["audio"][q])
176+ got = r.signal(f["listen"], q)
177+ err = np.max(np.abs(got - ref)) / np.max(np.abs(ref))
178+ assert err < 1e-5, (q, err)
179+
180+
181+def test_blocks_give_the_same_signals(tmp_path):
182+ """Several blocks (the last one partial) record the same signals as one block."""
183+ M = string_model(duration=0.05)
184+ bn.decay(M, [(30, 1.0), (300, 0.3)])
185+ r1 = bn.run(M, str(tmp_path / "one"), progress=False)
186+ r2 = bn.run(M, str(tmp_path / "many"), progress=False, block=1000)
187+ for q in ("acceleration", "displacement"):
188+ assert np.array_equal(r1.signal(5, q), r2.signal(5, q))
189+ assert np.array_equal(r1.signal("sum", q), r2.signal("sum", q))
190+ assert np.array_equal(r1.frames(), r2.frames())
↑↓ move↵openescclose